阅读:3120回复:0
《iOS应用安全攻防实战》第六章:无法销毁的文件
将一个普通的文件系统想象为一个大的笔记本。当一个文件被删除时,许多人以为这一页是被用“三福”牌记号笔完全涂黑了,就像关于51 区的机密文档那样。但事实上,在这个操作背后所发生的一切更像是用一支很细的红色笔在这一页上面画了一个巨大的X。文件被标记为已删除,但内容实际上还存在于笔记本上。所有想知道其看起来是什么样的人还是可以轻松地读出它的内容,而不管有一个红色的X 将它标记为已删除。这就是庭审律师(不论是美剧Boston Legal 中的还是真实生活中的律师)如何从嫌疑犯的电脑里还原出大量已删除的文件。苹果公司也知道这一点,因此,在iOS 4 中开始使用一些特殊的精心设计的文件系统加密方法来防止已删除文件被还原出来。然而,这种技巧并不完美,有时候文件依然可能被盗。
在前面我们已经看到,iOS 4 和iOS 5 使用了加密的文件系统,在这个文件系统中的所有文件都使用了一个唯一的密钥进行加密。在文件系统中,这个密钥被保存在名为cprotect的属性中,并且它实际上也是被所谓的AES-Wrap 方式加密的,加密它的密钥或者是存放在NAND 可擦除区域的Dkey,或者是保护等级密钥中的一个。当删除一个文件时,该文件的cprotect 属性会随之被丢掉。而拿不到这个属性中的加密密钥,文件就无法被揭秘,那么将其还原出来也就没有意义。 想象一下,无论你走到哪里都有一个秘书跟着,我们把这个秘书叫作Iris。现在想象一下Iris会帮你记住过去一两个月所做的每一件事情,记住的方法则是记录下所有你说过的话,当然,这么做是你同意的。好,这么做确实很有帮助,因为你有时候容易忘事,尤其是你喝了太多的咖啡并且经常性地情绪崩溃的情况下。你可以告诉Iris在哪一天要和哪一个特定的客户说些什么,这样她会在到时候复述给你听。 但是Iris(除了在你晨浴时总是带来尴尬以外)有一个缺点,因为她会记住你所说过的所有内容,所以一不留意就会就记录下你要交给客户用来访问你网站上一些文件的密码。你采用了非常严格的安全机制来保证你的密码不会被泄露。但是Iris始终和你在一起,如果有人能够拿下她,那就能够拿到你的客户的所有文件。 苹果公司的HFS日志就是iOS 的电子版Iris。HSF日志记录了所有文件系统的写入、更改和删除操作,这样文件系统不会在设备毁坏或者电源无效后丢失数据。HFS日志使用EMF 密钥加密,前面我们已经了解到,该密钥存储在NAND的可擦除存储区域中。EMF密钥并没有使用需要的密码来加密,所以任何人知道该怎么做就都能够轻易解密HFS日志,而不需要用户的密码。在第5 章中介绍的Sogeti暴力破解工具除了可以从设备中抽取所有其他的加密密钥外,还具有这个额外的功能。当一个文件的加密密钥被写入磁盘的cprotect属性中时,HFS 日志会自动将它的一份副本记录到磁盘中。 如果一个文件已经被删除,写入到磁盘的加密密钥会被抹掉,但是写入到HFS日志中的那份副本并不会。这可能是因为HFS日志功能早于HFS+加密卷出现,因此,其运行是独立于加密功能以及文件系统的其他附加功能的。除非苹果公司从日志中定位并且清除一个已删除文件的加密密钥,否则可以窃取到这个密钥副本并还原出原始文件。 ◆0 刮取HFS 日志 在第5章中已经介绍了Sogeti 的免费数据保护工具套件,它包含一组用于解密iOS 文件和钥匙链数据的工具。这个套件中的另一个名为emf_undelete的工具用于刮取出HFS 日志中包含了文件加密密钥的cprotect属性。这个工具会尝试着使用这些密钥来解密磁盘中残留的文件。就像Iris一样,HFS日志只会存储有限的一段时间里的信息,直到这些信息成为更旧的数据被轮换出去。这段时间的长度取决于设备的活跃程度,可能短到只有一天,也可能长达数周。设备使用得越频繁,HFS 日志轮换出老旧数据就越快。 为了获得日志的内容,我们进入Sogeti工具集的python_scripts目录下,执行其中的emf_undelete.py脚本,并输入用RawTheft 载荷获取到的原始磁盘镜像。此外,还需要用第4 章中的KeyTheft 载荷获取一份设备的加密密钥。 $ python emf_undelete.py rdisk0s1s2.dmg Keybag: SIGN check OK Keybag unlocked with passcode key cprotect version : 2 Found deleted file record 109296 lto2.dat Found deleted file record 111607 NetworkInterfaces.plist Found deleted file record 111939 com.apple.AutoWake.plist Found deleted file record 111571 com.apple.PowerManagement.plist Found deleted file record 109294 com.apple.network.identification.plist Found deleted file record 111874 com.apple.wifi.plist Found deleted file record 111871 preferences.plist ... 当脚本运行时,会去扫描日志中已删除的文件和加密密钥,然后,它会执行第二遍扫描,将数据抽取到两个名为junk 和undelete 的目录中。其中,undelete 目录包含脚本可以验证已经成功解密的文件;junk 目录则包含它无法验证的那些,但也许仍然是有效的。 这个EMF 反删除脚本中预先写入了一些基本的文件头部(称为magic 值),它使用这些头部来判断文件是否有效。检查一下hfs/journal.py 文件的isDecryptedCorrectly 函数,就会看到它们。 magics=["SQLite", "bplist", " |
|