当我在谷歌上搜索这个问题时,我只得到了关于如何保护敏感数据、如何加密交换以及在 Linux 系统中保留“正常”交换有多“危险”的各种信息。
但是我找不到任何软件、方法或“如何”来真正从交换分区获取(读取)任何数据。
所以我的问题是,作为生活在西欧的“普通”公民,是否真的有必要清除或加密我电脑上的交换数据?在有人回答“是”之前,能否举个例子说明如何测试并泄露我自己的交换数据,以便我真正看到尽管我的家已加密,但哪些类型的数据仍未受到保护?
答案1
作为居住在西欧的“普通”公民,我是否真的有必要擦除或加密计算机上的交换数据?
这是个人判断,取决于您对数据隐私的重视程度,以及您希望在数据落入攻击者手中时保护其不被泄露的程度。假设您有一台笔记本电脑,有一天它被盗了 - 小偷试图窃取密码、加密密钥或其他私人数据的可能性有多大,您会在意吗?很多人不在乎,但有些人在意。不可否认,大多数小偷只是为了立即获得经济利益而出售笔记本电脑,但在某些情况下,攻击者可能会进一步尝试访问数据本身。
在有人回答“是”之前,能否举个例子说明如何测试并泄露我自己的交换数据,以便我真正看到尽管我的家是加密的,但哪些类型的数据是未受保护的?
任何进程的内存都有可能被交换到交换空间。内存泄漏可能很危险 - 最明显的例子就是 Heartbleed - 请参阅我如何利用 Heartbleed 窃取网站的私钥。Heartbleed 暴露的内存只属于一个进程,而交换空间可能暴露的内存属于每个进程。想象一下,一个包含私钥或密码列表(例如 Web 浏览器)的进程被换出 - 这些项目将以纯文本形式出现在交换空间中。提取它们就是在内存中筛选特定模式的数据 - 它可能是可以通过看到的纯文本 ASCII 数据strings
,或者它可能更复杂,就像在 Heartbleed 中一样(其中测试是某些连续字节是否是公钥加密密钥的除数)。如果您有一个加密的 /home 分区,那么显然要寻找的是形成加密密钥的数据块,该密钥将解锁用户的数据。
一个工作示例:
创建
bash -c 'echo SECRET=PASSWORD > /dev/null; sleep 1000'
一个 bash 进程,并在其堆栈上包含一些秘密数据增加
sysctl vm.swappiness=100
swappiness(不是必需的,但可以使示例更容易)运行
top -c
,按 f,启用 SWAP 列,按 q 返回顶部进程视图,向下滚动直到看到bash -c
进程在另一个终端中,保存 Chimnay Kanchi 的程序Linux:如何增加系统内存的负载?,编译
usemem.c
它gcc -o usemem usemem.c
,然后usemem &
在终端中重复运行。这将一次占用 512MB 内存块。(导致内存被换出的原因并不重要,可能是正常的系统使用、失控的进程或蓄意攻击,最终结果都是一样的)观察顶部,等待
bash -c
交换(SWAP 列值 > 0)现在运行,
strings /dev/sdaX | grep SECRET
其中 X 是您的交换分区恭喜 - 您刚刚从交换分区中提取了“秘密”数据。您将看到 SECRET 文本的多个副本,后面跟着“密码”,这些副本包括从父 bash 进程、top 进程和“bash -c”进程泄露的完整命令行。不包含完整命令行的行已从“bash -c”进程泄露。
为了证明机密信息从进程内存中泄露,而不仅仅是从命令行中泄露,请将以下行添加
unsigned char secret[] = "SECRET=XXXX";
到 usemem.c(就在该unsigned long mem;
行下方)。重新编译并反复运行usemem &
。strings /dev/sdaX | grep SECRET
这一次你会看到“XXXX”机密信息被泄露。
答案2
这个问题引发了我们对软件开发之间问题的讨论,例如软件如何将敏感数据保存在内存中以及数据加密。
因此,首先你应该阅读一些有关实用软件开发和数据加密的文章。
开始阅读这篇文章: http://www.ibm.com/developerworks/library/s-data.html?ns-311
希望能帮助到你。