Ложное срабатывание антивируса ESET Internet Security 14.0.22.0

Apr 21, 2021 13:59


Я преподаю программирование на ассемблере. На одном уроке мы сравнивали с учениками быстродействие процедуры определения длины текстовой строки в двух случаях - когда байты-символы из памяти читаются по одному или когда байты читаются четвёрками. Ну, быстродействие второго варианта выше, но дело не в этом.

Время выполнения процедуры очень мало, программа исполняется на 64-битной платформе с 4-ядерным процессором Intel Core i7 2600S,  работающем на частоте 2,8 ГГц. Чтобы «увидеть» это время  без всяких заморочек с таймером, мы заключили вызов процедуры в цикл и стали увеличивать число повторений цикла, пока время N исполнений цикла стало замеряемым внешним секундомером. Да, экспериментик так себе, но нам была важна грубая, практически качественная оценка, так что методологическую сторону тут оставим в стороне.

Мы увеличивали N всякий раз в 100 раз и замерябельный интервал порядка десятков секунд был достигнут на миллиарде повторений (10^9).

И вот тут возник предмет нашего здешнего обсуждения!

Вдруг антиивирус (см.заголовок блога) при очедной перекомпиляции  возбудился и стал сигналить вот что:



при этом удаляется создаваемый линкером ЕХЕ-файл.

Стал лечить компьютер от трояна Kryptik.BIJ. Безуспешно! Никакие антивирусы, включая сам ESET, AVZ и cureit.exe ничего не находят, кроме тех ехе-шек, которые при отключенной защите были созданы и тихо лежали на диске.



Ну, думаю, сам SDK MASM32 заражен. То есть его компилятор ml.exe и/или линкер link.exe. Результат их сканирования нулевой - чисты. Но вирус-то к создаваемой ехе-шке цепляется! Период раздумий повлек желание проверить воспроизводимость этого эффекта заражения - всегда ли при создании ассемблерного приложения возникает этот вирусный аларм.

И вот тут выяснилось, что все мои предыдущие программы-примеры компилируются нормально! Тогда закономерен вопрос: а что в них заметно не так, как в программе скоростного замера? -  Гипотеза возникла такая: в них нет огромного числа повторение итераций цикла. Заметьте: не РЕКУРСИИ, которая забивает стек, а обычного цикла с предопределенным числом повторений по счетчику!

Я стал экспериментировать и гипотеза подтвердилась. Методом половинного деления локализовал число повторений цикла N=588235, при котором (и меньше которого) вирусная защита не срабатывает, а при любом числе повторений N>=588236 в нашей простенькой программке возникает вопль ESETа про троян Kryptik.BIJ, которого реально, как я понимаю, нет, а есть (может быть) случайное совпадение какого-то участка кода с сигнатурой трояна. А может, срабатывает какой-нибудь «поведенческий анализ» антивируса, которым нам морочат голову на рекламных сайтах...

Я НЕ УТВЕРЖДАЮ, что эти числа носят какой-то универсальный характер. Они определены в экспериментах конкретно с нашей учебной программой, вполне себе примитивной. Проверил лишь, имеет ли значение организация циклов. Выяснилось, что и вложенные циклы, и одноуровневый цикл влияют одинаково. То есть и там, и там наблюдается некая граница числа итераций цикла, за которой возникает вирусное предупреждение.

Возможно, в других программах взаимодействие с антивирусом ESETа будет происходить как-то иначе. Может, ложного срабатывания не будет вовсе, я не знаю. Отвлекаться на выяснение этого вопроса мне не с руки, есть другие задачи. Кто имеет время и желание, может покопаться. Пишите в почту, текст прожки вышлю.

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

Со всем уважением к словацкой компании ESET, которая выпускает вполне качественные антивирусы. Но наука умеет много гитик...

Previous post
Up