论文传送门:《Self-Encrypting Deception: Weaknesses in the Encryption of Solid State Drives》
本文内容:
拉德堡德大学研究人员Carlo Meijer 和 Bernard van Gastel发表了一篇论文《Self-encrypting deception: weaknesses in the encryption of solid state drives (自我加密欺骗-固态硬盘中的加密缺陷),文中详细叙述了他们通过固件修改和接口调试,改变了固态硬盘中的密码验证方式,从而无需密码解密了固态硬盘中的数据信息。
一、论文总结
在攻击者可以在不输入密钥的情况下,完全绕过硬盘的硬件全盘加密,且允许在不知道密钥的情况下完全恢复数据。在攻击者可以在不输入密钥的情况下,完全绕过硬盘的硬件全盘加密,且允许在不知道密钥的情况下完全恢复数据。
二、获取固件镜像
可以选择从制造商的网站下载或者通过SSD管理实用程序获取。
从制造商的网站下载的固件更新通常包含可引导的ISO映像,其中包含操作系统,固件更新实用程序和固件映像本身。从ISO映像中提取固件通常很简单。
通过SSD管理实用程序获取较难一些。 例如,该实用程序可以在其通信信道和/或固件映像上应用混淆。而且如果目标驱动器已经安装了最新版本的固件,则可能拒绝下载更新。一些制造商使用加密的固件镜像,由驱动器本身解密。
三、低级别控制方法
1)JTAG允许完全控制器件。JTAG可以暂停/恢复CPU,读取/修改寄存器并放置断点。这些原语可以在地址空间中任意读/写,并执行任意代码。
2)供应商特定命令:大多数制造商实施供应商特定的命令以用于信息收集,诊断和其他目的。可能存在一个命令允许将任意值写入所选的内存地址。
3)内存损坏:内存损坏漏洞可以用于未签名代码执行,基于堆栈的缓冲区溢出就是一个例子。
4)存储芯片通信:用于获得未签名代码执行的更具侵入性的技术是使用外部读取器设备来对当前安装的固件进行修改。
NAND闪存芯片。 从NAND芯片检索数据需要人们知道几种芯片特性,一些NAND芯片具有专有扩展。此外,SSD中的NAND芯片通常作为BGA封装,要求它们在与PCB直接通信之前从PCB上拆焊。
NOR闪存。一些固态硬盘还装有NOR闪存,通过SPI连接,这是一种简单且支持良好的协议。SPI 闪存芯片通常在外面暴露它们的引脚,允许直接通信而无需拆焊。
5)故障注入攻击:最后,虽然作者在任何案例研究期间都没有尝试过,但可以使用故障注入攻击来使得未签名代码执行。论文强调,目前市场上还没有具有针对故障注入攻击的硬件对策的SSD控制器,因此故障注入可能是现在和可预见的未来在SSD上获得未签名代码执行的一种手段。
四、论文讨论的漏洞
1)密码和DEK无关联:为了避免在打开加密时对数据吞吐量产生负面影响,具有加密支持的SSD或自加密驱动器(SED)会容纳一个专用的AES协处理器来提供加密。驱动器使用磁盘加密密钥(Disk Encryption Key,DEK)加密存储在其上的所有数据,即使在数据未受密码保护的情况下也是如此,所以保护数据其实就是要保护DEK。显然,获得DEK应该需要密码,并且应该以加密方式强制执行。实际上,用户数据的保护不再依赖于密码,恢复用户数据所需的所有信息都存储在驱动器本身上并可以检索。
2)单个DEK用于整个磁盘:Opal标准允许定义多个范围,每个范围都使用不同的密码进行保护。如果整个驱动器使用单个DEK,那么为了允许BitLocker可以访问分区表,DEK不受保护地存储,那么实际上损害了其他范围。
3)随机生成的DEK缺乏熵:在ATA和Opal标准中,随机化是改变DEK的唯一方法。 这提出了在DEK生成期间是否有足够的随机熵可用的问题。原则上,部署SSD的环境允许获取足够的熵。然而,嵌入式设备中的随机数生成器声名狼藉。
4)磨损均衡:对同一逻辑扇区的多次写入通常触发对不同物理扇区的写入,以便在介质上均匀分布擦除和重写。尽管扇区的较旧副本无法被用户直接检索,但仍然被存储,直到被覆盖。假设DEK存储不受保护,之后由最终用户设置密码,用加密变量替换未受保护的DEK。由于磨损均衡,新变体可以存储在存储芯片内的其他位置,旧位置标记为未使用,仍然可以提取DEK。
5)省电模式(DEVSLP):DEVSLP允许SATA驱动器在发送适当的信号时进入低功耗“设备休眠”模式。ATA标准没有明确说明如何实现功耗降低。假设制造商让驱动器将其内部状态写入非易失性存储器,然后关闭RAM,进入休眠,如果在唤醒时未擦除非易失性存储器中的状态,攻击者可能能从最后存储的状态中提取DEK。
五、具体SSD的漏洞
Crucial MX100
将密码传递给SHA256哈希函数,再将输出与另一个缓冲区进行比较。 如果比较成功,则驱动器解锁。密码和DEK之间不存在加密绑定。不绑定基本上等同于不加密,因为加密密钥不依赖于秘密。实践中证明,通过JTAG修改RAM中的密码验证程序,MX100可以解锁密码,并且可以成功获得内容。此外,作者发现供应商的特定命令允许在地址空间内进行任意修改。
将JTAG调试设备连接到引脚。随后使用它来修改RAM中的密码验证(签名验证基于mbedTLS的rsa_pkcs1_verify函数),使其始终成功验证。最后使用任意密码正常解锁驱动器。
Crucial MX200
密码和DEK之间同样不存在加密绑定,此外,MX100中的供应商特定命令也存在于MX200中。
Crucial MX300
MX300关闭了JTAG功能,只能通过直接与NOR闪存进行通信来获取未签名的代码。如上图,存储控制器上电后,其CPU执行的第一条指令(负责NAND闪存和DRAM存储器的初始化)存储在嵌入控制器的ROM中。我们将存储在SPI闪存中的代码称为阶段2。88SS1074控制器支持第2阶段的加密签名验证。但是实际上,MX300不具备这一特点。为了说服驱动器接受修改的固件映像,需要绕过固件更新期间的加密签名检查,因此可以通过使用外部读取器设备修改SPI闪存的内容,自由地对第2阶段注入一段修改加密签名验证功能的代码,使其接受固件映像的无效签名。一旦安装了修改后的固件,就具有任意读/写功能,因此未签名代码执行。
Samsung 840 EVO
如果驱动器没有受ATA安全功能集保护,并且MASTER PASSWORD CAPABILITY位设置为High,那么DEK不会以密码方式绑定到密码。因此必须克服的唯一障碍是密码验证例程。将JTAG调试设备连接到引脚。通过JTAG修改密码验证例程,使其始终成功验证,最后使用任意密码正常解锁驱动器。
如果使用MASTA PASSWORD CAPABILITY位设置为Maximum或使用TCG Opal的ATA安全性,则DEK将以加密方式绑定到密码。通过耗损均衡问题,通过恢复到驱动器处于未受保护状态时使用的先前版本的加密blob,驱动器上的数据仍然可以恢复。
Samsung 850 EVO
关于全盘加密的实现,850与840非常相似。如果MASTER PASSWORD CAPABILITY位设置为High,则可以通过JTAG修改密码验证例程欺骗驱动器授予对其内容的访问权限。
但是从850 EVO系列开始,存储不再磨损均衡。因此不存在磨损均衡问题。
Samsung T3 portable
与840 EVO和850 EVO的情况一样,暴露了JTAG接口。通过JTAG可以从RAM中提取当前运行的固件。对固件的分析表明,它类似于MASTER PASSWORD CAPABILITY位设置为High时观察到的行为,即密码不以加密方式链接到DEK。
可以通过JTAG修改RAM中运行的固件来绕过密码验证例程,使其接受任何密码。
Samsung T5 portable
尽管T5移动硬盘同样缺少密码和DEK之间的加密绑定,由于三星T5移动硬盘的JTAG功能被禁用,且没有针对T5的固件更新可供下载,论文没有对密码和DEK无关联漏洞进行利用。因为在设备上获取未签名的代码执行是相当耗时且劳动密集的。鉴于在T5的前身T3中实际利用了这个问题,并且鉴于T5中存在完全相同的问题,作者认为在T5上跳过获取代码执行的行为是合理的。