138

Мне нужно проверить устойчивость некоторого кода чтения / записи для некоторого встроенного оборудования. Как я могу пожертвовать несколькими SD-картами и разбить несколько известных секторов для контролируемого исследования?

Единственное, о чем я могу думать, это перезаписать один сектор несколько миллионов раз. Интересно, можно ли создать скрипт Linux badblocks для повторного выполнения своего разрушительного теста в одном секторе в течение нескольких часов.

15 ответов15

166

Альтернативный подход, который может быть полезен.

Если ваш код работает под Linux, то, возможно, вы сможете протестировать его с "неисправным" логическим устройством. dmsetup может создавать устройства, которые возвращают ошибки ввода-вывода. Просто создайте свое устройство, используя error и / или flakey цель. От man 8 dmsetup:

error
Ошибки любого ввода / вывода, который идет в эту область. Полезно для тестирования или для создания устройств с отверстиями в них.

flakey
Создает сопоставление с linear целью, но периодически проявляет ненадежное поведение. Полезно для моделирования неисправных устройств при тестировании.

Примечание: использование flakey целевого документировано здесь. Основной пример здесь.

Насколько я знаю, об ошибке ввода-вывода будет сообщено немедленно, так что это отличается от реального поведения SD-карты, где вы можете ожидать задержки, зависания и т.д. Тем не менее, я думаю, что этот подход может быть полезен в некоторых случаях, по крайней мере, для быстрого выполнения предварительный тест или около того.

75

Этот парень взломал микроконтроллер на SD-картах, используемых для маркировки плохих блоков: https://www.bunniestudios.com/blog/?p=3554

Вы можете сделать то же самое и произвольно пометить блоки как неисправные.

Сегодня на компьютерном конгрессе Chaos (30C3) мы с Хобсом объявили, что некоторые SD-карты содержат уязвимости, которые допускают выполнение произвольного кода - на самой карте памяти. С другой стороны, выполнение кода на карте памяти обеспечивает класс атак MITM (человек посередине), когда карта ведет себя односторонним образом, но на самом деле она делает что-то другое. С другой стороны, это также позволяет энтузиастам оборудования получить доступ к очень дешевому и вездесущему источнику микроконтроллеров.

,

Эти алгоритмы слишком сложны и слишком специфичны для устройства, чтобы запускаться на уровне приложения или ОС, и поэтому оказывается, что каждый диск флэш-памяти поставляется с достаточно мощным микроконтроллером для запуска собственного набора алгоритмов абстрагирования диска. Даже миниатюрная карта microSD содержит не одну, а, по крайней мере, две микросхемы - контроллер и, по крайней мере, одну флеш-микросхему (карты высокой плотности будут составлять несколько флеш-кристаллов).

,

Встроенный микроконтроллер обычно представляет собой сильно модифицированный процессор 8051 или ARM. В современных реализациях микроконтроллер будет приближаться к уровням производительности 100 МГц, а также имеет несколько аппаратных ускорителей на кристалле. Удивительно, но стоимость добавления этих контроллеров к устройству, вероятно, составляет порядка 0,15-0,30 долл. США, особенно для компаний, которые могут использовать как флэш-память, так и контроллеры в пределах одного подразделения. Вероятно, дешевле добавить эти микроконтроллеры, чем тщательно тестировать и характеризовать каждый чип флэш-памяти, что объясняет, почему управляемые флэш-устройства могут быть дешевле на бит, чем необработанные чипы флэш-памяти, несмотря на включение микроконтроллера.

,

Суть в том, что механизм загрузки и обновления прошивки практически обязателен, особенно для сторонних контроллеров. Конечные пользователи редко подвергаются этому процессу, поскольку все это происходит на заводе, но это не делает механизм менее реальным. В своих исследованиях рынков электроники в Китае я видел, как владельцы магазинов записывают прошивки на карты, которые «расширяют» емкость карты - другими словами, они загружают прошивку, которая сообщает, что емкость карты намного больше, чем фактическое доступное хранилище. Тот факт, что это возможно в точке продажи, означает, что, скорее всего, механизм обновления не обеспечен.

В нашем выступлении на 30C3 мы сообщаем о наших выводах, посвященных изучению конкретной марки микроконтроллеров, а именно Appotech и его предложений AX211 и AX215. Мы обнаруживаем простую последовательность «стука», передаваемую по зарезервированным производителем командам (а именно, CMD63, за которыми следуют «A», «P», «P», «O»), которые переводят контроллер в режим загрузки прошивки. В этот момент карта примет следующие 512 байт и запустит ее как код.

38

Обычно это не работает, потому что большинство последних карт SD (или eMMC) используют статическое и динамическое выравнивание износа, что означает, что интеллектуальный контроллер интерпретирует вашу инструкцию записи и отображает ее в одном из наименее используемых секторов флэш-памяти.

Единственное, что вы можете сделать, это попытаться связаться с вашими поставщиками и попросить их таблицу данных; могут быть некоторые (специфичные для поставщика) способы получения состояния их алгоритма выравнивания износа. Это потенциально позволит вам запрашивать состояние / использование базовой флэш-памяти. Или вам может не повезти, а этого может и не быть.

