如何故意破坏/损坏 SD 卡上的扇区?

Gab*_*use 141 sd-card bad-sectors bad-blocks

我需要测试一些嵌入式硬件的一些读/写代码的弹性。我怎么可能牺牲一些 SD 卡并破坏几个已知扇区来进行对照研究?

我唯一能想到的就是将单个扇区覆盖几百万次。我想知道是否可以创建一个 Linux badblocks 脚本来在单个扇区上重复运行几个小时的破坏性测试。

Kam*_*ski 168

一种可能有用的替代方法。

如果您的代码在 Linux 下运行,那么也许您可以使用“有故障”的逻辑设备对其进行测试。dmsetup可以创建返回 I/O 错误的设备。只需使用error和/或flakey目标构建您的设备。来自man 8 dmsetup

error
进入该区域的任何 I/O 出错。用于测试或创建带有孔的设备。

flakey
创建到linear目标的类似映射,但会定期表现出不可靠的行为。用于在测试时模拟故障设备。

注意:此处flakey记录目标用法。基本示例在这里

据我所知,会立即报告 I/O 错误,因此这与真正的 SD 卡行为不同,您可以预期延迟、停顿等。不过我认为这种方法在某些情况下可能很有用,至少可以快速执行初步测试左右。

  • 我很欣赏这种开箱即用的想法!我们通过 80MHz Atmel 芯片在块级与 SD 接口,没有真正的操作系统。 (34认同)

Far*_*arO 75

这家伙黑掉了用于标记坏块的 SD 卡内的微控制器:https : //www.bunniestudios.com/blog/?p=3554

您也许可以执行相同的操作并任意将块标记为错误。

今天在 Chaos Computer Congress (30C3) 上,xobs 和我披露了一项发现,即某些 SD 卡包含允许任意代码执行的漏洞——存储卡本身。在黑暗的一面,存储卡上的代码执行会导致一类 MITM(中间人)攻击,其中卡似乎以一种方式运行,但实际上它做的是其他事情。从好的方面来说,它还使硬件爱好者有可能获得非常便宜且无处不在的微控制器来源。

.

这些算法过于复杂且过于特定于设备,无法在应用程序或操作系统级别运行,因此事实证明,每个闪存磁盘都配备了一个相当强大的微控制器来运行一组自定义的磁盘抽象算法。即使是微型 microSD 卡也不是一个,而是至少两个芯片——一个控制器和至少一个闪存芯片(高密度卡将堆叠多个闪存芯片)。

.

嵌入式微控制器通常是经过大量修改的 8051 或 ARM CPU。在现代实现中,微控制器将达到 100 MHz 的性能水平,并且还具有多个片上硬件加速器。令人惊讶的是,将这些控制器添加到设备的成本可能在 0.15 美元到 0.30 美元之间,特别是对于可以在同一业务部门内同时制造闪存和控制器的公司。添加这些微控制器可能比彻底测试和表征每个闪存芯片更便宜,这解释了为什么托管闪存设备可以比原始闪存芯片更便宜,尽管包含微控制器。

.

关键是固件加载和更新机制实际上是强制性的,尤其是对于第三方控制器。最终用户很少接触到这个过程,因为这一切都发生在工厂里,但这并没有让这个机制变得不那么真实。在我对中国电子市场的探索中,我看到店主在“扩展”卡容量的卡上烧固件——换句话说,他们加载一个固件,报告卡的容量远大于卡的容量。实际可用存储空间。事实上,这在销售点是可能的,这意味着更新机制很可能是不安全的。

在 30C3 的演讲中,我们报告了探索特定微控制器品牌的发现,即 Appotech 及其 AX211 和 AX215 产品。我们发现通过制造商保留的命令(即 CMD63 后跟“A”、“P”、“P”、“O”)传输的简单“敲门”序列使控制器进入固件加载模式。此时,卡将接受接下来的 512 个字节并将其作为代码运行。

  • 那是一个很棒的阅读! (11认同)
  • 在所有答案中,这可能是最接近 OP 实际要求的答案。 (10认同)
  • 我进入了 SD 卡架构的世界。 (2认同)

