Принципы целостности и воспроизводимости доказательств

Этот урок разбирает принципы, на которых держится доказательная сила цифровой улики.

Целостность доказательства — гарантия, что данные не изменялись с момента изъятия; обычно подтверждается криптографическим хешем.

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

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

Принцип 1: не менять оригинал

Главное правило — минимизировать воздействие на исходный носитель. Идеально, если оригинал вообще не изменяется. Для этого делают побитовую копию (bit-for-bit image), а сам анализ ведут на ней. Если без работы с «живой» системой не обойтись (например, нужно снять память), фиксируют, какие именно действия выполнены и почему.

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

Чтобы гарантировать неизменность оригинала даже на аппаратном уровне, используют write-blocker — устройство или программный режим, физически пропускающий к диску только команды чтения и блокирующий любую запись. Это страховка от того, что операционная система втихую что-то допишет. На «живой» системе, которую нельзя выключать, действует компромисс: воздействие неизбежно, поэтому его сводят к минимуму, выбирают наименее инвазивные инструменты и педантично записывают каждый свой шаг — чтобы потом можно было отделить ваши изменения от чужих.

Принцип 2: верифицировать хешами

Чтобы доказать, что копия идентична оригиналу и что улика не менялась, считают криптографический хеш — короткий «отпечаток» данных. Совпадение хешей до и после означает: данные те же. Изменение хоть одного бита полностью меняет хеш.

import hashlib

# имитируем содержимое файла-улики
evidence = b"log entry: user admin login at 02:14"

h = hashlib.sha256(evidence).hexdigest()
print("SHA-256:", h)

# меняем один символ — хеш полностью другой
tampered = b"log entry: user admin login at 02:15"
print("после правки:", hashlib.sha256(tampered).hexdigest())

Вывод:

SHA-256: 7a... (длинный отпечаток)
после правки: c3... (совершенно другой отпечаток)

Точные значения зависят от данных, но суть видна: правка одного символа даёт полностью другой хеш. Это и есть свойство, на котором держится верификация.

Важно понимать, что именно доказывает совпадение хешей, а что — нет. Совпадение надёжно подтверждает, что данные не изменились: ни один байт не тронут. Но оно ничего не говорит о том, как данные были получены и кто их получил, — это закрывает уже цепочка хранения, отдельная тема. Хеш — это инструмент целостности, а не происхождения. Поэтому в реальной практике хеш всегда работает в паре с журналом действий: один отвечает на вопрос «то же ли это самое?», второй — «откуда оно и кто им владел?».

Принцип 3: воспроизводимость

Другой эксперт, повторив ваши шаги на той же копии, должен прийти к тем же выводам. Поэтому фиксируют не только результат, но и команды, версии инструментов, параметры. Расследование — это не магия конкретного человека, а проверяемая процедура.

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

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

Криптографический хеш (MD5, SHA-1, SHA-256) — это функция, которая из любого объёма данных выдаёт строку фиксированной длины. У неё два важных свойства: лавинный эффект (малейшее изменение входа меняет весь выход) и устойчивость к подбору. Для верификации образа считают хеш всего носителя; если после копирования он совпал — копия точна.

«Устойчивость к подбору» означает, что по готовому отпечатку практически невозможно сконструировать другие данные с тем же хешем. Именно поэтому хеш работает как пломба: подделать содержимое так, чтобы отпечаток остался прежним, нельзя. У старых функций это свойство со временем ослабло — для MD5 и SHA-1 исследователи научились строить коллизии (разные входы с одинаковым хешем). На практике это значит, что злоумышленник теоретически способен подготовить два файла с совпадающим MD5, и тогда «совпал хеш» перестаёт гарантировать «те же данные». Для SHA-256 таких атак нет, поэтому он и стал стандартом форензики.

Оригинал диска  --(dd, побитово)-->  Образ disk.img
      |                                   |
   SHA-256                             SHA-256
      |                                   |
      +-------- совпадают? --------------+
             да -> копия достоверна

Частые ошибки

  • Считать хеш только один раз. Хеш считают до и после ключевых операций, чтобы доказать неизменность на каждом этапе.
  • Монтировать диск на запись. Даже простое монтирование ОС может обновить журналы файловой системы. Используют режим только для чтения и write-blocker.
  • Полагаться только на MD5. MD5 устарел и уязвим к коллизиям; в современной практике берут SHA-256, MD5 — лишь как дополнительный.
  • Копировать файлы вместо образа. Обычное копирование теряет удалённые данные и slack space; для улики нужна побитовая копия.
  • Считать хеш доказательством происхождения. Хеш подтверждает только неизменность данных; «откуда они и кто владел» доказывает цепочка хранения.

Итоги

  • Оригинал не изменяют — работают с побитовой копией, по возможности через write-blocker.
  • Целостность подтверждают хешем (предпочтительно SHA-256), считая его до и после операций.
  • Хеш доказывает неизменность данных, но не их происхождение — это закрывает цепочка хранения.
  • Любой шаг должен быть воспроизводим: фиксируют команды, версии и параметры.
Проверьте себя
1. Зачем в криминалистике считают хеш образа до и после операций?
AЧтобы ускорить копирование
BЧтобы доказать, что данные не менялись (совпадение хешей)
CЧтобы зашифровать улику
DЧтобы уменьшить размер образа
2. Что произойдёт с SHA-256 при изменении одного бита в данных?
AХеш изменится только в одном символе
BХеш останется прежним
CХеш полностью изменится (лавинный эффект)
DХеш станет короче
3. Что означает воспроизводимость расследования?
AМожно повторить атаку
BДругой эксперт по тем же шагам на той же копии получит те же выводы
CОбраз можно скопировать много раз
DОтчёт можно распечатать заново