Жизнь после Trim: как восстановить удалённые данные с накопителей SSD

Декабрь 21st, 2018, Oleg Afonin
Рубрика: «Аппаратное обеспечение», «Новости индустрии», «Полезные советы», «Программное обеспечение»
  • 15
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
    15
    Shares

Благодарности: эта статья не вышла бы в свет без подробных консультаций Романа Морозова, руководителя техподдержки ACELab.

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

До недавнего времени единственной возможностью получить доступ к удалённым блокам была трудоёмкая процедура извлечения чипов NAND и прямого считывания информации (с последующей реконструкцией адресации). Сейчас же, наконец, появилась разумная альтернатива. Попробуем разобраться в механизмах хранения и удаления информации на современных SSD и попытаемся восстановить данные в удалённых блоках.

В данной статье не описывается, но представляет отдельный интерес уязвимость популярного алгоритма шифрования дисков BitLocker, являющегося составной частью Windows. Как обнаружили исследователи, вместо программного шифрования с использованием центрального процессора BitLocker может использовать контроллер SSD для шифрования данных. Соответственно, низкоуровневый доступ к SSD позволяет найти ключ шифрования данных и расшифровать содержимое такого накопителя.

Как SSD хранит данные

В отличие от магнитных дисков, данные на которых записываются более или менее последовательно (хотя и традиционным накопителям можно припомнить и таблицы переадресации плохих блоков, и особенности записи SMR), в SSD накопителях ни о какой линейной записи не идёт и речи. Данные разбиваются на блоки, которые будут записаны на нескольких чипах NAND в параллельном режиме (именно благодаря параллельной записи и достигаются столь высокие скорости передачи данных). Уже на этом этапе мы имеем запись, в чём-то подобную записи информации на массив RAID 0 (stripe). Но даже в рамках одной микросхемы данные не сохраняются в линейной последовательности. Связано это с механизмом переадресации блоков.

Необходимость в переадресации физических блоков NAND изначально возникла в рамках борьбы с преждевременным износом ячеек. Как известно, недостаток NAND SSD — ограниченное количество циклов перезаписи. Как правило, производители гарантируют работу накопителя в пределах 1000-1500 циклов перезаписи. В силу таких факторов, как повышенный фактор write amplification (коэффициент, показывающий, какое количество физических ячеек должно быть перезаписано для сохранения определённого объёма информации), это число может быть существенно ниже (более подробно об этом мы поговорим в следующей статье).

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

Все эти сложности приводят к тому, что даже при извлечении чипов восстановить один единственный файл будет очень и очень сложно. Для начала придётся разобраться в адресации, узнав, какие диапазоны адресов и на каких именно чипах соответствуют каждому блоку данных, адресуемому по протоколу SATA. Эта информация хранится в таблице трансляций SSD (Translation table); форматы таблиц различаются в зависимости от модели контроллера. Если таблица трансляций повреждена, то восстановить линейную файловую систему в процессе анализа отдельных чипов будет очень и очень сложно, а для моделей с десятью и более чипами – практически невозможно в силу чрезмерной трудоёмкости.

Дополнительные трудности

Мы привыкли, что стоимость электроники снижается год от года. Чтобы остаться на плаву, производители SSD вынуждены постоянно снижать себестоимость, используя всё более тонкие версии технологического процесса и увеличивая плотность хранения данных. Если несколько лет назад были распространены SSD, в каждой ячейке которых могло храниться до двух бит информации (MLC), то сейчас на полках магазинов лежат диски, выполненные по технологии TLC, а самые дешёвые модели (например, новая линейка Samsung 860 QVO) и вовсе используют технологию QLC с сохранением 4 бит в каждой ячейке. Всё это приводит к резкому падению как скорости работы накопителей, так и надёжности хранения данных:

Чтобы сохранить приемлемую надёжность и скорость работы накопителей, основанных на всё менее качественных чипах памяти, производители SSD с каждым годом вынуждены усложнять алгоритмы и способы хранения данных. Только таким образом можно оптимизировать работу дисков, чтобы показать приемлемый ресурс и скорость работы.

