Комментарии 35
обычное стирание не гарантирует невозможность восстановления информации
Народная мудрость гласит:-
что написано пером (то бишь на флэшку), того не вырубить топором!
Правда, когда речь идёт о стирании отдельных файлов, а не всего диска целиком, возникает ряд других нюансов, типа остаточных данных в NTFS. Или, если говорить об SSD (не знаю, относится ли то же самое к Flash-накопителям) — нельзя напрямую перезаписать конкретные ячейки, поскольку контроллер сам решает, куда писать новые данные.
Таким образом, для безопасного стирания информации в Flash памяти лучше всего подходит метод «запись инверсных данных и стирание»А что, если после такой очистки ещё раз записать инверсный образ? Предполагаю, что шахматный узор проявится. Поэтому для безопасного стирания после инверсной записи обязательно нужен цикл псевдослучайной записи, ну и цикл стирания в конце.
Если реализовать механизм, который позволит понять сколько заряда нужно залить/слить с затвора конкретного бита, чтобы он инвертировался, то можно будет понять какое реальное значение бита было до стирания.Вся статья как раз и описывает такой механизм. При этом показано, что образ инверсной записи рандомизирует уровни ячеек лучше, чем псевдослучайный образ.
Собственно, я комментировал только то, что злоумышленник не может при попытке восстановить данные записать инверсный образ. Если бы он имел такой образ — по сути он имел бы сами восстанавливаемые данные и смысла восстанавливать их не было бы.
Все это не отменяет возможности повысить надежности стирания дополнительно записав рандомизированный образ. Хотя потребность в этом, судя по результату в 50,1% — сомнительна.
Довольно красиво попытались подойти к решению данной проблемы в Android: данные шифруются ключами, в вычислениях которых среди прочего хешируется сгенерированный при создании ключа массив случайных данных secdiscardable размерами порядка десятков КБ. При удалении ключа (например при сбросе телефона к начальным установкам) первым делом затирается этот массив, а для успешного восстановления ключа (без которого данные — «тыква») необходимо 100% качество его восстановления. Однако что произойдёт в ячейках flash конкретной модели телефона в ответ на желание ОС сделать этому массиву secure trim, большой вопрос — слишком много уровней абстракции между ними. У Apple же с их вертикальной интеграцией были все возможности сделать «как надо» (ну или «как не надо», кто их знает).
Так вот, все выше описанное действительно, только в том случае если исходная информация во Flash память была записана 10 000 (десять тысяч) раз.Возникает вопрос, является ли результат вашей работы следствием именно восстановления уровней ячеек, или же вы нашли хитрый способ определять степень их деградации?
По сути, записав и стерев данные 10000 раз, вы вероятно измените физические характеристики ячеек по-разному, в зависимости от того 0 или 1 туда были записаны. А позже ваш алгоритм определит это изменение, по сути, считав не данные, а степень износа ячеек.
В эту теорию отлично укладывается эффект с записью инверсного образа. Естественно, что деградация ячеек в этом случае будет равномерной.
А если вы использовали одну и ту же случайную последовательность при каждом стирании — то и этот результат будет предсказуем. Там, где в последовательности были 1 — деградация будет равномерной, где 0 — нет. В итоге вы «испортите» результат в половине случаев. 50%+50%/2 = 75% что близко в полученным 78%. (Разные случайные последовательности на деле дадут похожий результат, так как будут изнашивать ячейки равномерно на всем диапазоне).
Все это конечно предположения. Но если так — то результат со считыванием 10000 разных плат — конечно предсказуем. Ничего не получится.
1. достаточно одной записи инверсной информации, что бы ячейки выровнялись.
2. В ходе расчета модели микросхемы — «фона» — выполняется многократное записывание и стирание, при этом мы не заметили какое либо изменение этих моделей.
Ну и самое главное, цель была дать рекомендации на основании каких либо реальных данных об успешности атаки. Атаковать мы смогли только на этом эффекте (не важно на чем он основан) и дали рекомендации по защите от атаки на этом эффекте.
Было бы интересно проверить что будет, если после записи инверсного образа — опять продолжить записывать исходный массив. Потребуется ли снова 10000 циклов записи, или тот же статистический результат будет получен быстрее? Что-то вроде теста на эффект памяти.
Если эффект будет — то вероятно физика процесса все же завязана на деградации ячеек. Возможно, например, что деградация наблюдается только в ячейках с «1», и узнать, что ячейка деградировала можно только если там «1». Тогда если заполнить все ячейки «1», при чтении вы определите деградировавшие ячейки, а если записать инверсный образ — нет.
Таким образом, для безопасного стирания информации в Flash памяти лучше всего подходит метод «запись инверсных данных и стирание»
Вместо инверсии можно было записать все единицы с тем же эффектом, но быстрее, т.к. не надо было бы считывать блок перед записью.

Это как раз граница секторов.
На сколько я понял в микросхеме 8 чипов памяти по 2 Мбит.
На этой картинке два сектора по 2048 бит?
Интересно было бы глянуть картину по всей памяти.
Закажите исследование? Имеем соответствующую базу, методологию и опыт.
Восстановление стертой информации во Flash памяти на физическом уровне