如何才能真正从交换分区获取敏感信息?

如何才能真正从交换分区获取敏感信息?

当我在谷歌上搜索这个问题时,我只得到了关于如何保护敏感数据、如何加密交换以及在 Linux 系统中保留“正常”交换有多“危险”的各种信息。

但是我找不到任何软件、方法或“如何”来真正从交换分区获取(读取)任何数据。

所以我的问题是,作为生活在西欧的“普通”公民,是否真的有必要清除或加密我电脑上的交换数据?在有人回答“是”之前,能否举个例子说明如何测试并泄露我自己的交换数据,以便我真正看到尽管我的家已加密,但哪些类型的数据仍未受到保护?

答案1

作为居住在西欧的“普通”公民,我是否真的有必要擦除或加密计算机上的交换数据?

这是个人判断,取决于您对数据隐私的重视程度,以及您希望在数据落入攻击者手中时保护其不被泄露的程度。假设您有一台笔记本电脑,有一天它被盗了 - 小偷试图窃取密码、加密密钥或其他私人数据的可能性有多大,您会在意吗?很多人不在乎,但有些人在意。不可否认,大多数小偷只是为了立即获得经济利益而出售笔记本电脑,但在某些情况下,攻击者可能会进一步尝试访问数据本身。

在有人回答“是”之前,能否举个例子说明如何测试并泄露我自己的交换数据,以便我真正看到尽管我的家是加密的,但哪些类型的数据是未受保护的?

任何进程的内存都有可能被交换到交换空间。内存泄漏可能很危险 - 最明显的例子就是 Heartbleed - 请参阅我如何利用 Heartbleed 窃取网站的私钥。Heartbleed 暴露的内存只属于一个进程,而交换空间可能暴露的内存属于每个进程。想象一下,一个包含私钥或密码列表(例如 Web 浏览器)的进程被换出 - 这些项目将以纯文本形式出现在交换空间中。提取它们就是在内存中筛选特定模式的数据 - 它可能是可以通过看到的纯文本 ASCII 数据strings,或者它可能更复杂,就像在 Heartbleed 中一样(其中测试是某些连续字节是否是公钥加密密钥的除数)。如果您有一个加密的 /home 分区,那么显然要寻找的是形成加密密钥的数据块,该密钥将解锁用户的数据。

一个工作示例:

  • 创建bash -c 'echo SECRET=PASSWORD > /dev/null; sleep 1000'一个 bash 进程,并在其堆栈上包含一些秘密数据

  • 增加sysctl vm.swappiness=100swappiness(不是必需的,但可以使示例更容易)

  • 运行top -c,按 f,启用 SWAP 列,按 q 返回顶部进程视图,向下滚动直到看到bash -c进程

  • 在另一个终端中,保存 Chimnay Kanchi 的程序Linux:如何增加系统内存的负载?,编译usemem.cgcc -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

希望能帮助到你。

相关内容