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


142

我需要测试某些嵌入式硬件的一些读/写代码的弹性。我如何牺牲一些SD卡并打破几个已知的扇区进行受控研究?

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


20
您是否可以更改低级SD驱动程序以假装有坏块,或者那是不可能的?

3
@MarkYisri,我认为该驱动程序不易访问。无论我们使用什么驱动程序,都是超基本的,可以最大程度地为其余固件分配内存。另外,如果可能的话,那可能超出了我的能力范围。
·克劳斯

3
您可以构建SD卡模拟器吗?请注意,这不是最简单的项目。
user20574

11
有了这个目标,您可以花很少的钱购买一些二手SD卡,而您很容易会得到一张有问题的SD卡,或者放一个“寻找...”公告来专门寻找有问题的卡。或在eBay上搜索有缺陷的卡。然后测试卡,您将知道缺陷区域的位置。
FarO

28
询问任何专业摄影师。他们肯定会有一堆粗略的SD卡。
J ...

Answers:


168

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

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

error
使进入该区域的所有I / O错误。对于测试或创建带有孔的设备很有用。

flakey
创建与linear目标的相似映射,但是会周期性地表现出不可靠的行为。在测试时用于模拟故障设备很有用。

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

据我所知,I / O错误将立即报告,因此这与实际的SD卡行为(可能会出现延迟,停顿等)不同。尽管如此,我认为这种方法在某些情况下可能很有用,至少可以快速执行初步测试左右。


34
我很欣赏那种开箱即用的想法!我们通过一块80MHz的Atmel芯片在无块级接口和SD接口,而没有实际的OS。
·克劳斯

1
@GabeKrause在这种情况下,此答案的有效性取决于Linux块设备API与嵌入式设备驱动程序API的相似程度。
Qsigma

1
dmsetup设立一个命令error:总是返回读取错误装置stackoverflow.com/questions/1870696/...
彼得·柯德斯

1
我同意这听起来是一个更好的解决方案。首先,您可以在任何硬件上进行复制。您还可以模拟不同的错误模式。例如,我有一个工作正常的16GB USB闪存驱动器。经过一段时间后,虽然它上的特定区域开始返回错误的数据。没有任何FS错误。您读取了文件,但是内容不同。有些部门显然是不稳定的。但是某些特定设备的行为方式无法事先知道。
akostadinov

76

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

您可以执行相同的操作,并随意将块标记为有故障。

今天在混沌计算机大会(30C3)上,xobs和我披露了一个发现,即某些SD卡包含允许在存储卡本身上执行任意代码的漏洞。不利的一面是,存储卡上的代码执行会产生一类MITM(中间人)攻击,其中存储卡的行为似乎是一种方式,但实际上它有其他作用。从好的方面来说,它还使硬件发烧友有可能获得非常便宜且普遍存在的微控制器资源。

这些算法太复杂且太特定于设备,无法在应用程序或OS级别上运行,因此事实证明,每个闪存磁盘都随附有功能强大的微控制器,以运行一组定制的磁盘抽象算法。甚至很小的microSD卡也不包含一个芯片,而是至少包含两个芯片-一个控制器和至少一个闪存芯片(高密度卡将堆叠多个闪存芯片)。

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

问题的关键在于,固件加载和更新机制实际上是强制性的,尤其是对于第三方控制器而言。最终用户很少会经历此过程,因为这一切都是在工厂进行的,但这并不会使该机制变得不那么真实。在我对中国电子市场的探索中,我看到商店的店主在卡上刻录固件,以“扩展”卡的容量,换句话说,他们加载的固件报告的卡容量比卡的容量大得多。实际可用存储空间。在销售点这是可能的事实意味着最有可能不确保更新机制。

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


10
在所有答案中,这个答案可能是最接近OP实际要求的答案。
Cort Ammon

11
那真是太棒了!
·克劳斯

@Twisty复制了一些相关部分。
FarO