Если ваша цель - уничтожить флэш-память, все, что вы можете сделать, - это запустить массивные циклы чтения и записи и постоянно проверять, чтобы данные, которые вы читаете, все еще были согласованными. Например, создайте два больших файла, сохраните их контрольные суммы и прочитайте / запишите их, чтобы проверить их контрольную сумму. Чем больше вспышка, тем больше времени займет этот процесс.

32

Вы можете увеличить износ транзистора, увеличив рабочую температуру. Используйте циклы записи-стирания на нагретый чип (70-120 ° C); это будет носить быстрее.

18

Предисловие: этот параметр требует дополнительных программных и аппаратных модификаций, но он позволяет осуществлять контролируемое чтение, наиболее вероятно, прозрачное для хоста.

SD-карта имеет несколько вариантов ввода / вывода, но ее можно контролировать через SPI. Если вы возьмете SD-карту и измените ее так, чтобы вы могли прикрепить контакты к микроконтроллеру (например, Arduino), вы можете сделать так, чтобы Arduino имитировал SD-карту и был прозрачен для устройства, считывающего SD-карту. Ваш код на микроконтроллере может преднамеренно возвращать неверные данные при необходимости. Кроме того, вы можете поместить SD-карту в микроконтроллер, чтобы показания могли проходить через микроконтроллер к SD-карте, чтобы обеспечить гигабайты тестирования.

15

Я пошел бы на ebay/aliexpress и купил бы самую дешевую SD-карту, которую я могу найти из Китая, ту, которая "слишком хороша, чтобы быть правдой". Они часто поставляются с неисправными секторами или имеют в программном обеспечении гораздо больше, чем есть на самом деле. В любом случае, вы должны получить неисправную SD-карту для тестирования.

11

Когда-то, много лет назад, мне платили за то, чтобы я получил набор выпускных фотографий и видео с SD-карты для довольно расстроенной матери. После тщательного осмотра карта была каким-то образом физически повреждена с видимой трещиной во внешнем корпусе и имела несколько поврежденных секторов, особенно несколько ранних, критических секторов, что делало даже самые надежные программы восстановления в тот момент, когда полностью не считывать карту , Кроме того, инструменты судебной экспертизы тогда стоили целое состояние.

Я закончил тем, что получил SD-карту идентичного бренда / размера и написал свою собственную утилиту для дампа и восстановления исходных данных, чтобы скопировать данные с плохой карты на хорошую. Каждый раз, когда утилита попадает в неисправный сектор, она несколько раз повторяет попытку, прежде чем записать все нули для этого сектора, и вместо того, чтобы сдаваться и останавливаться, игнорирует сбой и переходит к следующему сектору. Попытки повторных попыток были предприняты, так как я также заметил, что в некоторых секторах показатель успешности чтения все еще составляет около 40%. Как только данные были на новой SD-карте, инструменты восстановления, которые ранее не работали, работали безупречно с минимальной потерей / повреждением данных. В целом, около 98% всех файлов были восстановлены. Несколько ранее удаленных элементов также были восстановлены, потому что на самом деле ничего не удалялось - просто помечалось как таковое и медленно перезаписывалось. То, что начиналось как немного скучное занятие по восстановлению данных, стало одним из моих самых запоминающихся и интересных личных проектов по разработке программного обеспечения. Если вам интересно, мать была в восторге.

В любом случае, эта история показывает, что можно физически повредить SD-карту таким образом, что данные все еще доступны, но есть сектора, которые едва функционируют, и что-либо, пытающееся прочитать их, испытывает трудности при этом. Пластик SD-карты, как правило, довольно хрупкий, поэтому сгибание или нарезка на некоторые дешевые могут помочь. Ваш пробег может отличаться.

Вы также можете спросить в некоторых местах восстановления данных в вашем районе. Поскольку они специализируются на восстановлении данных с различных отказавших или вышедших из строя устройств, у них должны быть некоторые полезные входные данные / подсказки и, возможно, даже некоторые готовые SD-карты под рукой (например, в учебных целях), которые вы можете получить от них.

5

Этот ответ является дополнением к комментарию @Ruslan

  1. Заполните SD-карту примерно до 99,9%
  2. Постоянно переписывать содержимое оставшихся 0,1% (Записать A-удалить-записать B-delete - Записать A ...)
  3. Проверьте (периодически), если вы уже сломали карту

Возможная альтернатива:

Не уверен, что это работает для ваших целей, но, возможно, на самом деле этого будет достаточно, чтобы физически повредить вашу карту, что может быть намного быстрее.

3

Некоторые старые SD-карты малой емкости (16 МБ) используют флэш-чипы в пакетах в стиле TSOP/TSSOP. Мастерская, способная к доработке SMT (если вы выполняете встроенную работу, возможно, у вас есть этот навык, в противном случае проверьте, есть ли небольшие компании, занимающиеся ремонтом телефона / ноутбука на уровне платы), можно было бы отделить и заново прикрепить этот чип, чтобы его можно было читать и записывать raw (включая коды ECC) с программатором устройства.