amo*_*ej1 38

这通常不起作用,因为大多数最新的 SD 卡(或 eMMC)使用静态和动态磨损均衡,这意味着智能控制器会解释您的写入指令并将其映射到最少使用的闪存扇区之一。

您唯一能做的就是尝试联系您的供应商并索取他们的数据表;可能有一些(特定于供应商的)方法来检索其磨损均衡算法的状态。这可能允许您查询底层闪存的状态/使用情况。或者你可能不走运,这可能不存在。

如果你的目标真的是摧毁闪存,你所能做的就是运行大量的读写周期并不断检查你正在读回的数据是否仍然一致。例如,创建两个大文件,存储它们的校验和并读/写它们以验证它们的校验和。闪存越大,此过程所需的时间就越长。

  • @Ruslan:即使整个设备上都有数据,磨损均衡仍然有效:例如,如果扇区 A 已写入一次,而扇区 B 已写入 1,000 次,那么当再次写入时扇区 B 卡可以交换两个扇区的数据,因此扇区 A 包含扇区 B 的数据(并且可能会被覆盖更多次 - 但没关系,因为它是新鲜的),扇区 B 将包含扇区 A 的数据(这将希望不会有太大变化)。显然,设备还需要存储哪个扇区存储在哪里的映射。 (6认同)
  • 如果 SD 卡完全装满数据,这样它就不能重新映射太多,这是否仍然有效?我不认为他们有很多空闲的隐藏扇区。 (2认同)
  • @Ruslan 设备不需要知道一个扇区是否充满了任何东西。它只需要知道哪些扇区的内容按要求传送,哪些扇区按要求写入。然后可能会有一些抽象层使其使用其他物理内存来表示遵循一些未公开算法的那些扇区......当然,“满”仅意味着“达到当前可填充块的阈值”。 (2认同)
  • @GabeKrause 是的,这就是野兽的本性。在最底层,你有 nand 或 nor flash 芯片(现在一切都使用 nand),并且在 nand 芯片前面有一个智能控制器来终止总线(例如,usb 用于 USB 棒或 mmc 用于 sd 卡),并且该芯片负责映射/磨损均衡等,它将闪存从您身上抽象出来。如果您要在嵌入式 Linux 上使用 nand,这就是 ubifs 将为您做的事情。 (2认同)
  • SD 卡有一个实现“闪存转换层”的微控制器 - 该微控制器将块请求转换为原始 NAND 命令。一些 SD 卡具有更改/更新 MCU 固件的隐藏命令,甚至在其上进行了一些逆向工程工作。除了原始 NAND(在某些情况下可能会像许多家用路由器一样出现)之外的大多数闪存设备可能是“过度配置”——这意味着你的 1GB SD 卡上可能有 1024MB+128MB 的原始 NAND 空间,以在满时覆盖磨损均衡以及对坏闪存页面的扇区备用。 (2认同)

小智 30

您可以通过提高工作温度来增加晶体管的磨损。在加热的芯片 (70-120 °C) 上使用写擦除循环;它会磨损得更快。

  • 过高的储存温度也会造成损害,因此将芯片在 120C°(甚至更高)的温度下“烹饪”一段时间,然后检查是否存在缺陷可能更为实际。 (18认同)
  • 卡的电源也可能出现轻微过压,同样需要进行试验。 (2认同)

Eri*_*son 17

前言:此选项需要额外的编程和硬件修改,但它允许对主机很可能透明的受控读取。

