我需要测试一些嵌入式硬件的读写代码的弹性。我怎样才能牺牲几张 SD 卡并破坏几个已知扇区来进行受控研究?
我唯一能想到的就是对单个扇区进行几百万次覆盖。我想知道是否可以创建一个 Linux badblocks 脚本,对单个扇区反复运行几个小时的破坏性测试。
答案1
另一种方法是可能有用。
如果您的代码在 Linux 下运行,那么也许您可以使用“有故障的”逻辑设备对其进行测试。dmsetup
可以创建返回 I/O 错误的设备。只需使用error
和/或flakey
目标构建您的设备即可。从man 8 dmsetup
:
error
进入此区域的任何 I/O 均会出错。对于测试或创建有漏洞的设备很有用。
flakey
创建与目标类似的映射linear
,但会定期表现出不可靠的行为。在测试时可用于模拟故障设备。
据我所知,I/O 错误会立即报告,因此这与真实的 SD 卡行为不同,在真实的 SD 卡行为中,您可能会遇到延迟、停顿等情况。不过,我认为这种方法在某些情况下可能很有用,至少可以执行快速的初步测试等。
答案2
这家伙入侵了 SD 卡中用于标记坏块的微控制器:https://www.bunniestudios.com/blog/?p=3554
您可能能够执行相同操作并任意将块标记为有故障。
今天在混沌计算机大会 (30C3) 上,xobs 和我披露了一项发现,即某些 SD 卡包含允许在存储卡本身上执行任意代码的漏洞。从坏处来看,在存储卡上执行代码会引发一类 MITM(中间人)攻击,在这种情况下,存储卡似乎在以一种方式运行,但实际上它却在做其他事情。从好的方面来看,这也使硬件爱好者能够获得非常便宜且无处不在的微控制器来源。
。
这些算法过于复杂,且与设备过于相关,无法在应用程序或操作系统级别运行,因此,每个闪存磁盘都附带一个相当强大的微控制器来运行一组自定义的磁盘抽象算法。即使是小巧的 microSD 卡也包含不止一个芯片,而是至少两个芯片——一个控制器和至少一个闪存芯片(高密度卡将堆叠多个闪存芯片)。
。
嵌入式微控制器通常是经过大量修改的 8051 或 ARM CPU。在现代实现中,微控制器将接近 100 MHz 性能水平,并且还具有多个片上硬件加速器。令人惊讶的是,将这些控制器添加到设备的成本可能在 0.15-0.30 美元左右,特别是对于可以在同一业务部门内制造闪存和控制器的公司而言。添加这些微控制器可能比彻底测试和描述每个闪存芯片更便宜,这解释了为什么尽管包含微控制器,托管闪存设备的每比特成本仍比原始闪存芯片便宜。
。
关键在于,固件加载和更新机制几乎是强制性的,尤其是对于第三方控制器而言。最终用户很少接触到这个过程,因为这一切都发生在工厂,但这并不会使该机制变得不那么真实。在我探索中国电子市场时,我看到店主在卡上刻录固件来“扩展”卡的容量——换句话说,他们加载的固件会报告卡的容量远大于实际可用的存储空间。在销售点发生这种情况的事实意味着更新机制很可能不安全。
在 30C3 的演讲中,我们报告了对特定微控制器品牌 Appotech 及其 AX211 和 AX215 产品的研究结果。我们发现一个简单的“敲击”序列通过制造商保留的命令(即 CMD63 后跟“A”、“P”、“P”、“O”)传输,使控制器进入固件加载模式。此时,卡将接受接下来的 512 个字节并将其作为代码运行。
答案3
这通常不起作用,因为大多数最新的 SD 卡(或 eMMC)使用静态和动态磨损均衡,这意味着智能控制器会解释您的写入指令并将其映射到最少使用的闪存扇区之一。
您唯一能做的就是尝试联系您的供应商并索要他们的数据表;可能有一些(特定于供应商的)方法来检索其磨损均衡算法的状态。这可能会让您查询底层闪存的状态/使用情况。或者您可能运气不好,这可能不存在。
如果您的目标确实是要破坏闪存,那么您所能做的就是运行大量读写循环并不断检查您正在读回的数据是否仍然一致。例如,创建两个大文件,存储它们的校验和并读取/写入它们以验证它们的校验和。闪存越大,此过程所需的时间越长。
答案4
前言:此选项需要额外的编程和硬件修改,但它允许对主机最有可能透明的受控读取。
SD 卡有多个 I/O 选项,但可以通过 SPI 进行控制。如果您要拿一张 SD 卡并对其进行修改,以便您可以将引脚连接到微控制器(例如 Arduino),那么您可以让 Arduino 模拟 SD 卡,并对读取 SD 卡的设备透明。微控制器上的代码可以在需要时故意返回错误数据。此外,您可以将 SD 卡放在微控制器上,这样读取的数据就可以通过微控制器传递到 SD 卡,从而实现千兆字节的测试。