敏感数据在内存中

22

我正在开发一个Java密码管理器,目前我已经解密了所有用户的数据,这些数据在内存中一直保留,并以明文形式存储为字符串以供UI显示等。

这种方式是否存在安全风险?我特别担心有人以某种方式“倾轧”或读取计算机的内存,并找到用户的裸露数据。

我考虑过将所有敏感数据(包括密码)加密,并仅在需要时解密每个部分,然后销毁该数据……但我不想基于一些迷信而修改大量代码。

4个回答

27
如果你的对手有能力在目标机器上运行任意代码(需要调试权限以转储进程映像),那么你就完蛋了。
如果你的对手有能力准确地远程读取内存(即TEMPEST),那么你就完蛋了。
保护传输和存储中的数据(在线路和磁盘上),但不用担心内存中的数据。
注:好吧,确实有一类程序需要担心。99.99%的应用程序不需要,我敢打赌你的应用程序也不需要。

因此,如果我进行更改并保持所有数据加密,那么它只会使本来就非常困难/不太可能的事情变得更加困难。我可以想象找到包含AES密钥的byte[]比找到明文要困难得多。 - defectivehalt
3
在Java中并不是真正的这样,它变成了在堆中搜索给定大小的byte[]对象(而不是String对象)。但是,你担心的那种攻击者非常罕见,你试图防御他们会浪费时间(可能也会失败)。 - Kevin Montrose
完全同意你的看法,Kevin。 - Tower
遗憾的是,某些操作系统会向磁盘上的任何文件写入“文件提示”,用旧的内存内容填充块。这个问题在取证计算领域非常普遍,代表了难以堵住的持续安全漏洞。 - Tim Williscroft
3
凯文的代码是那种会被心脏出血漏洞攻击的类型。 - mheyman
您不一定需要调试权限才能从内存中提取密钥/密码。除非您执行类似于“mlock”的操作,否则RAM中的敏感数据可能会被分页到磁盘上。根据交换文件上设置的权限,其他进程可以读取这些文件。它们也可能会在全盘备份和磁盘克隆中无意中被归档,这将使错误永久存在。 - Alexander

6
值得注意的是,操作系统可能决定将内存换出到磁盘上,在那里它可能会停留相当长的时间。当然,读取交换文件需要强大的特权,但谁知道呢?用户的笔记本电脑可能会被盗取...

5

是的,特别是因为你可以轻松地对应用进行调试。大多数处理加密和不安全数据的代码使用字符数组而不是字符串。通过使用字符数组,您可以覆盖带有敏感信息的内存,并限制敏感数据的生命周期。


4
如果您能够调试一个程序,就可以获取密文和密钥并生成明文。调试权限几乎不可能进行有效的防御。 - Kevin Montrose
是的,你说得有道理。但这确实使文本搜索变得有点棘手。 - Alexander Torstling
@Xepoch:嗯,如果攻击者知道受害者的root密码,那不是我的错。 - defectivehalt
@KavonFarvardin,我最近没有尝试过这个,但我相信/proc/PID/mem也可以作为用户拥有的进程。 - Jé Queue

5

理论上来说,你无法完全保护内存中的任何内容。某些组织甚至可以在计算机关闭4小时后冷冻内存芯片并读取其内容。即使不采取这种极端手段,只要在正确的时间使用调试器和断点就可以轻松实现。

但实际上,只要不必要,就不要将明文保存在内存中。即使攻击者再怎么努力,也可能会失败。


你对“4小时”的评论是错误的,只有当你用氮或其他方式冷冻RAM时才可能实现。 - Yaroslav Nikitenko
我从来没有提到过室温 :) 这是由小组管理的,因此该声明在技术上是正确的。 - Seva Alekseyev
你的陈述在这种情况下是误导性的,因为原帖作者没有提到任何关于零下温度的事情。不过你可以编辑你的帖子来指定这些条件。 - Yaroslav Nikitenko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接