SD 卡有多个 I/O 选项,但可以通过 SPI 进行控制。如果您要使用 SD 卡并对其进行修改,以便可以将引脚连接到微控制器(例如 Arduino),您可以让 Arduino 模拟 SD 卡并对读取 SD 卡的设备透明。您在微控制器上的代码可能会在需要时故意返回错误数据。此外,您可以将 SD 卡放在微控制器上,以便读取数据能够通过微控制器到达 SD 卡,以进行千兆字节的测试。

  • 大多数高速设备(包括 PC 读卡器)只会拒绝使用不支持四位 SD 的卡。 (3认同)
  • 对此的一个变体,但更难的工作是找到一个 SD 卡,您可以[刷新固件](https://www.bunniestudios.com/blog/?p=3554)。 (3认同)
  • 这个超级有趣!我们的嵌入式系统通过 SPI 运行 I/O。我不确定我是否有足够的带宽来修改我们的硬件来完成这样的添加,但我认为这是一个绝妙的想法。 (2认同)
  • 接受有关动态磨损均衡的教育使我相信,战略性地创建具有已知坏扇区的“坏”SD 卡比我提出问题时所希望的要困难得多(或不可能)。虽然目前超出了我的能力范围,但这似乎是最可控且技术上最有前途的方法,其次可能是 @Olafm。自定义中间硬件以在数据传输期间拦截和“破坏”任何预定义扇区位置的数据似乎是一种好方法。 (2认同)

Guz*_*Zzt 15

我会去 ebay/aliexpress 购买我能从中国找到的最便宜的 SD 卡,那个“好得令人难以置信”。它们通常带有错误的扇区,或者在软件中设置的比实际大得多。无论哪种方式,您最终都会使用有故障的 SD 卡进行测试。


Cub*_*oft 11

Once upon a time, many years ago, I was paid to retrieve a set of graduation photos and videos from a SD card for a rather distraught mother. Upon close inspection, the card had somehow been physically damaged with a visible crack in the outer case and had several bad sectors, most notably several early, critical sectors, which made even the most reliable recovery programs at the time completely fail to read the card. Also, forensic data tools back then cost a fortune.

I ended up obtaining an identical brand/size SD card and writing my own custom raw data dump and restore utility to copy the data from the bad card to the good one. Every time the utility hit a bad sector, it would retry a number of times before writing all zeroes for that sector and, instead of giving up and stopping, ignore the failure and move on to the next sector. The retry attempts were made since I had also noticed that some sectors still had around a 40% read success rate. Once the data was on the new SD card, the recovery tools that had failed before worked flawlessly with minimal data loss/corruption. Overall, about 98% of all of the files were recovered. A number of items that had been previously deleted were also recovered because nothing is ever actually deleted - just marked as such and slowly overwritten. What started out as a slightly boring data recovery exercise became one of my more memorable and interesting personal software development projects. In case you were wondering, the mother was thrilled.

无论如何,这个故事表明,物理损坏 SD 卡是可能的,这样数据仍然可以访问,但扇区几乎不能正常工作,任何试图从中读取的东西都很难做到。SD 卡塑料往往非常脆弱,因此弯曲或切割成一些便宜的塑料可能会奏效。你的旅费可能会改变。

您也可以在您所在地区的一些数据恢复场所四处询问。由于他们专门从各种故障或故障设备中恢复数据,因此他们应该有一些有用的输入/提示,甚至可能手头有一些预先损坏的 SD 卡(例如用于培训目的),您可以从他们那里获得。

  • 你在网上发布了那个实用程序吗?加入我的武器库会很棒。 (2认同)

Den*_*din 5

这个答案是对@Ruslan 评论的扩展

  1. 将您的 SD 卡填满约 99.9%
  2. 不断重写剩余0.1%的内容(写A-删除-写B-删除-写A...)
  3. 测试(定期)您是否已经损坏了卡

可能的替代方案:

不确定这是否适合您的目的,但也许它实际上足以物理损坏您的卡,这可能会快得多。

  • @ispiro 例如,下次写入计数较高的扇区被覆盖时,其内容可能会与写入计数较低的扇区交换。 (12认同)
  • 将卡填充到 99% 无济于事,因为磨损均衡的全部目的就是防止这种过早损坏。物理损坏卡几乎肯定会导致卡不再初始化。 (6认同)
  • @DmitryGrigoryev 除非卡的内存比其官方容量多得多,否则磨损调平如何有很大帮助(在这种情况下是障碍)? (2认同)