2
深入研究SD卡体系结构的世界。
Tejas Kale

38

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

您唯一可以做的就是尝试与您的供应商联系并索取他们的数据表。可能有一些(特定于供应商的)方法来检索其损耗均衡算法的状态。这可能使您可以查询基础闪存的状态/使用情况。否则,您可能会很不幸,并且这可能不存在。

如果您的目标确实是销毁闪存,那么您所能做的就是运行大量的读写周期,并不断检查所读取的数据是否仍然一致。例如,创建两个大文件,存储它们的校验和并对其进行读写,以验证其校验和。闪光灯越大,此过程将花费的时间越长。


2
如果SD卡中已完全填满数据,这样就无法重新映射太多了,这仍然行不通吗?我认为他们没有很多备用的隐藏扇区。
Ruslan

2
@Ruslan设备不需要知道扇区是否充满了任何东西。它只需要知道应请求传送哪些扇区以及应请求写入哪些扇区的内容。然后可能存在适当的抽象层,使其遵循某种未公开的算法使用其他物理内存来表示那些扇区...-当然,“满”仅表示“达到了当前可填充块的阈值”。
亚历山大·科苏贝克

6
@Ruslan:即使整个设备上都有数据,耗损均衡仍然可以有效:例如,如果扇区A已被写入一次,扇区B已被写入1000次,那么当又进行一次写入时卡可以在扇区B中交换两个扇区的数据,因此扇区A包含扇区B的数据(并且可能会被覆盖很多次-但这是可以的,因为它是新鲜的),而扇区B将包含扇区A的数据(希望不会有太大变化)。显然,设备还需要存储将哪个扇区存储在哪里的映射。
psmears

2
@GabeKrause是的,那是野兽的本质。在最低级别上,您具有nand或flash芯片(如今所有东西都在使用nand),并且在nand芯片前面有一个智能控制器,用于终止总线(例如,usb棒的usb或sd卡的mmc ),该芯片负责映射/损耗平衡等,它将闪光从您身上抽象出来。如果您要在嵌入式Linux上使用nand,例如ubifs就会为您做。
amo-ej1

2
SD卡具有一个实现“闪存转换层”的微控制器-该微控制器将块请求转换为原始NAND命令。一些SD卡具有隐藏的命令,用于更改/更新MCU固件,甚至还进行了一些逆向工程。除原始NAND(在某些情况下可能会出现在许多家用路由器中)以外的大多数闪存存储设备都可能“预留空间过大”,这意味着您的1GB SD卡上可能具有诸如1024MB + 128MB的原始NAND空间,以在装满后弥补磨损并为坏Flash页面进行扇区保护。
LawrenceC

32

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


18
过高的存储温度也会造成损害,因此将芯片在120°C(或更高)的温度下“烹饪”一段时间,然后检查是否有缺陷可能更为实际。
德米特里·格里戈里耶夫

2
卡的电源上也可能有轻微的过电压,并且同样需要进行试验。
克里斯H

欠压还可能导致不同类型的缺陷,例如控制器锁定。
user20574 '17

18

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

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


3
大多数高速设备(包括PC读卡器)只会拒绝使用不支持四位SD的卡。
德米特里·格里戈里耶夫

1
OP表示,这是一个嵌入式系统,它将使用该卡,这将使其更有可能支持sd卡的SPI
Eric Johnson

3
对此的一种变种(但更艰苦的工作)是找到可以为其刷新固件的SD卡。
彼得·泰勒

2
超级有趣!我们的嵌入式系统正在通过SPI运行I / O。我不确定是否有带宽来修改我们的硬件以完成这样的添加,但是我认为这是一个绝妙的想法。
·克劳斯

2
受过动态磨损均衡教育之后,我相信,战略性地创建具有已知坏道的“坏” SD卡比提出问题时希望的要困难得多(或不可能)。虽然目前这超出了我的能力范围,但这似乎是最可控且技术上很有前途的方法,其次可能是@Olafm。自定义中间硬件以在数据传输期间在任何预定义的扇区位置截取和“破坏”数据似乎是一种好方法。
·克劳斯

