[Из песочницы] Как поймать вирус в запароленом архиве

Прочитав статью rattlersnakeА твой антивирус ловит запароленные архивы? я прошел стадии от неверия через сомнение к разочарованию и обратно к пониманию.

8bc7f4149e2a402992b41f36fe6e65b2.jpg

Как вполне правильно отмечают в комментариях, получение содержимого запароленного архива без знания пароля невозможно, следовательно, невозможна и проверка. Но значит ли это, что детект вируса невозможен? Как мне кажется, я разобрался, почему такое возможно и почему такой метод имеет право на жизнь.
Желание проверить правильность описанной в статье ситуации и разобраться, как такое возможно, побудили меня провести небольшой эксперимент.

Проверяемый файл info.exe был найден по хэшу с VirusTotal и запакован архиватором WinRar в три архива: zip, rar и rar версии 5.

На все архивы был установлен сложный пароль для исключения его подбора антивирусом либо использования стандартных паролей. К моему удивлению, антивирус Fortinet сработал на архивах zip и rar, но не сработал на rar5!

dba6ff15800046c3b0f19ae38f13f2df.png

В комментариях к статье была версия, что это — «false positive, ложное срабатывание». Но эта версия неправдоподобна, так как это ложное срабатывание выдает тот же самый детект, что и незапакованный вирус. Более того, при использовании разных паролей полученный архив должен значительно отличаться. Тут должен работать какой-то другой механизм, но какой?

Пытясь понять, чо влияет на срабатываение антивируса, я изменил один байт в файле и снова запаковал его в архивы с паролем. После проверки меня ждал другой сюрприз — хотя детект вируса в архиве пропал (0/53), пропал детект этим антивирусом и неупакованного файла, хотя большинство остальных антивирусов продолжали его видеть (35/52)!

И тут мне в голову пришла отличная идея:

  • Смотрим, какие свойства файла доступны в архиве — и видим контрольную сумму CRC32:

    20a044fb6ffe4b0d80baf3351085e5ab.png

  • Создаем пустой файл такого же размера, например командой fsutil file createnew info.exe 450362
  • Подгоняем его CRC32 под значение у оригинального файла (например, так: py.exe forcecrc32.py info.exe 0 76718968) или просто устанавливая значение первых четырех байт в 67 EE C6 57:

    61e9979ab5824939b2609e1885ca8b23.png

  • Запаковываем его в архив с паролем и проверяем CRC32 — совпадает
  • Проверяем полученный архив на VirusTotal


Бинго! Fortinet теперь считает, что в архиве находится вирус (1/52).

a55f9f6baa9e4c11a2e80aa1667c2fe4.png

Проверяем на всякий случай и получившийся exe файл — и видим странный результат — Fortinet продолжает находить в файле вирус. Похоже, он детектит его исключительно по CRC32!

4dfc8dd994144f7d9eb585c650416ef9.png

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

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

Если мы знаем CRC32 вредоносного файла, будет не лишним предупредить пользователя, когда такой файл найдется в архиве с паролем.

© Habrahabr.ru