題 我怎樣才能故意破壞/破壞SD卡上的扇區?


我需要測試某些嵌入式硬件的某些讀/寫代碼的彈性。我如何犧牲一些SD卡並打破幾個已知的部門進行對照研究?

我唯一能想到的就是將一個扇區覆蓋幾百萬次。我想知道是否可以創建一個Linux badblocks腳本來在一個扇區上重複運行幾個小時的破壞性測試。


138
2017-09-11 07:28


起源


您是否可以更改低級SD驅動程序以假裝存在壞塊,或者這是不可能的? - Mark Yisri
@MarkYisri,我認為司機不太容易接近。無論我們使用什麼驅動程序都是超級基本的,以最大化內存分配給其餘的固件。此外,如果可能,那可能超出我的能力。 - Gabe Krause
你能建立一個SD卡模擬器嗎?請注意,這不是最簡單的項目。 - user20574
鑑於目標,你可以花一點錢購買一些二手SD卡,你可能很容易得到一個錯誤的,或者“尋找...”宣布專門尋找有缺陷的卡。或者在eBay上搜索有缺陷的卡片。然後你測試卡,你就會知道缺陷區域的位置。 - FarO
詢問任何專業攝影師。他們肯定會有一堆粗略的SD卡。 - J...


答案:


另一種方法 可以 很有用。

如果您的代碼在Linux下運行,那麼您可以使用“故障”邏輯設備對其進行測試。 dmsetup 可以創建返回I / O錯誤的設備。只需使用構建您的設備 error 和/或 flakey 目標。從 man 8 dmsetup

error
  任何進入此區域的I / O都會出錯。用於測試或創建帶孔的設備。

flakey
  創建一個類似的映射到 linear 目標但定期表現出不可靠的行為。用於在測試時模擬故障設備。

注意: flakey 記錄目標使用情況 這裡。基本的例子 這裡

據我所知,會立即報告I / O錯誤,因此這與真正的SD卡行為有所不同,您可以預期延遲,停止等等。不過我認為這種方法在某些情況下可能很有用,至少可以快速執行初步測試左右。


166
2017-09-11 08:33



我很欣賞開箱即用的想法!我們通過80MHz的Atmel芯片在塊級與SD連接,沒有真正的操作系統。 - Gabe Krause
@GabeKrause在這種情況下,這個答案的用處取決於Linux塊設備API與嵌入式設備驅動程序的API有多麼相似。 - Qsigma
dmsetup 用於設置的命令 error 始終返回讀取錯誤的設備: stackoverflow.com/questions/1870696/... - Peter Cordes
我同意這聽起來像是一個更好的解決方案。首先,您可以通過任何硬件進行複制。您還可以模擬不同的錯誤模式。例如,我有一個16GB的USB閃存驅動器,可以很好地工作。一段時間後,雖然它上面的某個特定區域開始返回錯誤的數據。沒有任何類型的FS錯誤。您閱讀文件但內容不同。有些部門顯然不穩定。但是事先不能知道某些特定設備的行為。 - akostadinov


這傢伙攻擊用於標記壞塊的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字節並運行   它作為代碼。


75
2017-09-12 09:21



在所有答案中,這個答案可能與OP實際要求的最接近。 - Cort Ammon
這是一個很棒的閱讀! - Gabe Krause
@Twisty複製了一些相關部分。 - FarO
沿著兔子洞進入SD卡架構的世界我走了。 - Tejas Kale


這通常不起作用,因為最近的SD卡(或eMMC)使用靜態和動態耗損均衡,這意味著智能控制器會解釋您的寫入指令並將其映射到最少使用的閃存扇區之一。

您唯一能做的就是嘗試聯繫您的供應商並索取他們的數據表;可能存在一些(供應商特定的)方法來檢索其耗損均衡算法的狀態。這可能允許您查詢底層閃存的狀態/用法。或者你可能不走運,這可能不存在。

如果您的目標是真正破壞閃存,那麼您所能做的就是運行大量的讀寫週期,並不斷檢查您正在讀回的數據是否仍然一致。例如。創建兩個大文件,存儲它們的校驗和並讀/寫它們以驗證它們的校驗和。閃存越大,此過程所需的時間越長。


38
2017-09-11 07:37