15

我会去ebay / aliexpress买我在中国能找到的最便宜的SD卡,一张“实在太好了”。它们通常带有错误的扇区,或者在软件中设置得比实际大小大得多。无论哪种方式,您都应该以有故障的SD卡结束进行测试。


有趣的方法,但是您将如何写入坏区以测试坏块对存储代码的影响?
fixer1234

@ fixer1234,我有一张SD卡说它是32GB,但实际上只有128MB。我将其放在相机中,可以拍摄超过128MB的照片,但只能读取第一张照片。其余的已列出,但被读回为损坏。猜猜这就是当他们为时已晚时,他们希望您如何首先注意到卡的问题...
GuzZzt 17/09/19

11

很久以前,有一次,我被薪水从SD卡中找回了一位心烦意乱的母亲的毕业照片和录像。经过仔细检查,该卡在某种程度上受到了物理损坏,外壳上有明显的裂缝,并且有几个坏道,最显着的是几个早期的关键扇区,这甚至使当时最可靠的恢复程序也完全无法读取该卡。 。此外,取证数据工具的成本也很高。

我最终获得了相同品牌/大小的SD卡,并编写了自己的自定义原始数据转储和还原实用程序,以将数据从坏卡复制到好卡上。公用事业每次遇到坏扇区时,都会在写入该扇区的所有零之前重试多次,并且不要放弃并停止,而忽略故障并转到下一个扇区。由于我还注意到某些扇区的读取成功率仍约为40%,因此进行了重试尝试。数据存储在新的SD卡上之后,以前曾出现故障的恢复工具可以完美地工作,并且数据丢失/损坏最小。总体而言,已恢复了所有文件的约98%。还恢复了以前删除的许多项目,因为实际上没有任何内容被删除-只是被标记为此类内容并慢慢被覆盖。最初是一个稍微无聊的数据恢复工作,后来成为我更难忘和有趣的个人软件开发项目之一。如果您想知道的话,母亲很高兴。

无论如何,这个故事表明,有可能物理损坏SD卡,使得仍然可以访问数据,但其中的扇区仅能正常工作,而任何尝试从中读取数据的操作都很难做到。SD卡塑料往往非常脆弱,因此弯曲或切成一些便宜的塑料也许可以解决问题。你的旅费可能会改变。

您还可以在您所在地区的一些数据恢复场所四处询问。由于它们专门用于从各种发生故障或发生故障的设备中恢复数据,因此它们应该具有一些有用的输入/提示,甚至可能手头上有一些预烧制的SD卡(例如,用于培训),您可以从中获取这些SD卡。


2
您是否已在线发布该实用程序?那将是增加我的武器库的好方法。
Ploni

1
在这一点上,考虑到技术的进步(甚至可能无法编译)和我使用的低级系统调用,它甚至可能无法正常运行。还有一些现代的,开放源代码的取证设备/驱动器克隆工具,比起将我的旧软件淘汰后,我更倾向于尝试使用。
CubicleSoft

我希望您现在可以给一些参数以dd使其表现与此类似。我不确定。
wizzwizz4

@ wizzwizz4,看看ddrescue。
hildred

“此外,当时的取证数据工具也花费了一笔巨款。” 我很确定他们仍然这样做。
jpmc26

5

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

  1. 将您的SD卡装满约99.9%
  2. 连续重新写入剩余0.1%的内容(写A-删除-写B-删除-写A ...)
  3. (定期)测试您是否已损坏存储卡

可能的选择:

不确定这是否适合您的目的,但实际上足以损坏您的卡,这可能要快得多。


6
将卡填充到99%并没有帮助,因为整平磨损的整个目的是为了防止这种过早的损坏。物理损坏存储卡几乎可以肯定会导致存储卡不再初始化。
德米特里·格里戈里耶夫

