[Из песочницы] Как поймать вирус в запароленом архиве
Прочитав статью rattlersnakeА твой антивирус ловит запароленные архивы? я прошел стадии от неверия через сомнение к разочарованию и обратно к пониманию.
Как вполне правильно отмечают в комментариях, получение содержимого запароленного архива без знания пароля невозможно, следовательно, невозможна и проверка. Но значит ли это, что детект вируса невозможен? Как мне кажется, я разобрался, почему такое возможно и почему такой метод имеет право на жизнь.
Желание проверить правильность описанной в статье ситуации и разобраться, как такое возможно, побудили меня провести небольшой эксперимент.
Проверяемый файл info.exe был найден по хэшу с VirusTotal и запакован архиватором WinRar в три архива: zip, rar и rar версии 5.
На все архивы был установлен сложный пароль для исключения его подбора антивирусом либо использования стандартных паролей. К моему удивлению, антивирус Fortinet сработал на архивах zip и rar, но не сработал на rar5!
В комментариях к статье была версия, что это — «false positive, ложное срабатывание». Но эта версия неправдоподобна, так как это ложное срабатывание выдает тот же самый детект, что и незапакованный вирус. Более того, при использовании разных паролей полученный архив должен значительно отличаться. Тут должен работать какой-то другой механизм, но какой?
Пытясь понять, чо влияет на срабатываение антивируса, я изменил один байт в файле и снова запаковал его в архивы с паролем. После проверки меня ждал другой сюрприз — хотя детект вируса в архиве пропал (0/53), пропал детект этим антивирусом и неупакованного файла, хотя большинство остальных антивирусов продолжали его видеть (35/52)!
И тут мне в голову пришла отличная идея:
- Смотрим, какие свойства файла доступны в архиве — и видим контрольную сумму CRC32:
- Создаем пустой файл такого же размера, например командой fsutil file createnew info.exe 450362
- Подгоняем его CRC32 под значение у оригинального файла (например, так: py.exe forcecrc32.py info.exe 0 76718968) или просто устанавливая значение первых четырех байт в 67 EE C6 57:
- Запаковываем его в архив с паролем и проверяем CRC32 — совпадает
- Проверяем полученный архив на VirusTotal
Бинго! Fortinet теперь считает, что в архиве находится вирус (1/52).
Проверяем на всякий случай и получившийся exe файл — и видим странный результат — Fortinet продолжает находить в файле вирус. Похоже, он детектит его исключительно по CRC32!
Да, похоже, чудес не бывает и настоящий детект вируса в запароленом архиве невозможен.
С другой стороны, учитывая что Fortinet занимается программно-аппаратными комплексами сетевой безопасности, и цель — не пропустить писмо с вредоносным вложением, то такой подход имеет право на жизнь.
Если мы знаем CRC32 вредоносного файла, будет не лишним предупредить пользователя, когда такой файл найдется в архиве с паролем.