Pull to refresh

Comments 35

обычное стирание не гарантирует невозможность восстановления информации

Народная мудрость гласит:-


что написано пером (то бишь на флэшку), того не вырубить топором!
Собственно, наиболее распространённый алгоритм в различных программах для безвозвратного удаления данных — DoD 5220.22-M — как раз и предполагает запись нулей, единиц и случайного паттерна, а не просто многократное стирание. И обычно с пояснением пользователю, что однократная перезапись нулями — это быстрее, но не безопасно.
Правда, когда речь идёт о стирании отдельных файлов, а не всего диска целиком, возникает ряд других нюансов, типа остаточных данных в NTFS. Или, если говорить об SSD (не знаю, относится ли то же самое к Flash-накопителям) — нельзя напрямую перезаписать конкретные ячейки, поскольку контроллер сам решает, куда писать новые данные.
Таким образом, для безопасного стирания информации в Flash памяти лучше всего подходит метод «запись инверсных данных и стирание»
А что, если после такой очистки ещё раз записать инверсный образ? Предполагаю, что шахматный узор проявится. Поэтому для безопасного стирания после инверсной записи обязательно нужен цикл псевдослучайной записи, ну и цикл стирания в конце.
Если у нас есть инверсный образ то ничего восстанавливать нам уже не нужно.
В явном виде инверсного образа, конечно, нет, т.к. носитель «стёрт», но значение заряда в плавающем затворе будет коррелировать с данными, которые были записаны ранее. Если реализовать механизм, который позволит понять сколько заряда нужно залить/слить с затвора конкретного бита, чтобы он инвертировался, то можно будет понять какое реальное значение бита было до стирания. А цикл записи (лучше несколько) псевдослучайного образа после инверсной записи нарушит эту корреляцию.
Если реализовать механизм, который позволит понять сколько заряда нужно залить/слить с затвора конкретного бита, чтобы он инвертировался, то можно будет понять какое реальное значение бита было до стирания.
Вся статья как раз и описывает такой механизм. При этом показано, что образ инверсной записи рандомизирует уровни ячеек лучше, чем псевдослучайный образ.

Собственно, я комментировал только то, что злоумышленник не может при попытке восстановить данные записать инверсный образ. Если бы он имел такой образ — по сути он имел бы сами восстанавливаемые данные и смысла восстанавливать их не было бы.

Все это не отменяет возможности повысить надежности стирания дополнительно записав рандомизированный образ. Хотя потребность в этом, судя по результату в 50,1% — сомнительна.

Довольно красиво попытались подойти к решению данной проблемы в Android: данные шифруются ключами, в вычислениях которых среди прочего хешируется сгенерированный при создании ключа массив случайных данных secdiscardable размерами порядка десятков КБ. При удалении ключа (например при сбросе телефона к начальным установкам) первым делом затирается этот массив, а для успешного восстановления ключа (без которого данные — «тыква») необходимо 100% качество его восстановления. Однако что произойдёт в ячейках flash конкретной модели телефона в ответ на желание ОС сделать этому массиву secure trim, большой вопрос — слишком много уровней абстракции между ними. У Apple же с их вертикальной интеграцией были все возможности сделать «как надо» (ну или «как не надо», кто их знает).

А как вы делали дозаписи в микросхему? Это за счет регулирования времени отключения питания?
я не смогу ответить на этот вопрос.

Уточните хотя бы почему=) NDA?

Скорее ноу-хау, которое не хочется раскрывать.
Так вот, все выше описанное действительно, только в том случае если исходная информация во Flash память была записана 10 000 (десять тысяч) раз.
Возникает вопрос, является ли результат вашей работы следствием именно восстановления уровней ячеек, или же вы нашли хитрый способ определять степень их деградации?

По сути, записав и стерев данные 10000 раз, вы вероятно измените физические характеристики ячеек по-разному, в зависимости от того 0 или 1 туда были записаны. А позже ваш алгоритм определит это изменение, по сути, считав не данные, а степень износа ячеек.

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

А если вы использовали одну и ту же случайную последовательность при каждом стирании — то и этот результат будет предсказуем. Там, где в последовательности были 1 — деградация будет равномерной, где 0 — нет. В итоге вы «испортите» результат в половине случаев. 50%+50%/2 = 75% что близко в полученным 78%. (Разные случайные последовательности на деле дадут похожий результат, так как будут изнашивать ячейки равномерно на всем диапазоне).

