Цифровая криминалистика давно вышла за пределы жестких дисков. Современные SSD — быстрые, компактные, но при этом коварные с точки зрения сохранности данных. Особое внимание заслуживает команда TRIM, напрямую влияющая на то, сможет ли криминалист получить доступ к удалённым данным. В этой статье мы расскажем, почему контрольные суммы при снятии образов с некоторых SSD могут не совпадать — и почему на современных дисках так не происходит.
Команда TRIM (в терминах SCSI её аналог — UNMAP) — это просто одна из стандартных команд протоколов SATA или NVMe, такая же, как любая команда блочного ввода-вывода. Её может подать хост, то есть операционная система. При удалении файла, создании раздела или форматировании раздела ОС формирует список логических адресов (LBA), которые она объявляет незанятыми, и отправляет этот список контроллеру SSD.
Контроллер, получив команду, помечает указанные LBA как пустые. Он не обязан сразу стирать физические ячейки — и в этом заключается и основная особенность TRIM, и источник недопониманий о том, как работает механизм. Всё остальное — даже то, какие именно данные в какой момент времени будет возвращать контроллер после получения команды TRIM — зависит от прошивки, архитектуры и заводских настроек накопителя.
Итак, мы разобрались с командой TRIM: это всего лишь команда, которую отдаёт операционная система и в которой перечисляются адреса освобождаемых (в случае удаления файла) или неиспользуемых блоков (последнее происходит в случае выполнения в Windows операции «дефрагментации», которая, несмотря на название, в случае с SSD ничего не дефрагментирует, но подаёт серию команд TRIM, в которых сообщает контроллеру адреса всех — абсолютно всех! — неиспользуемых фрагментов на логическом устройстве).
На этом этапе и начинаются нюансы. Контроллер может сразу стереть данные. Может подождать и сделать это позже, во время простоя или по достижении определённого объёма «мусора». Может сразу записать на это место нули, может просто обновить карту валидных блоков. Может и вовсе переключить освобождённую ячейку в другой режим — например, из режима TLC в режим псевдо-SLC (для того, чтобы последующие операции записи происходили быстрее).
На практике поведение определяется множеством факторов:
Вариантов поведения контроллера может быть столько, что перечислить их все не представляется возможным. Для криминалиста всё это — неважно. Главное: после TRIM современный контроллер (об исключениях поговорим ниже) немедленно начинает возвращать нули при попытке чтения указанных блоков, даже если физически они ещё не стёрты. Это поведение касается подавляющего большинства современных SSD — и NVMe, и SATA.
Спецификации определяют три режима поведения SSD после TRIM:
Старые, дешёвые SATA SSD могут работать в режиме неопределённости (undefined). Отсюда — возможные расхождения между образами, снятыми через некоторый промежуток времени, и возможное несовпадение хэшей. Современные накопители, в том числе все без исключения NVMe, как правило, поддерживают режимы DRAT или даже DZAT. Это связано с появлением динамических псевдо-SLC кэшей, сценариев использования SSD в составе RAID и требованиями к детерминированному поведению для высокопроизводительных накопителей.
С развитием твердотельных накопителей появился сначала статический, а потом и динамический pSLC-кэш. Эти режимы работы требуют, чтобы TRIM обрабатывался не только быстро, но и предсказуемо: освобождаемые блоки контроллер может переключить из режима TLC/QLC в режим pSLC, добавив их к объёму доступного кэша. На современных NVMe SSD полная очистка всего пространства объёмом 2 ТБ может занимать считанные секунды, а физическое стирание блоков, занятых относительно небольшим удалённым файлом происходит и вовсе мгновенно.
Именно по этой причине бессмысленно тестировать «скорость чтения пустого SSD» — при попытке прочитать пустые блоки контроллер просто генерирует нули, даже не обращаясь к NAND. Таким образом, при тестировании чтения с пустого накопителя мы тестируем не сам диск, а способность контроллера «быстро отдавать нули».
RAID-массивы с чётностью (например, RAID 5/6) требуют жёсткой предсказуемости. Да, любые SSD можно использовать в составе такого массива — но без поддержки DZAT весь объём диска будет занят контрольными суммами, включая «пустые» блоки. Несложно представить, что скорость записи на такие полностью заполненные накопители будет очень низкой (напомним, в случае с SSD запись в уже занятую ячейку происходит медленно, т.к. выполняется две команды: сначала небыстрое стирание и только потом — запись). Если же нужна поддержка TRIM, то SSD обязан поддерживать детерминированное поведение DZAT: если какой-то блок «пуст», то контроллер хочет видеть на его месте нули и ничто иное. Именно поэтому SSD, предназначенные для работы в составе массивов, должны поддерживать DZAT.
Некоторые производители пошли ещё дальше и начали выпускать SSD на одной и той же аппаратной платформе, но с разными режимами работы. Например, SSD WD Red поддерживают DZAT, не имеют динамического кэша, предназначены для массивов, а линейка WD Blue, базирующаяся на том же «железе», обеспечивает поддержку всего лишь DRAT, использует pSLC-кэш, и в целом не предназначена для работы в составе RAID. Разница между ними — часто всего лишь в прошивке или даже в настройках заводской конфигурации.
Криминалисту важно понимать следующее:
Если следовать строгим принципам криминалистической чистоты, SSD нельзя подключать в стандартном режиме вообще — нельзя даже просто подавать питание. Ведь всегда есть теоретический риск, что в ячейках могли остаться какие-то остаточные данные, которые контроллер не успел затереть после получения команды TRIM. Если подходить исключительно формально, то гарантировать абсолютную сохранность может только такая последовательность подключения:
На практике это нереально. Обработка каждого такого диска — многие часы работы, уровень квалификации специалиста должен быть высочайшим, а результат будет (в 99% случаев) абсолютно тем же, что дал бы обычный блокиратор. По этой причине так поступают лишь в исключительных ситуациях.
Единственное исключение — острые случаи с минимальными временными лагами. Например, если подозреваемый начал форматировать SSD, но через считанные мгновения его устройство отключили от питания. В таком случае — да, стоит пробовать доступ через низкоуровневые методы. Но если пользователь просто удалил файл, пусть прямо на глазах специалиста — TRIM сработает мгновенно; возиться с PC-3000 бессмысленно.
Протестировать работу TRIM несложно, если у вас есть доступ к компьютеру с Linux. Для этого нужен будет накопитель, на котором нет никаких критических данных. (Обратите внимание: /dev/sdX нужно заменить на реальный адрес накопителя).
# 1. Записываем известную сигнатуру в сектор (например, 512 байт) echo "TESTDATA1234567890" | dd of=/dev/sdX bs=512 seek=1000 count=1 # 2. Проверяем, что данные записались dd if=/dev/sdX bs=512 skip=1000 count=1 | hexdump -C # 3. Выполняем TRIM (discard) на этом секторе blkdiscard -o $((1000*512)) -l 512 /dev/sdX # 4. Читаем снова и смотрим результат dd if=/dev/sdX bs=512 skip=1000 count=1 | hexdump -C
Возможно, прочитав эту статью у вас возникнет желание убедиться, что используемый вами блокиратор записи способен блокировать не только запись, но и команду TRIM. В этом случае (опять же, на диске, на котором нет никаких важных данных) можно выполнить следующую последовательность команд. (Рекомендуем предварительно убедиться, что TRIM вообще работает, сначала выполнив предыдущую последовательность).
Подключаем диск напрямую к компьютеру с Linux и монтируем его # 1. Записываем известную сигнатуру в сектор (например, 512 байт) echo "TESTTRIM1234567890" | dd of=/dev/sdX bs=512 seek=1000 count=1 # 2. Проверяем, что данные записались dd if=/dev/sdX bs=512 skip=1000 count=1 | hexdump -C Переподключаем диск через блокиратор, монтируем его в системе (в нашем примере /dev/sdX) # 3. Выполняем TRIM (discard) на этом секторе blkdiscard -o $((1000*512)) -l 512 /dev/sdX # 4. Читаем снова и смотрим результат dd if=/dev/sdX bs=512 skip=1000 count=1 | hexdump -C
TRIM — это не «удаление» данных в классическом понимании. Это сигнал контроллеру: «этот набор адресов — свободен; делай что хочешь». Контроллер реагирует быстро и чаще всего — необратимо. Для криминалиста важно понимать принцип работы SSD с удалёнными данными, чтобы избежать крайностей — подключения накопителей с критически важными цифровыми доказательствами напрямую к компьютеру, так и попыток извлечь уже затёртые данные через низкоуровневый режим специализированным софтом.
Понимание того, как работает TRIM в реальных устройствах и что такое DRAT и DZAT, поможет избегать ошибок и принимать правильные решения на месте — в том числе, когда времени на экспертизу почти нет.