Перейти к содержимому
New

DeepSeek V4.1 Flash free for 7 days: 10M tokens a day after a top-up of $10 or more. Until Nov 30.

How it works

Хеши файлов в DFIR и этика загрузки на VirusTotal

Как хеши идентифицируют файлы, почему SHA-256 сменил MD5, как NSRL отсеивает известное ПО и почему загрузка файла на VirusTotal означает его раскрытие.

Начальный8 мин чтенияАвтор: NotHoly

Что такое хеш

Криптографическая хеш-функция принимает вход любой длины и возвращает значение фиксированной длины, которое называется дайджестом. SHA-256 всегда возвращает 256 бит, которые читаются как 64 шестнадцатеричных символа. Один и тот же вход всегда даёт один и тот же дайджест. Измените один символ, и дайджест изменится полностью. NIST определяет Secure Hash Standard в FIPS 180-4, где описаны SHA-256 и другие алгоритмы SHA, и там сказано, что дайджесты используются, чтобы обнаружить изменение сообщения.

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

Хеш идентифицирует байты, имя файла на него не влияет. Файл invoice.pdf и файл setup.exe имеют один и тот же дайджест, если их байты идентичны. Переименование ничего в дайджесте не меняет. Имя файла говорит, как его кто-то назвал. Дайджест говорит, какие байты у вас на самом деле.

Почему SHA-256 сменил MD5 для идентификации

MD5 даёт 128-битный дайджест и много лет широко применялся для контрольных сумм. Позже исследователи показали, что MD5 уязвим к коллизионным атакам: можно построить два разных входа с одним и тем же дайджестом MD5. У SHA-1 похожая проблема при другой конструкции.

Для файла, который вы скачали сами, случайная коллизия очень маловероятна. Опасна намеренная. Злоумышленник, способный создать второй файл с тем же дайджестом, может подменить им файл, которому вы уже доверяете, и дайджест в ваших записях всё равно совпадёт. Когда коллизии становятся осуществимыми на практике, совпадение больше не доказывает, что файлы одинаковы, а именно такое доказательство чаще всего и нужно от хеша.

Рабочее правило простое. Используйте SHA-256 для идентификации, для записей о доказательствах и для всего, что, возможно, придётся отстаивать позже. MD5 и SHA-1 вы ещё встретите в старых фидах, старых инструментах и старых отчётах. Считайте такие значения ключами для поиска и не выдавайте их за доказательство совпадения двух файлов.

Наборы хешей: отсеиваем то, что уже известно

Расследователь не читает каждый файл на диске. Первый полезный вопрос: какие файлы уже известны. National Software Reference Library (NSRL), которую ведёт NIST, собирает ПО и создаёт профили файлов, которые попадают в Reference Data Set (RDS). RDS — это набор цифровых сигнатур известных приложений с прослеживаемым происхождением. В него входят хеши легитимного ПО, а также некоторых приложений, которые могут быть вредоносными, например инструментов стеганографии и хакерских скриптов. Расследователи сопоставляют с ним файлы на изъятых компьютерах, чтобы отделить обычное ПО от файлов, которые могут оказаться важны.

Наборы хешей работают как фильтр и отвечают на узкий вопрос: есть ли этот точный файл в наборе? Файл, которого в наборе нет, может оказаться самописным инструментом, документом или вредоносным ПО. Файл из набора известен, что ещё не значит, что он безопасен. Набор, построенный по одной версии программы, не совпадёт с другой версией той же программы.

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

Совпадение хеша ничего не говорит об изменённом файле

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

Если дайджест совпал с заведомо хорошим значением, байты идентичны файлу из этого набора. Это сильное свидетельство о байтах. Что программа делает при запуске, оно не говорит, а одни и те же байты могут вести себя по-разному при разной конфигурации или входных данных.

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

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

У одной и той же программы дайджесты могут различаться между версиями. Хороший пример — Windows Notepad. Его дайджест может меняться от одной сборки Windows к другой. Хеш без указанной рядом версии говорит очень мало, поэтому записывайте версию каждый раз, когда записываете дайджест.