Все это конечно предположения. Но если так — то результат со считыванием 10000 разных плат — конечно предсказуем. Ничего не получится.
Да, мы так же склоняемся к версии, что эффект основан на деградации ячейки, но в тоже время есть и факты опровергающие это:
1. достаточно одной записи инверсной информации, что бы ячейки выровнялись.
2. В ходе расчета модели микросхемы — «фона» — выполняется многократное записывание и стирание, при этом мы не заметили какое либо изменение этих моделей.

Ну и самое главное, цель была дать рекомендации на основании каких либо реальных данных об успешности атаки. Атаковать мы смогли только на этом эффекте (не важно на чем он основан) и дали рекомендации по защите от атаки на этом эффекте.
Если записать N раз одну шахматную доску, а затем M раз инвертированную, то меняя количество N и M можно проверить является ли данных эффект «деградацией». Если это деградация ячеек, то проявляться будет та шахматная доска, которая записывалась больше раз. Если нет, то та, которая записана последней.
Я нисколько не преуменьшаю ценность полученных данных. Просто интересно на чем основан эффект.

Было бы интересно проверить что будет, если после записи инверсного образа — опять продолжить записывать исходный массив. Потребуется ли снова 10000 циклов записи, или тот же статистический результат будет получен быстрее? Что-то вроде теста на эффект памяти.

Если эффект будет — то вероятно физика процесса все же завязана на деградации ячеек. Возможно, например, что деградация наблюдается только в ячейках с «1», и узнать, что ячейка деградировала можно только если там «1». Тогда если заполнить все ячейки «1», при чтении вы определите деградировавшие ячейки, а если записать инверсный образ — нет.
UFO just landed and posted this here
При разовых записях нам не удалось как либо восстанавливать информацию, но на уровне ощущений, будет восстановлен образ второй записанной информации.
Таким образом, для безопасного стирания информации в Flash памяти лучше всего подходит метод «запись инверсных данных и стирание»

Вместо инверсии можно было записать все единицы с тем же эффектом, но быстрее, т.к. не надо было бы считывать блок перед записью.
Не совсем так, во Флеш осуществляется запись 0. Чистая, незапрограммировнная ячейка = 1. Поэтому то что вы предлагаете эквивалентно рассмотренному методу запись во все ячейки «0». Но этот метод хуже, чем запись инверсной информации.
Последний график начинается от 100 циклов записи. Это количество циклов записи последней информации? Но ведь на практике никто не записывает одну и ту же информацию по 100 раз. Как работает алгоритм восстановления при однократной записи? Может быть вообще нет смысла заморачиваться, если при однократной записи достаточно простого способа удаления?
Может и нет, а может и да. То что мы не смогли — не говорит о том, что это невозможно. А значит для заказчика — это возможно. В данном случае идет классическая борьба способов нападения и защиты. Нашли брешь (может быть и всего навсего потенциальную) — предложили защиту, которая обязательно должна быть реализована
Интересно, откуда берётся явно видимый вертикальный градиент.

image

Это как раз граница секторов.

А что за сектора?
На сколько я понял в микросхеме 8 чипов памяти по 2 Мбит.

На этой картинке два сектора по 2048 бит?
Интересно было бы глянуть картину по всей памяти.

В микросхеме один кристалл. На нем 8 секторов. Это одинаковые по схемотехнике независимые блоки. Внутри сектор еще делится на сектора. Картинка отображает маленький кусочек.

Так вот и интересно, эта граница отражает какие сектора? Явно же не логические, а именно физически разные блоки.
Ещё остаётся вопрос, как оно ведёт себя на разных типах флеша — NAND и NOR.
Исследуемая микросхема NOR типа.
У NOR-а главная проблема — объём и как следствие цена за мегабайт. Хотя исходя из данных — исследования были на какую-то тему типа «гарантированное уничтожение ключевой информации», а тут малый объём вполне себе подходит. Интересно, как в таком ключе себя покажет NAND.

Закажите исследование? Имеем соответствующую базу, методологию и опыт.

Увы, для обыкновенного физ. лица это неподъёмные деньги.
Есть стойкие подозрения, что в NAND всё будет печальнее — там доступ к конкретному транзистору-биту идёт через принудительно открытые все остальные транзисторы той же NAND-цепочки, возникает взаимное влияние. Про read/write disturb слышали? — даже чтение может утянуть соседние по цепочке биты в другие состояния. Адищще.
А исследовалось ли, насколько восстановимость информации зависит от того, как долго ячейка пробыла в заполненном состоянии?
Нет, Исследование и так заняло 4 месяца. Но по физике процесса скорее всего не должно быть зависимости, носители заряда в диэлектрике статичны.
Sign up to leave a comment.

Articles

Change theme settings