如果SD卡完全充滿數據,那麼它是否仍然可以工作,因此它不能重新映射太多?我不認為他們有很多備用的隱藏部門。 - Ruslan
@Ruslan設備不需要知道扇區是否充滿了任何東西。它只需要知道根據請求提供哪些扇區的內容以及根據請求寫入哪些扇區。然後可能會有一些抽象層使得它使用其他物理內存來代表那些遵循一些未公開算法的扇區...... - “完全”僅意味著“達到當前可填充塊的閾值”,當然。 - Alexander Kosubek
@Ruslan:即使整個設備上都有數據,耗損均衡仍然有效:例如,如果扇區A已寫入一次,扇區B已寫入1,000次,則當另一次寫入時扇區B卡可以交換兩個扇區的數據,因此扇區A包含扇區B的數據(並且很可能會被覆蓋更多次 - 但這很好,因為它很新),而扇區B將包含扇區A的數據(這將是希望不會改變很多)。顯然,該設備還需要存儲哪個扇區存儲在哪裡的映射。 - psmears
@GabeKrause是的,這就是野獸的本性。在最低級別你有nand或者沒有閃存芯片(現在一切都使用nand),nand芯片前面有一個智能控制器,用於終止總線(例如usb用於usb棒或mmc用於sd卡) ),這個芯片負責映射/磨損均衡等,它將閃光從你身上抽像出來。如果你在嵌入式Linux上使用nand,這就是例如ubifs會為你做的。 - amo-ej1
SD卡具有實現“閃存轉換層”的微控制器 - 該微控制器將塊請求轉換為原始NAND命令。一些SD卡具有隱藏的命令來更改/更新MCU固件,甚至還有一些逆向工程工作。除了原始NAND之外的大多數閃存設備(在某些情況下可能會出現像許多家用路由器一樣)可能“過度配置” - 這意味著你的1GB SD卡上可能有1024MB + 128MB的原始NAND空間,以滿足磨損均衡對於壞的閃存頁面也是扇區保留。 - LawrenceC


您可以通過提高工作溫度來增加晶體管磨損。在加熱芯片上使用寫入 - 擦除循環(70-120°C);它會磨得更快。


32
2017-09-11 08:59



過高的儲存溫度也是有害的,因此將芯片在120℃(或甚至更長)下“烹飪”一段時間更為實際,然後檢查缺陷。 - Dmitry Grigoryev
也可能在卡的電源上有輕微的過電壓,同樣需要進行試驗。 - Chris H
欠壓也可能導致不同類型的缺陷,如控制器鎖定。 - user20574


前言:此選項需要額外的編程和硬件修改,但它允許對主機透明的受控讀取。

SD卡有多個I / O選項,但可以通過SPI進行控制。如果您要取SD卡並進行修改以便將引腳連接到微控制器(例如Arduino),您可以讓Arduino模仿SD卡並對讀取SD卡的設備保持透明。微控制器上的代碼可能會在需要時故意返回錯誤數據。此外,您可以在微控制器上放置SD卡,以便讀取能夠通過微控制器傳輸到SD卡,以進行千兆字節的測試。


18
2017-09-11 12:55



大多數高速設備(包括PC卡讀卡器)都會拒絕使用不支持4位SD的卡。 - Dmitry Grigoryev
OP表示這是一個嵌入式系統,它將使用該卡,這將使其更有可能支持SD用於SD卡 - Eric Johnson
這方面的一個變種,但更難的工作,是找到一個SD卡,你可以 重新刷新固件。 - Peter Taylor
這非常有趣!我們的嵌入式系統通過SPI運行I / O.我不確定我是否有足夠的帶寬來修改我們的硬件以完成這樣的添加,但我認為這是很棒的想法。 - Gabe Krause
接受有關動態磨損平衡的教育讓我相信,戰略性地創建一個已知壞道的“壞”SD卡比提出問題時所希望的要困難得多(或不可能)。雖然目前超出了我的能力範圍,但這似乎是最可控制和技術上最有前途的方法,可能是@Olafm。在數據傳輸期間定制中間硬件以攔截和“破壞”任何預定義扇區位置的數據似乎是一種好方法。 - Gabe Krause


我會去ebay / aliexpress併購買我能從中國找到的最便宜的SD卡,這張卡片“太好了,無法實現”。它們通常帶有錯誤的扇區或軟件設置比實際大得多。無論哪種方式,您最終都應該使用有故障的SD卡進行測試。


15
2017-09-12 08:05



有趣的方法,但你如何寫入壞區域來測試壞塊對存儲代碼的影響? - fixer1234
@ fixer1234,我有一張這樣的SD卡說它是32GB但實際上只有128MB。我把它放在我的相機中,可以拍攝超過128MB的照片,但只能讀回第一張照片。其餘的被列出但被回讀為破碎。猜猜這就是他們希望你在投訴時為時已經太遲而無法注意卡的問題...... - GuzZzt


許多年前,曾經有一段時間,我得到報酬,從SD卡中取出一套畢業照片和視頻給一個相當煩躁的母親。經過仔細檢查,該卡在某種程度上已被物理損壞,外殼中有明顯的裂縫,並有幾個壞扇區,最明顯的是幾個早期的關鍵部門,這使得當時最可靠的恢復計劃完全無法讀取卡。此外,當時的法醫數據工具需要花費大量資金。

