固态硬盘非常奇怪,因为它们在编写数据的方式上很奇怪,甚至在删除信息的方式上更奇怪。在使用条带化磁体技术进行信息记录的硬盘中,人们在删除文件后,里面的内容其实仍然是存在的,直到被覆盖,但固态硬盘却不是这样。它们在处理删除的数据方面和过去的技术有所不同,只要是进行了删除操作,被删除的内容就不会再被恢复。只需开启固态硬盘,它就会启动后台垃圾收集,即使你写入只读隔离程序,它也会删除开启具有trim功能的数据块。

Trim的作用

在原理对的机械硬盘上,写入数据时,Windows会通知硬盘先将以前的删除,再将新的数据写入到磁盘中。而在删除数据时,Windows只会在此处做个标记,说明这里应该是没有东西了,等到真正要写入数据时再来真正删除,并且做标记这个动作会保留在磁盘缓存中,等到磁盘空闲时再执行。这样一来,磁盘需要更多的时间来执行以上操作,速度当然会慢下来。而当Windows识别到固态硬盘并确认固态硬盘支持Trim后,在删除数据时,会不向硬盘通知删除指令,只使用Volume Bitmap来记住这里的数据已经删除。Volume Bitmap只是一个磁盘快照,其建立速度比直接读写硬盘去标记删除区域要快得多。这一步就已经省下一大笔时间了。然后再是写入数据的时候,由于NAND闪存保存数据是纯粹的数字形式,因此可以直接根据Volume Bitmap的情况,向快照中已删除的区域写入新的数据,而不用花时间去删除原本的数据。注意:如果固态硬盘组建RAID0阵列0后,将失去Trim功能。

对固态硬盘进行镜像后,即使在镜像时实际数据仍然存在,你也将无法在删除区域找到任何内容-。需要注意的是,你的固态硬盘的存储容量比说明书上写的要大,因为物理存储容量的5%到15%专用于不可寻址池,从固态硬盘中删除的任何数据,在被系统经过Trim处理后都可以直接进入该池,而不需要访问甚至寻址这些块。

不过事情总不是绝对的,现在你可以在固态硬盘上访问已删除的数据,不过方法也是唯一的,就是取下芯片,并手动进行分析,这个进程非常耗时,复杂且使用的设备相当昂贵。为此我们询问了数据恢复的一些专家,他们告诉我们他们大约可以在两周内完成对一个四芯片固态硬盘的分析,而对最近的十芯片固态硬盘,他们也毫无办法。

最近的一项发现指出,Windows内置的BitLocker保护倾向于将加密数据的任务委托给固态硬盘控制器,而不是在使用CPU的计算机上进行加密。正如研究中所发现的那样,许多消费级固态硬盘都可以轻松地让加密密钥不受固态硬盘上存储芯片的保护。

在本文中,我们将讨论固态硬盘取证的最新发展技术,即在开启TRIM功能后,如何防止后台数据被删除,并提供对磁盘的整个存储容量(包括不可寻址的区域)的访问。该方法采用所谓的工厂访问模式( factory access mode)。但是,在我们讨论工厂访问模式之前,让我们首先看一下固态硬盘是如何存储信息的,以及为什么这些信息很容易被删除,且很难恢复。

固态硬盘如何存储信息

与使用或多或少顺序写入(bar fragmentation 和坏扇区重新映射)的磁性硬盘驱动器不同,固态硬盘驱动器完全抛弃了线性写入方式,而是将信息被分解成同时写入不同NAND芯片的许多小的数据块。这种并行写入就是固态硬盘快速运行的原因,在某种程度上,我们就是谈论安装在单个PCB上的NAND芯片构建的raid0 (stripe)类阵列。

一个固态硬盘及时只拥有一块NAND芯片的固态硬盘驱动器,那它也几乎不会以线性方式写入信息。存储器芯片中的每个物理块被可以被动态分配一个逻辑地址,以帮助固态硬盘控制器进行磨损均衡。因此,读取NAND芯片的内容将返回一个拼图,这就意味着你所想看到的内容是以一种随机的方式混合在多个数据块中。

注:磨损均衡(wear leveling)这项技术在flash设备的微控制器上使用了一种算法,来跟踪flash内存上存储空间的使用情况。这使得数据每次能够重写到内存中的不同地方,而不是一直写入到内存中的同一个位置。