2
@DmitryGrigoryev如何将耗损均衡有很大帮助(阻碍,在这种情况下),除非卡上有很多比它的正式容量更大的内存?
ispiro

12
@ispiro例如,下次重写具有高写计数的扇区时,其内容可以与具有低写计数的扇区交换。
德米特里·格里戈里耶夫

1
@DmitryGrigoryev如果我正确解释了这个答案,应该有不磨损的SD卡:electronics.stackexchange.com/a/27626/16104
Dennis Jaheruddin

1
@DennisJaheruddin是的,年长的卡不会这样做。使用这些卡,足以重复创建/删除一个空文件,直到分配表中的扇区用完为止。
德米特里·格里戈里耶夫

3

您可以尝试引入不稳定的电源或更高电压的信号。

我所知道的一系列设备的常见故障与SD卡损坏和电池间歇性接触密切相关。


3

一些较旧的低容量SD卡(16MB容量)使用TSOP / TSSOP样式的封装的闪存芯片。可以进行SMT返修的车间(如果您从事嵌入式工作,您可能拥有内部技能,否则请检查进行板级电话/笔记本电脑维修的小公司)可以分离并重新安装该芯片,以便可以对其进行读写设备编程器原始数据(包括ECC代码)。

不过,请注意您将主要进行测试:

  • 您的设备将如何处理内部纠错带来的可能的时序偏差/打h

在最坏的情况下

  • 您的设备如何处理最终出现故障的SD卡。

如果您只是想出于某种原因从SD卡检查其行为是否不稳定,最好将电气噪声引入接口线中(例如,通过在它们之间放置FET总线开关,并在随机时间进行瞬时开关)使其成为无意义的信号源(尽管电平正确)。


最终出现故障的SD卡不会产生“电噪声”,它们只会返回用于写操作的错误代码。
德米特里·格里戈里耶夫

2

与OlafM的答案有关,但有所不同:您可以对自己的微控制器进行编程以说出SD卡协议,然后模拟所需的任何行为。


1

FAT32主引导记录区域可能最容易受到滥用,因为从逻辑上讲,它始终需要位于同一位置。(也许这是通过坏扇区的软重映射来处理的,但是我对此表示怀疑,因为它是在所有硬件上实现的。)因此,您可以sfdisk循环运行,看看是否可以这样破坏它。

但是,我要求您尽一切努力提高硬件可靠性,而不是尝试处理软件中的不良硬件。问题是SD卡会以各种奇怪的方式失败。它们变得不可读,变得无法写入,为您提供不良数据,它们在操作期间超时等等。试图预测卡可能发生故障的所有方式非常困难。

这是我最喜欢的故障之一,“大数据模式”:

SD错误假大数据

SD卡是商品消费产品,承受着巨大的成本压力。零件变化迅速,数据表很难获得。假冒产品并非闻所未闻。对于便宜的存储来说,它们很难被击败,但是尽管SSD将可靠性放在首位,但SD卡的优先级是速度,容量和成本(可能不是按顺序排列)。

您的第一道防线是使用可焊接的eMMC零件和知名制造商的真实数据表,而不是使用可移动SD卡。是的,它们每GB的成本更高,但是该部件将在生产中使用更长的时间,至少您知道自己得到了什么。向下焊接部件还可以避免使用可移动卡产生的一系列潜在问题(卡在写入过程中卡住,电接触不良等)。

如果您的产品需要可移动存储,或者更改任何内容为时已晚,请考虑将多余的钱用于“工业”等级卡,或将其视为一次性物品。我们的工作(在Linux下)是fsck引导卡,如果报告了任何错误,请重新格式化该卡,因为在这种情况下,重新格式化是可以接受的。然后我们fsck再次。如果重新格式化后仍然报告错误,我们将对其进行RMA并用使用eMMC的较新版本替换硬件。

祝好运!