Так, в современных TLC и QLC накопителях (а также некоторых моделях с MLC чипами) используется довольно объёмная буферная область, данные в которую записываются в режиме SLC. При необходимости данные из буфера будут уплотнены и перезаписаны в режиме MLC или TLC, но в зависимости от модели они могут достаточно длительное время храниться в оригинальном состоянии. Извлекать информацию из подобных чипов минуя контроллер – отдельная головная боль.

Аппаратное шифрование

Мы не будем вдаваться в подробности аппаратного шифрования SSD накопителей. Достаточно упомянуть, что возможность включить аппаратное шифрование присутствует в большинстве современных моделей, а на ряде устройств шифрование активно «из коробки». При этом пользователь может ничего не знать о том, что внутри накопителя данные зашифрованы: вплоть до момента «включения» шифрования пользователям через соответствующее приложение данные будут зашифрованы криптографическим ключом, который будет храниться в открытом виде и доступен по умолчанию. Но стоит «включить» шифрование, как криптографический ключ будет мгновенно зашифрован ключом шифрования ключа (прошу прощения за тавтологию); теперь для доступа к данным потребуется сначала восстановить ключ шифрования.

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

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

Как SSD удаляет данные: ещё более сложно

Помимо ограниченного ресурса записи отдельных ячеек, у NAND-памяти, используемой в SSD, есть ещё одна особенность. Запись в ячейку занимает больше времени, чем чтение, но повторная запись в уже записанную ячейку будет медленнее в разы. Дело в том, что записать свежую порцию данных можно только в пустую ячейку. Если в ячейке уже содержатся данные, то для её перезаписи данные нужно сначала удалить, полностью очистив ячейку. Процесс очистки ячейки –весьма медленный; более того, невозможно очистить лишь одну ячейку. Почему так? Разберёмся в терминологии.

Базовый элемент хранения данных в SSD – ячейка. Одна ячейка – это один бит информации, или два, или три, или четыре — в зависимости от типа памяти, установленного в SSD (SLC, MLC, TLC или QLC) и от заряда, который туда записали. К примеру, жёсткие диски Crucial MX550, оборудованные TLC памятью с трёхмерной компоновкой (хранится три бита данных в каждой ячейке), для ускорения записи могут использовать часть ячеек в режиме SLC (один бит данных в ячейке). В этом режиме заряд в ячейке может быть ниже, чем при записи в режиме TLC, скорость записи – выше, а износ такой ячейки будет меньше.

Можно ли в SSD считать или записать в конкретную ячейку данных? Нет, нельзя, и вот почему. Со времён магнитных накопителей мы привыкли работать с секторами (512 байт). Именно с секторами работают и оперируют все файловые системы. Однако память NAND не оперирует понятием «сектор». Вместо этого используются «страницы», которые объединяются в «блоки».

Страница — группа байтов; как правило, размер страницы в байтах — 528, 2112, 4320, 8640, 9216, 18592 и т. д. Страница — всегда минимальный объем байт, который мы можем считать с NAND Flash памяти за один такт. Нужен всего один байт информации? Будет считана целая страница, включая нужный байт.

Каждая страница содержит в себе данные (их объём кратен степени двойки, к примеру 512, 2048, 4096, 8192, 16534 байт) и служебную область (маркеры и коды ЕСС коррекции на каждую страницу). Таким образом две страницы размером 8640 и 9216 отличаются только мощностями ЕСС коррекции, т. к. в обе можно записать максимум по 16 секторов с данными (т. е. 8192 байта данных + служебные маркеры + ЕСС).

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

Блок — это группа страниц. Довольно большая группа; как правило, размер блока составляет 64, 128 256 или 512 страниц. Контроллеры SSD считывают данные страницами, а записывают и стирают — сразу целыми блоками.

Как мы помним, количество циклов записи в память NAND ограничено, и оно довольно невелико. Соответственно, контроллер SSD пытается минимизировать повторное использование блоков в рамках существующих ограничений.

Вот так может выглядеть попытка изменить всего один байт информации:

  1. Контроллер считает блок данных с NAND памяти в ОЗУ
  2. Сотрёт блок в NAND памяти
  3. Изменит байт в блоке ОЗУ
  4. Запишет измененный блок с измененным байтом обратно на NAND память, но уже в другое место для выравнивания износа