固态硬盘以及大多数其他类型的固态介质,都必须转换NAND地址,其目的就是映射出坏的数据块并提供耗损均衡。基本上所有的NAND的制造商都将其固态硬盘驱动器的写入周期固定在大约1000到1500之间。诸如(Write Amplification,写入放大)等因素都会对固态硬盘寿命产生负面影响,而智能SLC缓存算法会减少存储单元的物理磨损,即使写入操作的数量大于没有缓存的数量,也会如此。我们将在下一篇文章中介绍影响固态硬盘寿命的许多其他因素。

注:WA是闪存及SSD相关的一个极为重要的属性。由于闪存必须先擦除才能再写入的特性,在执行这些操作时,数据都会被移动超过1次。这些重复的操作不单会增加写入的数据量,还会减少闪存的寿命,更吃光闪存的可用带宽而间接影响随机写入性能。WA这个术语在2008年被Intel公司和SiliconSystems公司(于2009 年被西部数据收购)第一次提出并在公开稿件里使用。

真正重要的是,如果没有固态硬盘控制器的帮助,即便只恢复一个文件都可能会非常困难。为此专家首先要做的就是必须重建转换表(translation table ),以确定哪些NAND芯片以及它们在哪些确切地址保存信息。不同的固态硬盘控制器的转换表所采用的格式都是不同的,固态硬盘驱动器包含的NAND芯片越多,重建转换表就越困难。

随着电子设备的成本逐年下降,存储容量超过1TB甚至2TB数据的固态硬盘驱动器现在可以被普通消费者使用了,而在三年前这种普及情况还是无法想象的。

为了以更低的价格生产具有更大容量的固态存储器,制造商必须将更多的存储单元挤压到相同或更小的空间上。这无比就会减小每个单元的尺寸,减少使用寿命。虽然基于SLC的NAND闪存可以在每个单元中保存一位信息,但MLC NAND( 全称为Multi-Level Cell,多层单元闪存,MLC通过使用大量的电压等级,每一个单元储存两位数据,数据密度比较高)却可以存储两位数据。如今的固态硬盘驱动器主要是TLC(每个单元三位数据),即便最便宜的驱动器可能每个单元包含四位(QLC NAND)。与低密度的NAND相比,每次迭代都会使NAND闪存的速度明显变慢,更重要的是,可靠性会降低。

可以看出,TLC存储单元是最慢和最不可靠的。为了让基于TLC的固态硬盘驱动器提高存储效率并提高使用寿命,许多制造商已经试着将部分存储分配为专用SLC缓存。用作SLC高速缓存的数据块,仅仅需要较小的单元来放置一位信息。它们磨损较少,而且它们的写入速度比TLC单元更快。控制器维护用作SLC缓存的数据块列表。如果我们试图通过直接访问芯片来读取这些块,同时期望获得三位数据,那么这些所谓的SLC单元将返回毫无意义的信息。

小结

闪存芯片根据内部架构分为SLC、MLC、TLC等,闪存颗粒是由多层闪存芯片构成的方形体。

闪存芯片颗粒直接影响着固态硬盘的存取速率、使用寿命、生产成本等。

· SLC,英文全称Single-Level Cell,1bit/cell,单层式存储,仅允许在一个内存元素中存储1个比特位的信息。

· MLC,英文全称Multi-Level Cell,2bit/cell,多层式存储,允许在一个内存元素中存储2个比特位的信息。

· TLC,英文全称Trinary-Level Cell,3bit/cell,三层式存储,允许在一个内存元素中存储3个比特位的信息。

由此得出,闪存颗粒面积相同时,存储量由小到大:SLC<MLC<TLC。

SLC、MLC、TLC闪存芯片颗粒的优缺点分析

· SLC,存取速率快,可擦写次数多(使用寿命长),但生产成本价格昂贵(至少为MLC的三倍)。

· MLC,存取速率较快,可擦写次数相对SLC少(使用寿命约为SLC的十分之一),价格一般。

· TLC,存取速率较慢,可擦写次数进一步减少(使用寿命约为SLC的二十分之一),价格相对便宜。

固态硬盘的加密方法

大多数固态硬盘驱动器都会提供一种或多种硬件加密方法,一些企业级固态硬盘甚至在用户不知情的情况下默认加密信息。在这种情况下,加密密钥是公开存储的,以便控制器可以从NAND芯片读取它以解密数据。如果用户加密这样的磁盘,则仅仅是对加密密钥的加密。

即使加密密钥存储不受保护,在没有固态硬盘控制器帮助的情况下,找到加密密钥也是非常困难的。

换句话说,我们需要固态硬盘控制器帮我们完成所有的相关工作。我们需要它来处理错误更正、地址转换和潜在的加密,然而,简单地将固态硬盘连接到闪存只读隔离保护器,然后打开电源并像以前一样对磁盘进行镜像,可能不是最好的方法。