Поиск по хешу и загрузка файла

VirusTotal даёт искать файл по его хешу. Вы вставляете значение SHA-256, MD5 или SHA-1 в поле поиска, и VirusTotal показывает страницу любого уже известного ему файла с таким дайджестом. При поиске по хешу в сервис уходит дайджест. Сам файл туда не уходит.

Загрузка — другое действие. В документации VirusTotal сказано, что любой пользователь может выбрать файл на своём компьютере и отправить его в VirusTotal. Там же сказано, что отчёты о сканировании доступны публичному сообществу VirusTotal, что содержимое отправленных файлов может быть передано премиальным клиентам VirusTotal и что базовые результаты передаются отправителю и партнёрам, участвующим в проверке.

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

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

У поиска по хешу тоже есть последствия. Сервис получает дайджест, а дайджест файла клиента может раскрыть, что именно вы ищете. Проверяйте политику и для поиска по хешу, особенно в активном деле.

Практика: хешируем свои файлы

Нужен компьютер с терминалом. Вы захешируете системные программы и созданный вами файл, а потом поищете на VirusTotal один заведомо безобидный дайджест. Загружать ничего не будете. Используйте только файлы на своей машине.

Шаг 1: захешируйте системную программу

В Linux выполните:

bash
sha256sum /bin/ls

В macOS выполните:

bash
shasum -a 256 /bin/ls

В Windows откройте PowerShell и выполните:

powershell
Get-FileHash C:\Windows\System32\notepad.exe -Algorithm SHA256

В Windows с Git Bash ту же проверку можно запустить и из терминала:

bash
sha256sum /c/Windows/System32/notepad.exe

На машине, где проверялась эта статья, с Windows 11 и Git Bash, результаты были такими:

text
$ sha256sum /bin/ls
b45981580702029cfeeffc8ca69e2a4d1e9c68914009e94c31ffec9cbc544aa5 */bin/ls
text
Algorithm : SHA256
Hash      : 468FFE129C395ABF6B21A09EFDF261910A95FB98AA982EAD73CAA7B2B684577E
Path      : C:\Windows\System32\notepad.exe
text
$ sha256sum /c/Windows/System32/notepad.exe
468ffe129c395abf6b21a09efdf261910a95fb98aa982ead73caa7b2b684577e */c/Windows/System32/notepad.exe

Дайджест ls относится к собственной копии ls из Git Bash, поэтому с ls на вашей машине с Linux или macOS он не совпадёт. Дайджест notepad одинаков в обеих оболочках, отличается только регистр шестнадцатеричных символов. Сравнивайте дайджесты без учёта регистра. Эта же машина сообщила версию файла 10.0.26100.9949 и размер 360448 байт для notepad.exe. Запишите их рядом с дайджестом, потому что другая сборка Windows даст другой дайджест для программы с тем же именем.

Шаг 2: посмотрите, как один символ меняет дайджест

Выполните это в Git Bash или любой POSIX-оболочке:

bash
echo 'lab' > a.txt && sha256sum a.txt && echo 'lab.' > a.txt && sha256sum a.txt

Наблюдаемый вывод:

text
b76025a9ca630b026d630d59a18cf414f5724d2bbf5dc4b11dd165c9c1ea8e01 *a.txt
d233123b7c71a1b7234066f700e03452959ce5bb0b4802f0cbd2c2437004a879 *a.txt

Разница только в одной точке. Оба дайджеста длиной 64 символа, и общего рисунка в них не видно. Команда echo ещё и добавляет перевод строки, так что в первом файле лежит lab с переводом строки, а во втором lab. с переводом строки. Точные байты можно проверить через od -c a.txt. Окончания строк — частая причина того, что две копии «одного и того же текста» дают разные дайджесты. Файл, сохранённый в Windows с окончаниями CRLF, даёт другой дайджест, чем тот же текст с окончаниями LF.