Итак, при записи каждой новой порции информации контроллер SSD постарается использовать блоки с наименьшим количеством перезаписей. На практике это означает то, что в процессе записи новой порции данных в блок с определённым адресом контроллер SSD осуществит моментальную подмену адресов: нужный «физический» адрес будет назначен другму, незанятому блоку, а ранее записанный блок получит другой адрес или вовсе уйдёт в неадресуемый резервный пул. Контроллер пометит блок как неиспользуемый, чтобы в свободное время очистить его содержимое, подготовив блок к записи очередной порции данных.

Резервные ячейки

Фактическая ёмкость любого SSD накопителя как минимум на 5-10% превышает паспортный объём. Так, накопители Crucial BX предлагают 480 ГБ, а серия MX – 500 ГБ доступной памяти. Фактический объём обеих моделей – 512 ГБ. Недостающие гигабайты составляют резервный пул, в котором содержатся подменные ячейки для переадресации плохих блоков и ускорения записи.

В разных накопителях ёмкость резервного пула может быть и больше. Ёмкость современных чипов не кратна степени двойки, как это было раньше. В современных накопителях одна микросхема может содержать, к примеру, 8.7 ГБ вместо заявленных восьми.

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

Даже если единственной операцией на диске будет запись в небольшой файл подкачки Windows, благодаря переадресации блоков на уровне контроллера «забитыми» информацией вскоре окажутся все блоки без исключения, включая блоки из резервного пула. Эту проблему производители решают при помощи механизма фоновой очистки данных, своеобразной сборки мусора. О том, какие именно блоки можно и нужно очистить, контроллеру сообщит операционная система посредством команды Trim. Если пользователь удалит файл, отформатирует диск или создаст раздел, система передаст контроллеру SSD список блоков, которые более не содержат полезных данных и должны быть очищены.

В статье «Заметаем следы. Как уничтожить данные быстро и безвозвратно» мы рассмотрели механизм удаления информации с SSD. Посредством команды Trim контроллеру передаётся массив адресов блоков, которые должны быть очищены. С этого момента начнётся фоновый процесс удаления данных из блоков. Дальнейшее никак не зависит от действий пользователя или операционной системы: алгоритмы контроллера начнут очистку ненужных блоков и продолжат её, даже если извлечь SSD из компьютера и установить его в другой компьютер. Не поможет и специализированное устройство для блокировки записи (как раз такие используют в полиции для снятия образа дисков).

Да, SSD самостоятельно «удаляют улики» и «заметают следы»

Итак, мы выяснили, что если на диск случайно или неслучайно будет подана команда Trim, данные будут удаляться в фоновом режиме – в том числе непосредственно в то время, когда эксперт снимает образ диска. Для того, чтобы запустился процесс сборки мусора, на диск будет достаточно подать питание – не обязательно даже подключать его к шине SATA. Таким образом, SSD действительно «заметают следы» и «уничтожают улики» совершенно самостоятельно и независимо от действий или бездействия специалиста по извлечению данных.

А что будет, если всё же попробовать считать данные из «удалённых» ячеек, до которых сборщик мусора ещё не успел добраться? В конце концов, нам известно, что сброс данных из ячеек – процесс далеко не мгновенный, а наоборот – достаточно длительный. Быстрое форматирование всего раздела запустит процесс сборки мусора, но процесс этот будет отрабатывать в течение достаточно длительного времени – до получаса на достаточно ёмких накопителях.

Применение в SSD накопителях механизма сборки мусора и команды Trim сильно осложняет или делает невозможным доступ к удалённой информации. Если в процессе попытаться считать данные из ячеек, на которые уже поступила команда Trim, но которые ещё не были физически очищены, то результат будет зависеть от реализации механизма «данные после Trim» в конкретной модели накопителя. Современный SSD может работать только в одном из трёх режимов:

  1. Non-deterministic Trim: неопределённое состояние. Контроллер может вернуть фактические данные, нули или что-то ещё, причём результат может различаться между попытками (SATA Word 169 bit 0). В настоящее время почти не встречается, хотя безымянные китайские накопители могут удивить.
  2. Deterministic Trim (DRAT): контроллер гарантированно возвращает одно и то же значение (чаще всего, но не обязательно нули) для всех ячеек после команды Trim (SATA Word 69 bit 14). Самый распространённый вариант.
  3. Deterministic Read Zero after Trim (DZAT): гарантированное возвращение нулей после Trim (SATA Word 69 bit 5). Часто встречается в дисках, предназначенных для работы в составе RAID массивов.