固态硬盘是如何删除数据的?

我们认为NAND单元目前只支持有限数量的写入操作,这需要高级耗损均衡算法。但是,除了有限的使用寿命外,NAND单元还有另一个属性,即在写入新数据之前必须擦写非空单元。 由于NAND闪存提供快速读取,缓慢写入和低速擦写。因此,如果要重新编写已包含数据的存储单元,则必须首先擦写存储单元,然后才能接受新数据。虽然擦写NAND单元的操作速度非常慢,但擦写一个或两个单元却不是你想象的那么简单。因为,你将不得不处理页面和块。

那么什么是存储单元,为什么我们必须要用到页面和块?我们先来弄清楚这些术语吧。单元是用于存储信息的基本单元。根据闪存类型(SLC,MLC,TLC或QLC)和操作模式(例如MLC,TLC和QLC驱动器中的SLC缓存),单个单元可以记录一位数据(SLC),两位数据(MLC),三位数据(TLC)或四位数据(QLC)。例如,配备3D TLC NAND的Crucial MX550 固态硬盘可以在其每个单元中存储3位数据,除非其存储池的某些部分在SLC模式下作为动态写入被加速缓存运行。在SLC模式下写入TLC单元不仅速度更快,而且对存储单元的压力也明显减少,因此固态硬盘的整体寿命可以随着写入速度的提高而提高。

但这会带来了另一个问题,我们无法从从单个存储单元内读取数据或向单个单元写入数据。

曾经旋转存储(rotating storage)介质(如传统硬盘驱动器)提供的是512位扇区,作为可以读取或写入的最小数据单元。 FAT或NTFS等文件系统也可以在扇区中读写数据。自从固态存储被发明以来,这种情况已经发生了变化,NAND闪存不使用扇区,相反,它使用页面和块进行操作。页面是你可以从固态硬盘读取的最小数据,通常,固态硬盘驱动器可以在每个时钟周期读取一页。由于单个页面包含一定数量的物理字节(例如528,2112,4320,8640,9216,18592字节等),如果你只需要一个字节的数据,固态硬盘也会读取整个页面。

每个页面可以存储512,2048,4096,8192或16534字节的数据,可见页面可以存储的数据量与物理字节数不同。多余的字节是用于每页的标记和ECC校正码,如果我们将两个固态硬盘驱动器与包含8192字节数据的页面进行比较,我们可能会发现固态硬盘1每页使用8640个物理字节,而固态硬盘2每页有9216个物理字节。这两个固态硬盘之间的区别仅在于每个驱动器的ECC校正量不同。

既然现在已经搞清楚了存储单元和页面的作用,但我们还有一个疑问,为什么存储还需要数据块呢?虽然此时可以读取单页数据,但问题是我们只能一次写入(或擦写)一定数量的页面。写入(擦写)数据的最小单位就被称为数据块,而单个块则包含许多页面,事实上,通常有很多页面。典型的固态硬盘操作块由64,128,256或甚至512页组成,每次更改一位数据,都要擦写或写入大量数据!

由于NAND闪存可以支持的写入操作的数量是有限的,而且存储单元非常小,因此固态硬盘控制器将尽力减少对已经写入的块的重用。如果你只更改了1位数据,那么简单的固态硬盘(没有SLC缓存)就可以做到这一点。

1.在RAM中,控制器将从NAND闪存读取数据块;

2.NAND块被标记为被擦写(取决于固态硬盘和控制器,它可能稍后在后台擦写);

3. 控制器现在对存储在RAM中的数据块进行请求的更改;

4.最后,修改后的块将被写入NAND闪存。因为擦写操作比写入慢得多,为了耗损均衡和写入速度,固态硬盘将使用一组不同的物理存储单元来写入新数据。

写入数据时,固态硬盘控制器将尝试选择重新写入那些包含数据最少的块。这意味着,在现实的存储环境中,控制器将相同的数据集写入不同的块。为了使操作系统看起来一致,控制器将重新动态映射块的逻辑地址。 新的数据块将被分配一个特定地址,而旧的数据块将被移动到过载区域(Overprovisioned Area)中的保留池或被分配一个不同的地址。然后,固态硬盘将擦写该块的内容并增加其擦写计数(Erase Count)参数。

好了,由于本篇文章篇幅较长,所以今天就到此为止,大家休息一下,明天将为大家奉上本文的后半段。

本文翻译自:https://blog.elcomsoft.com/2019/01/life-after-trim-using-factory-access-mode-for-imaging-ssd-drives/如若转载,请注明原文地址: http://www.4hou.com/technology/15900.html
源链接

Hacking more

...