我最終獲得了一個相同的品牌/大小的SD卡,並編寫了我自己的自定義原始數據轉儲和恢復實用程序,以將數據從壞卡複製到好卡。每次實用程序遇到壞扇區時,它會在為該扇區寫入所有零之前重試多次,而不是放棄和停止,忽略失敗並轉到下一個扇區。由於我還注意到某些扇區的讀取成功率仍然在40%左右,因此重試嘗試已經完成。一旦數據出現在新SD卡上,之前失敗的恢復工具就可以完美運行,並且數據丟失/損壞最小。總的來說,大約98%的文件都被恢復了。先前已刪除的一些項目也已恢復,因為實際上沒有刪除任何內容 - 只是標記為這樣並慢慢覆蓋。最初的一個有點無聊的數據恢復練習開始成為我更令人難忘和有趣的個人軟件開發項目之一。如果你想知道,母親很激動。

無論如何,這個故事表明,有可能對SD卡進行物理損壞,使得數據仍然可以訪問,但是只有幾乎沒有功能的扇區,任何試圖讀取它的東西都很難這樣做。 SD卡塑料往往非常脆弱,因此彎曲或切割成一些便宜的可能會成功。你的旅費可能會改變。

您也可以在您所在地區的某些數據恢復位置詢問。由於他們專注於從各種故障或故障設備中恢復數據,因此他們應該有一些有用的輸入/提示,甚至可能有一些預先存在的SD卡(例如用於培訓目的),您可以從中獲取。


11
2017-09-13 05:43



你在網上發布了那個實用程序嗎加入我的武器庫會很棒。 - Ploni
此時,考慮到技術進步(甚至可能無法編譯)和我使用的低級系統調用,它甚至可能無法正常運行。還有一些現代的,開源的取證設備/驅動器克隆工具,我更傾向於嘗試使用,而不是試圖從樟腦丸中取出舊的軟件。 - CubicleSoft
我希望你可以給一些參數 dd 現在,讓它以類似的方式行事。我不確定。 - wizzwizz4
@ wizzwizz4,看看ddrescue。 - hildred
“此外,當時的法醫數據工具需要花費大量資金。”我很確定他們仍然這樣做。 - jpmc26


這個答案是對@Ruslan評論的擴展

  1. 將SD卡填滿約99.9%
  2. 不斷重寫剩餘0.1%的內容(寫A -delete-write B-delete - Write A ...)
  3. 測試(定期)您是否已經破壞了卡

可能的選擇:

不確定這是否適用於您的目的,但也許它實際上足以對您的卡進行物理損壞,這可能會快得多。


5
2017-09-11 12:27



將卡填充到99%將無濟於事,因為磨損均衡的整個目的是為了防止這種過早損壞。物理上損壞卡幾乎肯定會導致卡不再初始化。 - Dmitry Grigoryev
@DmitryGrigoryev除非卡片有,否則穿著練級會有多大幫助(在這種情況下是障礙) 許多 比官方容量更多的記憶? - ispiro
@ispiro例如,下次重寫具有高寫入計數的扇區時,其內容可以與具有低寫入計數的扇區交換。 - Dmitry Grigoryev
@DmitryGrigoryev如果我正確地解釋了這個答案,應該有SD卡不做穿: electronics.stackexchange.com/a/27626/16104 - Dennis Jaheruddin
@DennisJaheruddin是的,舊卡不這樣做。使用這些卡足以重複創建/刪除空文件,直到分配表中的扇區消失。 - Dmitry Grigoryev


您可以嘗試引入不穩定的電源或更高的電壓信號。

我所知的一系列設備的常見故障在SD卡損壞和間歇性電池接觸之間具有很強的相關性。


3
2017-09-11 19:14





一些較舊的低容量SD卡(16MB-ish)使用TSOP / TSSOP型封裝的閃存芯片。一個能夠進行SMT返工的工作室(如果你正在進行嵌入式工作,你可能擁有內部技能,否則檢查進行板級手機/筆記本電腦維修的小公司)可以想像地分離並重新連接該芯片,以便它可以被讀取和寫入原始(包括ECC代碼)與設備編程器。

不過,請注意您將主要測試:

  • 您的設備如何處理內部糾錯引起的可能的時序偏差/打嗝

在最壞的情況下

  • 您的設備如何處理終端失敗的SD卡。

如果您只想查看SD卡出於何種原因而出現的不穩定行為,最好將電噪聲引入接口線(例如,在它們之間放置一個FET總線開關,並在隨機時間瞬間切換它是無意義信號的來源(儘管有正確的電平)。


3
2017-09-12 05:48



終端出現故障的SD卡不會產生“電噪聲”,它們只返回寫入操作的錯誤代碼。 - Dmitry Grigoryev


與OlafM的答案有關但有所不同:您可以編寫自己的微控制器來說出SD卡協議,然後模擬您希望它擁有的任何行為。


2
2017-09-13 02:51