Тем не менее, имейте в виду, что вы будете в основном тестировать:

  • Как ваше устройство будет обрабатывать возможные временные аберрации / икоты, вызванные внутренним исправлением ошибок

и в худшем случае

  • как ваше устройство обрабатывает окончательно сбойную SD-карту.

Если вы просто хотите проверить, как оно ведет себя с ошибочным поведением по какой-либо причине с SD-карты, вероятно, лучше всего просто ввести электрический шум в интерфейсные линии (например, путем установки переключателя шины FET между ними и случайного переключения на короткое время это к источнику бессмысленных сигналов (хотя правильных электрических уровней).

3

Вы можете попробовать ввести нестабильный источник питания или сигнализацию более высокого напряжения.

Я знаю, что распространенная ошибка семейства устройств - это сильная корреляция между повреждением SD-карты и прерывистым контактом батареи.

2

Относительно ответа OlafM, но другого: вы можете запрограммировать собственный микроконтроллер так, чтобы он говорил по протоколу SD-карты, а затем эмулировать любое поведение, которое вам нужно.

1

Возможно, это не то направление, которое вы хотели, но я обнаружил, что удаление моей SD-карты во время чтения с нее радио или ноутбука гарантирует сбой SD-карты примерно в 1/5 или 1/10 раз. Кажется, что карты плохо справляются с отключением питания во время чтения и предположительно записи. После прочтения комментариев Роберта Кэлхуна ниже, это заставляет меня думать, что это может повредить FAT. Хотя я не знаю, почему просто чтение приводит к сбою - не должно быть никаких записей?

1

Область основной загрузочной записи FAT32, вероятно, наиболее подвержена злоупотреблениям, поскольку на логическом уровне она всегда должна находиться в одном и том же месте. (Возможно, это решается мягким переназначением плохих секторов, но я несколько скептически отношусь к тому, что это реализовано на всех аппаратных средствах.) Таким образом, вы можете запустить sfdisk в цикле и посмотреть, сможете ли вы разрушить его таким образом.

Но я попрошу вас сделать все возможное, чтобы повысить надежность оборудования, вместо того, чтобы пытаться работать с плохим оборудованием в программном обеспечении. Проблема в том, что SD-карты выходят из строя разными способами. Они становятся нечитаемыми, они перезаписываются, дают неверные данные, они истекают во время операций и т.д. Попытка предсказать все возможные ошибки карты очень трудна.

Вот один из моих любимых сбоев, "режим больших данных":

Bad SD поддельные большие данные

SD-карты - это потребительские товары широкого потребления. Части быстро меняются, и данные трудно найти. Поддельный товар не случайно. Что касается дешевого хранилища, то его сложно превзойти, но, хотя твердотельные накопители отдают приоритет надежности, для SD-карт приоритет - скорость, емкость и стоимость (вероятно, не в таком порядке).

Ваша первая линия защиты - использовать съемную деталь eMMC с реальной таблицей данных от известного производителя вместо съемной SD-карты. Да, они стоят больше за ГБ, но часть будет в производстве в течение более длительного периода времени, и, по крайней мере, вы знаете, что вы получаете. Пайка детали также позволяет избежать целого ряда потенциальных проблем (срыв карт во время записи, плохой электрический контакт и т.д.) Со съемной картой.

Если вашему продукту требуется съемное хранилище или уже слишком поздно что-либо менять, подумайте о том, чтобы потратить дополнительные деньги на карты "промышленного" класса или относиться к ним как к одноразовым предметам. То, что мы делаем (под linux), это fsck карты при загрузке и переформатируем ее, если сообщается о каких-либо ошибках, так как переформатирование приемлемо в этом случае использования. Тогда мы fsck его снова. Если после переформатирования он все еще сообщает об ошибках, мы отправляем его в RMA и заменяем аппаратное обеспечение более новым вариантом, использующим eMMC.

Удачи!

1

Если ваша SD-карта отформатирована в FAT32, вы можете отредактировать 2 жира в шестнадцатеричном формате и пометить сектор как плохой с правильным шестнадцатеричным кодом. Это всего лишь хитрость, если вы хотите провести логическое тестирование программного обеспечения, которое должно найти плохой сектор в этом конкретном месте; это также не повредит вашей SD-карте, переформатирование вернет ее в нормальное состояние.

0

Интересно, можно ли создать скрипт Linux badblocks для повторного выполнения своего разрушительного теста в одном секторе в течение нескольких часов.

В одном секторе - нет, потому что код выравнивания износа внутри SD-карты будет отображать логические блоки повсюду.

Но вы можете легко запустить badblocks -w в цикле , пока он не вызывает некоторые плохие блоки появляться. Примерно так должно работать:

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

при условии, что badblocks возвращает 0, если не было обнаружено плохих блоков, и ≠ 0 в противном случае (на странице руководства ничего не сказано, а я не проверял исходный код).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .