NTFS и MFT: файловая система под микроскопом

NTFS хранит про каждый файл куда больше, чем видит пользователь. Главная таблица MFT и четыре набора временных меток позволяют не только восстановить удалённое, но и поймать подделку времени.

MFT (Master File Table) — служебная таблица NTFS, в которой каждому файлу и каталогу тома соответствует запись с его именем, атрибутами, метками времени и расположением данных.

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

Зачем это знать следователю

NTFS — это «чёрный ящик», который ведёт подробный учёт. Через MFT эксперт устанавливает, какие файлы существовали (включая удалённые), когда они создавались и изменялись, и — что особенно ценно — не подделывал ли кто-то метки времени, чтобы скрыть момент атаки. Это превращает файловую систему в свидетеля.

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

MFT: запись на каждый файл

MFT — это массив записей фиксированного размера (обычно 1024 байта), и первые записи описывают сами служебные файлы NTFS: $MFT, $LogFile (журнал транзакций), $Bitmap (карта занятых кластеров) и др. Каждая запись начинается с сигнатуры FILE и состоит из атрибутов. Маленький файл может целиком уместиться внутри своей MFT-записи (resident), большой хранит данные в кластерах диска, а в записи остаётся карта их расположения (runlist).

MFT-запись #41
  Сигнатура       : FILE
  Имя             : report.docx
  $STANDARD_INFORMATION : C/M/A/B-времена
  $FILE_NAME            : C/M/A/B-времена (копия)
  $DATA           : non-resident, кластеры 12000-12040
  Флаг            : in use

Временные метки: $SI против $FN

Ключевая для криминалистики тонкость: метки времени хранятся дважды — в атрибуте $STANDARD_INFORMATION ($SI) и в $FILE_NAME ($FN). Каждый набор — это четвёрка MACB: Modified (изменён), Accessed (доступ), Changed (изменена MFT-запись), Born (создан).

Разница в том, кто их меняет. Метки $SI легко правятся из пользовательского режима — обычными API, которыми пользуются и легальные программы, и инструменты подделки времени (так называемый timestomping). А метки $FN обновляются преимущественно ядром при операциях с именем (создание, переименование, перемещение) и обычными средствами не переписываются. Поэтому их сравнивают.

Обнаружение подделки времени

Если злоумышленник «состарил» файл, выставив в $SI дату годичной давности, метки $FN часто остаются настоящими — и расхождение выдаёт фальсификацию. Признаки timestomping:

  • $SI-время заметно раньше $FN-времени (файл «создан» до того, как появилось его имя — невозможно естественно).
  • Подозрительно «ровные» значения: нулевые доли секунды (00.0000000), тогда как настоящие метки NTFS имеют 100-нс точность.
  • Время создания позже времени изменения.
# Учебная эвристика: сравниваем $SI и $FN время создания (Born).
si_born = 1_600_000_000   # выставлено вручную "в прошлое"
fn_born = 1_700_000_000   # реальное, обновлённое ядром

if si_born < fn_born:
    print("ВНИМАНИЕ: $SI раньше $FN — вероятен timestomping")
else:
    print("метки согласованы")

# Подозрительно ровная метка (нулевые доли секунды) — ещё один флаг.
fractional_ns = 0
print("ровная метка, флаг подделки:", fractional_ns == 0)

Вывод:

ВНИМАНИЕ: $SI раньше $FN — вероятен timestomping
ровная метка, флаг подделки: True

Удалённые файлы

Удаление в NTFS — это в первую очередь снятие флага «занято»: MFT-запись помечается свободной, а кластеры в $Bitmap — доступными, но данные физически остаются, пока их не перезапишут. Пока MFT-запись цела, эксперт восстанавливает имя, метки и (если данные не затёрты) содержимое — это file carving. Дополнительный помощник — $LogFile и $UsnJrnl (журнал изменений USN): по ним реконструируют, какие файлы недавно создавались, переименовывались и удалялись, даже если самих записей уже нет.

Как это работает под капотом

NTFS — журналируемая файловая система: перед изменением метаданных она пишет намерение в $LogFile, что обеспечивает целостность при сбое и одновременно даёт следователю историю операций. Запись MFT — это заголовок плюс последовательность атрибутов ($STANDARD_INFORMATION, $FILE_NAME, $DATA, при многих именах — несколько $FN). Точность времени — 100 наносекунд (FILETIME), и именно «слишком круглые» значения нередко выдают ручную правку. Анализируют MFT офлайн инструментами вроде MFTECmd или библиотеки analyzeMFT, строя по таблице полный таймлайн файловой активности.

Сохранение доказательств

Любое чтение «живого» диска рискует обновить хотя бы Accessed-метки, поэтому работают с побитовым образом, снятым через аппаратный блокиратор записи (write blocker). Образ и сам $MFT хэшируют (SHA-256) и заносят в цепочку хранения. Только так извлечённые метки времени и восстановленные файлы сохраняют доказательную силу: контрольная сумма подтверждает, что носитель не изменялся после изъятия.

Как защититься

Знание этих механизмов помогает и обороне:

  • Включайте аудит файловой системы и сбор журнала USN — он фиксирует подделку и удаление.
  • Сравнение $SI и $FN встройте в разбор инцидента: расхождение указывает на попытку скрыть момент компрометации.
  • Для надёжного удаления конфиденциальных данных используйте затирание (wiping), а не обычное удаление — иначе файлы восстановимы.
  • Снимайте образы только через write blocker, чтобы не «затоптать» Accessed-метки и не разрушить доказательства.

Итоги

  • MFT — таблица с записью на каждый файл/каталог NTFS: имя, атрибуты, метки времени, расположение данных.
  • Метки MACB хранятся в $SI (правятся из пользовательского режима) и $FN (обновляются ядром) — их сравнение выявляет timestomping.
  • Признаки подделки: $SI раньше $FN, нулевые доли секунды, создание позже изменения.
  • Удалённые файлы восстанавливают, пока цела MFT-запись и не затёрты кластеры; $LogFile и $UsnJrnl дают историю операций.
  • Работают с побитовым образом через write blocker, всё хэшируют — без этого метки и файлы теряют доказательную силу.
Проверьте себя
1. Почему для обнаружения подделки времени сравнивают метки $STANDARD_INFORMATION и $FILE_NAME?
AОни всегда обязаны быть равны, иначе диск повреждён
B$SI легко меняется из пользовательского режима, а $FN обновляется ядром — расхождение выдаёт timestomping
C$FILE_NAME хранит пароль владельца файла
D$SI отвечает за размер файла, $FN — за имя
2. Что происходит с данными файла сразу после его удаления в NTFS?
AОни немедленно физически затираются нулями
BMFT-запись и кластеры помечаются свободными, но данные остаются, пока не будут перезаписаны — файл восстановим
CФайл шифруется и переносится в $LogFile
DУдаляется только имя, а содержимое сразу дублируется в реестр
3. Зачем при снятии образа диска применяют аппаратный блокиратор записи (write blocker)?
AЧтобы ускорить копирование диска
BЧтобы исключить любые изменения носителя (вплоть до Accessed-меток) и сохранить доказательную силу образа
CЧтобы расшифровать $MFT
DЧтобы автоматически удалить вредонос с диска