Определить, к какому типу относится конкретная модель SSD, можно при помощи команды hdparm –I.

Пример использования:

$ sudo hdparm -I /dev/sda | grep -i trim

*    Data Set Management TRIM supported (limit 1 block)

*    Deterministic read data after TRIM

С практической точки зрения это означает только одно: сразу после удаления данных (хоть отдельно по одному файлу, хоть путём форматирования, даже быстрого, хоть разбивкой разделов) информация станет недоступной для чтения как с компьютера, так и на специальном стенде. Обычными способами, даже посредством низкоуровневых команд, получить доступ к реальному содержимому ячеек после Trim невозможно.

Жизнь после Trim: технологический режим SSD

Долгое время считалось, что извлечь данные из блоков SSD, к которым была применена команда TRIM, но данные из которых фактически ещё не были очищены, можно только путём скорейшего обесточивания устройства и физического извлечения микросхем памяти. Этот путь долог и труден; он требует наличия высокой квалификации и специального оборудования. Извлечение данных из накопителя всего с четырьмя микросхемами NAND памяти может занять до двух недель, а работать с накопителями с десятью микросхемами согласится далеко не каждая лаборатория.

До недавнего времени альтернативы этому способу не существовало. Включение SSD неизбежно приводило к удалению данных, даже если диск подключался через специальный адаптер, блокирующий операции записи на уровне SATA. И тем не менее, выход есть, и название ему – технический режим.

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

Находясь в технологическом режиме, накопитель может принимать и выполнять низкоуровневые команды, поступающие извне по ATA интерфейсу (разумеется, и по любому другому – например, USB или PCI-E, в зависимости от используемого типа внешнего интерфейса). Работая в обычном режиме, накопитель не может выполнять низкоуровневые команды, а в технологическом режиме — может.

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

Какие производители используют технологический режим?

Технологический режим используют все без исключения производители устройств для хранения информации, оборудованных контроллером. Даже маленькая флешка прямиком из подвалов Гуанчжоу будет обладать технологическим режимом, описанным в спецификациях производителя контроллера (например, популярного Phison PS2251-07). Технологический режим доступен как в SATA накопителях, так и в устройствах с интерфейсами NVME, USB и другими.

Возможности технологического режима

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

  • Чтение «сырых» данных из физического блока без преобразований (аналог чтения микросхем, но без выпаивания чипов; потребуется декодирование данных, т.к. блок содержит информацию, закодированную для коррекции ошибок)
  • Считывание определенного логического блока с преобразованиями (устранение MIX между страницами и блоками, выполнение преобразования страницы с отделением данных и служебных байтов с ЕСС друг от друга, расшифровка данных силами контроллера)
  • Для зашифрованных накопителей — поиск модуля с ключом-паролем. Этот момент представляет особый интерес для правоохранительных органов и экспертов-криминалистов; он заслуживает отдельного рассмотрения в отдельной статье. Здесь мы лишь отметим, что популярный алгоритм шифрования дисков BitLocker, работающий в качестве встроенной защиты в Windows 10, на SSD часто использует контроллер SSD для шифрования данных. Соответственно, использование технологического режима позволяет найти ключ шифрования данных и расшифровать содержимое накопителя, защищённого, казалось бы, надёжным методом BitLocker.
  • Чтение блоков, выходящих за пределы трансляции (блоки из категорий remapped, relocated и reserved)
  • Чтение атрибутов SMART
  • Поиск и чтение служебных блоков, содержащих микропрограмму управления SSD
  • Сохранение служебных структур в файл для последующего анализа

Отдельно отметим две важнейших особенности доступа к данным из технологического режима. Первая особенность – это временное отключение фоновых процессов контроллера, включая процесс «сборки мусора», который в фоновом режиме очищает блоки после команды Trim. Вторая – полноценный доступ к неадресуемым блокам из резервного пула (overprovisioned area). Что это означает на практике? По сути, эти две особенности переворачивают сложившуюся картину мира, в которой эксперт не может остановить уничтожение улик без выпаивания микросхем памяти.

