今天在混沌计算机大会(30c3)上,xobs和我披露了一项发现,一些SD卡包含允许在存储卡本身上执行任意代码的漏洞。在阴暗面,存储卡上的代码执行启用了一类MITM(中间人)攻击,在这种攻击中,存储卡看起来是以一种方式运行,但实际上它执行的是另一种方式。从好的方面来说,它也使硬件爱好者有可能获得非常便宜和无处不在的微控制器来源。
为了解释黑客攻击,有必要了解SD卡的结构。这里的信息适用于整个“托管闪存”设备系列,包括microSD、SD、MMC以及eMMC和inand设备,这些设备通常焊接在智能手机的主板上,用于存储操作系统和其他私人用户数据。我们还注意到,USB闪存驱动器和SSD等相关设备中也存在类似类别的漏洞。
闪存真的很便宜。事实上,它太便宜了,以至于太好了,简直不像是真的。在现实中,所有的闪存都充满了缺陷--无一例外。连续、可靠的存储介质的错觉是通过复杂的纠错和坏块管理功能实现的。这是工程师和大自然之间不断军备竞赛的结果;随着每一次制造过程的缩小,存储器变得更便宜,但更不可靠。同样,对于每一代人,工程师们都会想出更复杂的算法来补偿大自然母亲在原子尺度上对熵和随机性的倾向。
这些算法太复杂、太特定于设备,无法在应用程序或操作系统级别运行,因此每个闪存磁盘都配备了功能相当强大的微控制器来运行一组自定义的磁盘抽象算法。即使是微型的microSD卡也包含不是一个,而是至少两个芯片-一个控制器,以及至少一个闪存芯片(高密度卡将堆叠多个闪存芯片)。你可以在我几年前做的microSD拆卸过程中看到一些microSD卡内部的模具照片。
根据我们的经验,集成到存储卡中的闪存芯片的质量差别很大。它可以是任何东西,从高级工厂新硅到80%以上坏扇区的材料。那些关心电子垃圾的人可能会(也可能不会)高兴地知道,供应商使用从废弃部件中回收的闪存芯片也很常见。较大的供应商往往会提供更一致的质量,但即使是最大的厂商也坚决保留将闪存芯片与不同的控制器混合搭配的权利,但将组装作为相同的零件号出售-如果您正在处理特定于实现的错误,这将是一场噩梦。
嵌入式微控制器通常是经过大量修改的8051或ARM CPU。在现代实现中,微控制器将接近100 MHz的性能水平,并且芯片上还具有多个硬件加速器。令人惊讶的是,将这些控制器添加到设备上的成本可能在0.15-0.30美元左右,特别是对于在同一业务部门内既能制造闪存又能制造控制器的公司来说。添加这些微控制器可能比彻底测试和表征每个闪存芯片更便宜,这就解释了为什么尽管包含微控制器,托管闪存设备的单位比特成本仍比原始闪存芯片便宜。
所有这些复杂性的缺点是,硬件抽象层中可能存在错误,特别是因为每个闪存实现都有独特的算法要求,这导致微控制器必须潜在处理的硬件抽象层的数量激增。不可避免的固件错误现在是闪存业务的现实,因此,将静态代码体不可磨灭地烧录到片上ROM中是不可行的,特别是对于第三方控制器来说。
关键在于固件加载和更新机制实际上是强制性的,特别是对于第三方控制器。最终用户很少接触到这一过程,因为它都发生在工厂里,但这并不会降低该机制的真实性。在我对中国电子市场的探索中,我看到店主在卡上烧毁固件,以“扩展”卡的容量-换句话说,他们加载的固件报告卡的容量远远大于实际可用存储空间。事实上,这在销售点是可能的,这意味着最有可能的是,更新机制并不安全。
在我们30c3的演讲中,我们报告了我们对特定微控制器品牌的研究结果,即Appotech及其AX211和AX215产品。我们发现一个简单的“敲门”序列通过制造商保留的命令(即,CMD63后跟“A”、“P”、“P”、“O”)传输,这些命令将控制器放入固件加载模式。此时,该卡将接受接下来的512个字节,并将其作为代码运行。
从这个滩头阵地,我们能够对8051的大部分功能专用寄存器进行反向工程(通过代码分析和模糊处理的组合),使我们能够为控制器开发新的应用,而无需访问制造商的专有文档。大部分工作是使用我们的开源硬件平台Novena和一组自定义的FLEX电路适配器卡完成的(顺理成章地说,这导致了柔性电路贴纸(又名chibitronics)的开发)。
值得注意的是,SD命令处理是通过由微控制器处理的一组中断驱动回调来完成的。这些回调是实施MITM攻击的理想位置。
到目前为止,还不清楚还有多少制造商将他们的固件更新序列留在了不安全的地方。Appotech在SD控制器领域是一个相对较小的参与者;有几家你可能从未听说过的生产SD控制器的公司,包括Alcor Micro、Skymedi、Phison、SMI,当然还有Sandisk和三星。它们中的每一个都将具有不同的加载和更新其固件的机制和方法。然而,之前有人指出,至少有一个使用ARM指令集的三星eMMC实现存在一个漏洞,需要将固件更新程序推送到Android设备上,这表明还有另一个潜在的有希望的地方可以进一步发现。
从安全的角度来看,我们的发现表明,尽管存储卡看起来很惰性,但它们运行的代码体可以被修改来执行一类难以检测的MITM攻击;没有标准的协议或方法来检查和证明在存储卡的微控制器上运行的代码的内容。那些处于高风险、高敏感情况下的人应该假设,卡的“安全擦除”不足以保证敏感数据的完全擦除。因此,建议通过完全物理销毁的方式处理存储卡(例如,用研钵和锄头将其研磨)。
从DIY和黑客的角度来看,我们的发现表明,在简单的项目中使用廉价而强大的微控制器是一个潜在的有趣来源。搭载8位16兆赫微控制器的Arduino售价约为20美元。一张内存为几千兆字节、微控制器性能高达数倍的microSD卡只需花很少的钱就能买到。虽然SD卡确实有I/O限制,但对SD卡中的微控制器进行一些巧妙的黑客操作,可以为基于I2C或SPI的传感器提供非常经济和紧凑的数据记录解决方案。
我们30c3演讲的幻灯片可以在这里下载,或者你也可以在下面的YouTube上观看演讲。
Kosagi团队特别感谢.mdge通过Cyber Fast Track计划进行这项研究。