《iOS取证实战:调查、分析与移动安全》一3.5 存储器类型-阿里云开发者社区

开发者社区> 华章出版社> 正文

《iOS取证实战:调查、分析与移动安全》一3.5 存储器类型

简介: 本节书摘来自华章出版社《iOS取证实战:调查、分析与移动安全》一书中的第3章,第3.6节,作者(美)Andrew Hoog Katie Strzempka,更多章节内容可以访问云栖社区“华章计算机”公众号查看

3.5 存储器类型

iPhone设备有两种主要的存储器类型,易失性存储器(RAM)和非易失性存储器(NAND闪存)。这两种存储器各自提供了对设备数据的不同处理方法。

3.5.1 RAM

RAM用于系统加载、执行,以及处理操作系统、应用程序和数据的关键部分,它的数据在重启后不保存。类似于传统计算机,RAM可包含应用程序处理数据的重要信息。例如:
密码
加密密钥
用户名
应用程序数据
系统进程和服务数据
在审查调查中,获取设备RAM中存储的数据的能力是非常重要的。然而,更重要的一点是,我们必须在设备关闭或重启前去获取这些信息。尽管从标准Windows硬盘驱动器、Linux工作站甚至Android设备上都可能进行内存检查,但是目前还没有方法从一台开机状态的iPhone设备上恢复内存数据。直到2011年初,通过恢复位于/private/var/vm/sleepimage目录的“sleepimage”文件,Mac OS X才在某种程度上能够执行内存数据提取。这个文件的用途是存储系统休眠时Mac内存中的数据。当计算机被“唤醒”时,包含在sleepimage文件中的信息会重新发布到内存中,这样Mac能够回到休眠前的初始状态(Sleepimage,2010)。
2011年初,Mac Memory Reader发布。这是一个实用的命令行工具,它能够执行Mac OS设备的内存信息转储,并将结果输出到外部设备上(Valenzuela, 2011)。不过,Mac Memory Reader还不能应用在iOS设备上。

3.5.2 NAND闪存

与RAM不同,NAND闪存是非易失性的,因此在设备掉电或者重启后数据依然存在。NAND闪存不仅用来存储系统文件,也用来存储用户数据中的重要部分。
NAND闪存存储器有一些特点,这和近代硬盘驱动器中的磁性介质有很大不同。这些特点使得NAND闪存成为移动设备理想的存储器。在带给程序员许多挑战的同时,这些特点也给取证分析师带来许多机会。
首先,NAND闪存没有机械移动部件,而传统磁性介质硬盘驱动器上有旋转磁盘和磁头臂。这一特性提高了存储器的耐用性,减小了设备的尺寸,降低了设备的电量消耗。存储器由一个或多个芯片组成,这种芯片通常集成了NAND闪存和RAM,并直接集成到设备的电路板上。
其次,NAND闪存有非常高的密度,对制造商来讲是有成本的。当然,这种高存储密度使得NAND闪存很受制造商欢迎。但有一个不利因素是,受制造商制造过程和工艺的影响,NAND闪存通常会产生一些坏块。制造商在生产过程中通常会检测存储器件,并在NAND闪存中的一个特殊结构中标记坏块,这在制造商的文档中有相关描述。直接和NAND闪存交互的软件可以读取制造商的坏块标记,通常是一个坏块表,以此逻辑跟踪系统中的坏块,并在操作中移除它们。这极大地提高了坏块检测和管理的效率。因此,尽管NAND闪存物理上比旋转磁盘更加耐用,但是它的错误率更高,而且这种错误必须在开发和使用中予以记录。
NAND闪存的另一个重要的限制是其非常有限的写入/擦除使用寿命,在使用寿命结束之后块将不能存储数据。使用寿命根据设备而不同,在很大程度上受到每个NAND闪存单元中存储数据的数目影响。NAND闪存单元是存储比特1或0的中央构建基块。如果一个单元仅存储一个比特(single-level cell,SLC),那么对于一年数据保留(1-year data retension)来讲,NAND闪存支持大约100 000次写入/擦除周期。然而,NAND闪存很少使用SLC,因为制造商(和消费者)需要设备在相同大小的存储器件上进行更多的数据存储,或者让存储器件更小。NAND闪存从技术上已经迁移到多层单元(MLC),这样一个单元能够存储2比特、3比特甚至更多比特。但是,这种技术不仅使制造过程更加复杂,减慢了写入/擦除周期,也极大降低了设备的耐久性。一个典型的每单元存储2比特的MLC NAND 闪存在耐久性上减少了10倍(用一年数据保留来衡量),写入/擦除周期大约为10 000次。随着每单元比特密度的增加,耐久性持续降低,很明显,因为必须通过控制设备来进行寻址操作。
不像RAM和NOR闪存(NOR闪存也是闪存存储器件,其在系统中的典型应用是用于计算机的基本输入/输出系统,即BIOS),NAND闪存不能随机访问。相反,需要通过分配单元(称为“页”)来达到数据访问的目的。一个典型的页大小在512~2048字节,但是通常随着整个NAND闪存容量的增加,页大小也在增加。例如,一个32GB 的iPhone 4设备,每个页有8192字节。尽管不能提供像RAM那样快速随机访问,但是由于NAND 闪存不需要传统磁盘驱动器的机械磁盘和磁头臂移动,它的访问速度也是相当快的。将页组织起来形成更大的逻辑单元,称为块。典型的块大小比传统的512GB硬盘驱动器的扇区要大很多。当要向块写入时,块内的页是连续写入的。
在iPhone文件系统中,有一个称为ADDataStore.sqlitedb的文件,这个文件包含了设备中有关NAND闪存的特定细节。在早期模型中,这个数据库是空的。然而,填充之后的“标量”表将包含类似下面的信息:

