# 《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+加密卷出现,因此,其运行是独立于加密功能以及文件系统的其他附加功能的。除非苹果公司从日志中定位并且清除一个已删除文件的加密密钥,否则可以窃取到这个密钥副本并还原出原始文件。
0x00 刮取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”, “













请登录后查看评论内容