Шаг 3: поищите на VirusTotal заведомо безобидный дайджест

Откройте браузер и перейдите на https://www.virustotal.com/gui/search/, добавив к адресу дайджест SHA-256 для Notepad из шага 1. Можно также вставить дайджест в поле поиска на сайте VirusTotal. Не перетаскивайте файл на страницу и не нажимайте никаких элементов загрузки.

В нашем запуске адрес поиска привёл на страницу файла с этим дайджестом, но сначала страница показала проверку reCAPTCHA. Мы её не проходили, поэтому результатов отчёта в статье нет. Если хотите увидеть результаты, пройдите проверку сами. VirusTotal просит об этом, чтобы остановить автоматизированный трафик, и решать это сайту, не нам.

Когда страница загрузится, запишите в заметки четыре вещи:

  • Имена и типы файлов, которые страница перечисляет для этого дайджеста.
  • Число движков, отметивших файл, и общее число движков.
  • Даты первого и последнего обнаружения.
  • Совпадает ли дайджест на странице с дайджестом, вычисленным на вашей машине.

Затем запишите, чего страница не говорит. Результат без срабатываний означает, что на тот момент ни один движок этот дайджест не отметил. Безопасность файла он не доказывает. О вашей копии страница ничего не говорит, если дайджесты не совпадают, и ничего не говорит о том, что программа делает при запуске.

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

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

Считать MD5 или SHA-1 доказательством. Для идентификации используйте SHA-256. Старые дайджесты оставляйте только как ключи для поиска.

Считать чистый результат признаком безопасности. За дайджестом без срабатываний может стоять новое вредоносное ПО, целевое вредоносное ПО или файл, которого ещё не видел ни один движок. «Чисто» значит «не отмечено», и ничего больше.

Доверять имени файла. Имена легко поменять. Идентификатор — дайджест, а имя всего лишь метка.

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

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

Что делать дальше

Вычислите дайджесты всех файлов в папке и сохраните их как манифест, чтобы позже обнаруживать изменения. В Linux или macOS выполните sha256sum * > manifest.txt внутри папки. Храните манифест вместе с доказательствами и позже вычислите дайджесты заново, чтобы увидеть, что изменилось. Команда стандартная, но для этой статьи мы её в лаборатории не запускали, поэтому проверьте её вывод на своей машине.

Прочитайте FIPS 180-4, чтобы узнать точные определения алгоритмов SHA и размеры их вывода. Прочитайте страницу NSRL, чтобы увидеть, как эталонный набор данных строится и используется на практике. Прежде чем применять в работе любой публичный сканер, прочитайте документацию VirusTotal о том, как обрабатываются отправленные файлы.

Следующий шаг — написать логику обнаружения для файла, который вы контролируете. Статья Напишите правило YARA для безобидного тестового файла показывает, как сопоставлять шаблоны вместо целых дайджестов, а это закрывает случаи, с которыми не справляется точный хеш.

Источники

Что ещё почитать: Шифрование, кодирование и хеширование: сравнение и предыдущая статья этой серии, Первый анализ в Ghidra на бинарнике, который вы компилируете сами.

Источники

  1. FIPS 180-4, Secure Hash Standard (NIST)
  2. National Software Reference Library (NIST)
  3. How VirusTotal works (VirusTotal documentation)

Ещё по теме: Вредоносное ПО и форензика

Вредоносное ПО и форензика

Зачем использовать NotHoly для анализа malware

Статический triage в sandbox, который никогда не запускает образец, и модель, что объясняет и ложит на ATT&CK без отказа. Детонация в вашей лаборатории.

Средний3 мин чтения

Вредоносное ПО и форензика

Напишите правило YARA и проверьте его на безобидном тестовом файле

Напишите первое правило YARA, добейтесь совпадения с одним безобидным тестовым файлом и отсутствия совпадения с другим и узнайте, зачем каждому правилу нужны позитивные и негативные тесты.

Начальный8 мин чтения