Как мы помним, команда Trim подаётся контроллеру со стороны операционной системы. Посредством этой команды операционная система даёт накопителю знать, что те или иные блоки больше не нужны системе и не содержат полезных данных. Остальное – дело уже самого контроллера. В первую очередь блоки помечаются как неиспользуемые. Дальнейшее зависит от множества факторов: нагрузки на накопитель (производятся ли операции ввода-вывода, если да – насколько интенсивные), мощности контроллера и управляющей им микропрограммы. Нам попадались накопители, которые приостанавливали операции ввода-вывода (фактически, пользователь наблюдал временный «фриз» накопителя) до завершения очистки блоков после Trim. Попадались и такие модели, которые запускали процесс очистки лишь спустя несколько секунд после падения загруженности накопителя. Наконец, мы встречали модели, которые отрабатывали команду Trim, что называется, «спустя рукава»: блоки подвергались очистке только тогда, когда подходил к концу запас свободных блоков как в адресной зоне накопителя, так и в неадресуемом резервном пространстве overprovisioned area.

Неадресуемое резервное пространство в SSD – это дополнительные блоки памяти, которые не входят в официально заявленную ёмкость накопителя. Как правило, ёмкость SSD больше заявленной. Каждый производитель может зарезервировать ту или иную ёмкость под те или иные нужды. Дополнительная область памяти идёт на резервную область под переназначение секторов, SLC кэш и на область хранения микропрограммы. У каждого производителя свои приоритеты, поэтому на одном и том же наборе микросхем NAND суммарной ёмкостью 530 ГБ (мы помним, что физический объём современных микросхем не всегда кратен двойке) можно создать накопители с официально доступным пользователю объёмом в 480, 500, 512 и даже 525 ГБ.

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

Использование технологического режима для извлечения информации

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

В общем виде процедура извлечения данных с SSD с использованием технологического режима выглядит так.

Первое и самое главное: перед тем, как подать напряжение, SSD необходимо перевести в технологический режим или его аналог (Factory Mode, Safe Mode и так далее). Для каждой модели контроллера и каждой модели SSD, не говоря уже о разных производителях, способ перевода устройства в технологический режим будет отличаться. Но прежде всего необходимо заблокировать контроллеру доступ к микросхемам памяти. Такая блокировка осуществляется замыканием служебных контактов на плате PCB. Она предотвращает считывание и инициализацию микропрограммы с микросхем памяти; соответственно, контроллер не может считать таблицу переадресаций и не запустит процесс «сборки мусора». Блокировка доступа к микросхемам памяти поможет инициализировать и повреждённый накопитель, который уходит в круговой цикл «загрузка микрокода — ошибка — сброс — загрузка микрокода», так как в этом случае контроллеру невозможно отправить команду на активацию технологического режима ввиду его загруженности (это выражается постоянно активной ATA-коммандой BSY-state).  Вот так выглядит блокировка доступа к микросхемам памяти популярного, хоть и устаревшего накопителя Crucial BX100:

Далее мы используем комплекс PC-3000 (разработка AceLab) для перевода накопителя в технологический режим, который производится путем отправки специальной команды в контроллер SSD. Наконец, в ОЗУ контроллера загружается код микропрограммы LDR, которой впоследствии будет передано управление.

Если микропрограмма загружена успешно, следующим шагом будет восстановление таблицы трансляций, при помощи которой физические адреса переадресуются в логические. Таблица трансляций будет считана с микросхем памяти SSD. Повреждённые таблицы трансляций будут при необходимости пересобраны.

Таблицу трансляций необходимо загрузить в оперативную память (ОЗУ) контроллера:

Далее используется приложение Data Extractor, посредством которого осуществляется извлечение данных из накопителя. Данные сохраняются в виде образа. Обращаем внимание, что в этом режиме можно получить доступ и к тем блокам, для которых контроллером уже получена команда Trim, но содержимое которых ещё не было стёрто.

Данные можно извлечь и в виде файловой системы.

Заключение

Мы рассмотрели особенности хранения и удаления данных на современных твердотельных накопителях и предложили использовать технологический режим SSD для извлечения данных в качестве менее трудоёмкой альтернативы извлечению микросхем NAND памяти.


  • 15
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
    15
    Shares
НАШИ НОВОСТИ