我给你竖起大拇指。我大量使用SD卡,一年中有几次失败。我从没想过,但是以我自己的经验,我的失败卡片在最终变得毫无价值之前确实表现出FAT失败的症状。我认为您正在这里:)因此,简单地创建和删除文件应该对FAT产生影响。
jwzumwalt

1

也许这不是您想要的方向,但我发现在收音机或笔记本电脑读取SD卡的同时将其取出,可以保证SD卡损坏的次数约为1/5或1/10倍。在读取和大概写入期间断电似乎卡效果不佳。阅读以下罗伯特·卡尔霍恩(Robert Calhoun)的评论后,它使我相信它可能会损坏FAT。虽然我不知道为什么只是读书会导致崩溃-应该不写任何东西吗?


这可能会损坏FS,但不确定是否会创建坏扇区
akostadinov

我可以告诉您一个事实,它会使卡崩溃,并需要重新格式化。我已经用SD卡,Raspberry Pie,我的笔记本电脑以及我的一些家用设备完成了很多次。
jwzumwalt

2
要求重新格式化!=会损坏扇区。文件系统,是的。部门,也许。
wizzwizz4

1

如果您的sd卡是FAT32格式的,则可以十六进制编辑这两个脂肪,并使用正确的十六进制代码将一个扇区标记为坏扇区。如果您要逻辑测试应该在此特定位置找到坏扇区的软件,这只是一个技巧;它也不会损害您的SD卡,重新格式化会将其恢复到正常状态。


1
欢迎来到超级用户!这似乎是一种有趣的方法-您能否解释一下如何特别执行十六进制编辑?谢谢。
本N

我认为Linux命令hdparm可以解决问题:它将允许您保存一些扇区,以供日后编辑,然后写回到卡上。但是,您需要查找有关vfat和man hdparm的文档。抱歉,我离Windows计算机很近。
Emile De Favas

--make-bad-sector标志看起来很有希望!但是,我不能确定这是否只能在最初运行此命令的linux系统中起作用。我希望该命令hdparm --make-bad-sector 20000 /dev/sd#将以某种方式使扇区20000损坏,并在未运行linux的嵌入式硬件设备上被检测为损坏。有什么想法吗?
·克劳斯

0

我想知道是否可以创建Linux badblocks脚本来在单个扇区上重复运行几个小时的破坏性测试。

在单个扇区上-否,因为SD卡中的损耗均衡代码将在整个位置重新映射逻辑块。

但是您可以轻松地badblocks -w循环运行,直到它导致出现一些坏块为止。这样的事情应该起作用:

while badblocks -w /dev/xx; do :; done

假设如果未检测到坏块,则badblocks返回0,否则返回≠0(手册页未说明,并且我没有检查源代码。)


-1

通常,对于SD / uSD卡,它们会实现耗损均衡,因此这可能很难。根据类型(单层单元,多层,TLC,3D-NAND等)的不同,将其破坏足以耗尽扇区池所需的写周期可能在多个TB中。

我确实使用4GB,64GB和256GB Pro Duo,SSD和Thumbdrive进行了测试,使用4微米16GB芯片的64GB K --- s ---持续约3.84TB,然后在FAT区域中出现单个软错误而失败。256GB的使用时间少一点,但是估计在没有直接访问芯片的情况下,它可能在最终放弃MBR损坏之前写了大约5TB的存储空间,但尚不清楚控制器是否使它在USB3模式下稳定工作,但USB2在回读期间有更多故障而且也很热 4GB Duo在复制数据时无法在读取器中读取数据,再次无法确定,但相当于使用了6年,并且相机还显示“正在恢复”消息。写入期间偶然改变电源电压会使它更快地失灵。经过约2年的使用,我的128GB microSD出现了类似的症状,

删除了与X射线实验无关的注释。


1
已经有一些答案可以帮助销毁特定的整流器。您关于销毁随机武器的建议并没有带来任何额外好处。
朱塔什(MátéJuhász)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.