image

NAND闪存的重要特征是读取和写入的有效操作:
读取(页)
写入(页)
擦除(块)
尽管可以读取和写入单独的页,但擦除却是运行在块级别的。擦除块时,整个的块写入全1(或者是十六进制的0xFF)。NAND闪存中擦除操作唯一的机制就是将0改为1,这点值得讨论。在传统硬盘驱动器中,如果一个值从0变为1(或者从1变成0),程序仅会搜索硬盘驱动器上的这个值,并利用适当的电压改变并存储新的值。然而,NAND 闪存的基本架构仅提供了从0变为1的机制,这种机制利用块级别(而非单个页级别)的擦除功能来实现。因此,一页仅能写入一次,如果需要改变页的值,必须擦除整个的块然后重新写入。
这里选用单字节的例子来简单说明:有一个字节,它的十进制值是179,想加上39,让其和变为218,不熟悉从十进制、十六进制及二进制之间数字转换的读者,可以使用Windows、Mac OS X、Ubuntu Linux中内置的计算器程序,这些程序都提供了程序员模式以执行这种转换。我们把以上数字在数字系统之间的转换列在表3-2中。
image

数值179的二进制表示包含3个0,需要将其中的2个0变为1才能表示新的数值218。但是,NAND闪存不擦除整个块就不能做这种修改。因此,如果不进行擦除就试图改变这个字节,那么得到的结果会是146,而不是218。下面是这个变化过程:
image

如果字节不是全1(0xFF),写周期内唯一能成功的部分是依然保持是1的比特位或者是改变为0的比特位。任何时候写入功能碰到0并且要求将这个0变为1,都将会失败,只会简单地保持原值。结果得到的字节是十六进制0x92(或十进制146),很明显这不是我们想要的。写入功能的另一种描述是:它仅能在需要时将1改变为0,这等同于两个值的逻辑与。
总之,页仅能写入一次,如果需要重新写入,就必须首先擦除整个块。
人们可以说,NAND闪存强加给开发者各种限制和局限,在这种限制中有效工作的文件系统必须是闪存感知的。已部署的两种重要技术是ECC(纠错码)和磨损均衡。这两种技术对取证和数据恢复有重要的意义。
首先,ECC可以使用算法来检测读取和写入操作时的数据错误,并立即更正这些错误。因为NAND闪存会随着使用时间而退化,所以当页或者块出现错误时,系统必须能够检测到并恢复存储在那里的数据。如果错误或操作失败次数过多(一般为3次失败操作),就会将这个页或者块标记为“坏的”并把它添加到坏块表中。
有效管理iPhone上NAND 闪存的第二个重要的算法是磨损均衡代码。磨损均衡技术将要写入的数据散布在整个NAND 闪存上,以避免过度使用单一区域,否则将使得某些块磨损得更快。建立HFS Plus(增强型分层文件系统)的目的之一就是减少对NAND的写入和擦除操作,以使得数据能尽可能久地保存。磨损均衡技术使得许多信息能够恢复。旧的数据备份并没有被删除,而只是被标记为“未分配的”。因此,即使在数天、数周或数月之前删除的数据,我们也可以通过分析iPhone敏感数据的隐藏副本来获取相关信息。在第6章将详细讨论相关的分析方法。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:

华章出版社

官方博客
官网链接