密码擦除/替换后是否可以检索基于闪存的加密磁盘内容(SSD、手机、U 盘……)?

信息安全 磁盘加密 取证 闪存
2021-09-04 01:53:59

在这个网站上多次提到过这样的断言:

全盘加密的一个好处是它可以非常快速地擦除闪存存储。[...]

要擦除整个驱动器,您所要做的就是擦除存储 K 加密的位置(仅一个块)。一旦该块消失,就无法解密驱动器上的数据(因为无法恢复 K),因此整个驱动器与擦除一样好。

但是,我也看到很多由于磨损均衡,覆盖基于闪存的磁盘上的数据是不可靠的:根据我的理解,如果我在闪存上方应用程序可能只是选择另一个区域并将覆盖数据放在那里,离开密钥块 K 仍然存在并且可以在芯片中读取(并且互联网上充斥着各种便宜且相对简单的直接访问芯片内容的方法,这里是随机的,甚至不需要拆焊它们)。

如果使用糟糕的密码来保护磁盘内容(通过将旨在快速键入的解锁密码和加密密码结合在一起,Android 似乎真的试图强制执行这种弱点),这是否意味着整个即使该块已被“擦除”,仍然可以检索磁盘内容?

作为奖励,如果我将弱密码更改为强密码,理论上密钥块将被一个新块“覆盖”,其中数据加密密钥将受到我新的更强密码的保护。

但是,具有相同加密密钥且受先前较弱密码保护的旧块是否仍有机会在芯片内容中存在并在不确定的时间内可读,从而允许攻击者完全取消密码更改的好处?

3个回答

确实有可能无法正确擦除包含密钥的块。这就是 LUKS 使用 AFsplit 将密钥存储在磁盘上的原因。

这个想法本质上是将通常存储在单个磁盘块上的密钥扩展为需要更多的格式,确保丢失这些块中的一个会导致密钥丢失。因此,当擦除密钥时,LUKS 只需要能够覆盖其中一个块。

块的数量是可配置的,只要它足够大,就不太可能无法擦除所有块。

您可以在磁盘格式规范的 LUKS 中阅读有关 AFsplit 的更多信息,并查看示例 python 实现(链接自crypto.stackexchange 问题)。

您的意思是,当您覆盖或删除闪存驱动器上的数据时,该闪存驱动器中的微控制器不会立即删除或覆盖该块,而是将它们放在“未来删除列表”中以提高性能. 没错,但也请阅读:delete-in-future-list,即“未来”是微控制器没有其他操作可做的时候。一旦它无事可做,它将完全删除该列表。因此,在删除/覆盖后让您的闪存驱动器停留一段时间。

而且,密码不会只是在那个块中说“可读”。我非常怀疑它是以纯文本格式保存的。

如果使用错误的密码来保护磁盘内容(例如手机上的 4 PIN 码......),这是否意味着即使该块已被“擦除”,仍然可以检索整个磁盘内容?

我猜你的意思是即使删除了包含密码的块,仍然有人能够暴力破解密码?我猜不,因为它在恕我直言,与数据库中的相同。如果数据库中没有散列密码,则网站无法查看给定密码的散列是否与数据库中的散列密码匹配。

暴力破解就是猜测正确的密钥以匹配散列,没有散列这是不可能的。

但是,具有相同加密密钥且受先前较弱密码保护的旧块是否仍有机会在芯片内容中存在并在不确定的时间内可读,从而允许攻击者完全取消密码更改的好处?

旧密码块是临时放置在另一个块上的。这并不意味着加密软件使用该块。如果它不使用该“新”块进行比较,则旧密码将不再有效。

但是,提到破解全盘加密的方法,就在今天发现了一个可以做到这一点的Android漏洞:Extracting Qualcomm's KeyMaster Keys - Breaking Android Full Disk Encryption

要擦除整个驱动器,您所要做的就是擦除存储 K 加密的位置

该陈述在其理论形式下是正确的。如果您可以保证您可以擦除密钥,并且没有人访问过该块,那么您已经擦除了磁盘。

我的意思是,如果您具有低级磁盘访问权限并且在某处复制了正确的块,那么您可以花时间破解密钥,尤其是在密码较弱的情况下。

记起

现代磁盘加密通过使用密钥的组合来工作,该密钥具有固定长度,受用户机密(例如密码)保护。所以没有密码密钥是没有用的,没有密钥密码是没有用的。

答案是

安全地擦除整个驱动器,必须满足两个条件:

  • 除加密硬件外,任何实体都不得读取包含密钥的块(可能对支持硬件 FDE 的 SSD 有效)
  • 包含密钥的块必须被物理覆盖,而不是逻辑覆盖

第二个条件因控制器实现而异。大多数 SSD 不适合存储此类敏感数据,因为当您想要覆盖某个扇区时,该驱动器无法保证擦除扇区。

第一个更难实现,因为它证明唯一有效的 FDE 是在硬件级别制造的密钥永远不会离开设备的 FDE。通过树叶,我包括去 RAM 内存。例如,BitLocker 有一个广为人知的热重启攻击漏洞。