В первой части были рассмотрены антивирусные сканеры «при обращении» и некоторые основные концепции их работы. В этой статье рассмотрены некоторые стратегии, которые применяют создатели вирусов, чтобы обойти защиту этих сканеров и как, в свою очередь, реагируют на это разработчики антивирусов.
Михаил Разумов, по материалам SecurityFocus
Большинство здравомыслящих пользователей ПК используют сейчас антивирусное (АВ) ПО при работе на своих компьютерах. Однако большинство пользователей не знает, как работает антивирусное ПО. Эта статья является второй частью краткого обзора антивирусных сканеров «при обращении».
В первой части были рассмотрены антивирусные сканеры «при обращении» и некоторые основные концепции их работы. В этой статье рассмотрены некоторые стратегии, которые применяют создатели вирусов, чтобы обойти защиту этих сканеров и как, в свою очередь, реагируют на это разработчики антивирусов.
Создатели вирусов разработали несколько контрмер в ответ на усовершенствования методов сканирования «при обращении». Они стали скрывать злонамеренную структуру кода, шифруя его, помещая туда, где антивирусные сканеры вряд ли его найдут, и пряча место в инфицированной программе, в котором вирус принимает управление. Например, много простых Windows Portable Executable (PE) вирусов присоединяли свой вирусный код в конец программы и ставили инструкцию jump в ее начале для исполнения кода вируса.
Антивирусный сканер может быстро обнаружить изменения в программе, проверяя ее размер. Если размер файла был изменен в процессе запуска, это хороший индикатор того, что вирус инфицировал программу. Чтобы обойти эту проверку, пустотные (cavity) вирусы прятали свой код в пустых пространствах внутри файла программы, оставляя размер файла неизменным. Пустотные вирусы пошли еще со времен MS-DOS, начиная с вируса Lehigh. Использование этой техники в создании вирусов значительно возросло, когда Microsoft разработал Windows PE формат для возможности взаимодействия Windows программ в разных ОС Windows. С целью ускорить загрузку программ в формате PE, компиляторы Windows программ создавали пустые пространства внутри файлов. Многие вирусы, такие как W2K/Lamchi, использовали эти пустые пространства для сокрытия вирусного кода.
Создатели вирусов также пытались использовать шифрование кода для противостояния антивирусным CPU-эмуляторам. Вирус IDEA.6155 появился весной 1998 г. Написанный создателем вирусов Spanska, он мог инфицировать .com, .exe и .zip файлы. Это был не простой вирус, а вирус, который содержал и демонстрировал сложные методы шифрования. Как сообщается, Spanska разослал его антивирусным компаниям и не стал распространять его в Интернет. Тем не менее, он заставил оживиться антивирусное сообщество.
Вирус IDEA.6155 использовал трехуровневое шифрование кода различными методами. Первый уровень использовал механизм FSE mutation для своей расшифровки, используя ключ, находящийся в коде вируса. Второй уровень не имел этого ключа, но мог быть расшифрован, так как значение ключа могло быть быстро получено с помощью атаки дешифровки грубой силой (brute force). Внутренний уровень использовал алгоритм шифрования IDEA. Чтобы обмануть сканеры «при обращении», 128-битный ключ IDEA мог находиться в одном из двух мест внутри тела вируса. Сильно зашифрованный вирус может привести к тому, что CPU эмулятор подвесит Windows Pentium систему. Как сообщается, дешифровка вируса может занять до 5 сек. без использования антивирусного эмулятора кода. Согласно Vessilin Bontchev, антивирусному исследователю из Frisk Software International, на системе с запущенным антивирусным эмулятором кода, дешифровка вируса может занять от нескольких минут до получаса! Это может привести к тому, что конечные пользователи просто отключат антивирусное ПО на своих ПК.
Создатели вирусов также стали применять технику сокрытия точки входа (entry point obscuration - EPO), чтобы прятать место нахождения jump-инструкции к коду вируса. Червь W32/MTX@M и вирус Win95/SK были одними из первых, использующих эту технику. Существует множество разновидностей этой идеи, от сокрытия блока вирусного кода в теле программы до фактического интегрирования вирусного кода в код программы. Многие АВ профессионалы рассматривают EPO вирусы как наиболее перспективные.
Создатели вирусов стали использовать техники шифрования для предотвращения быстрой идентификации антивирусным ПО. Изменяя ключ шифрования от компьютера к компьютеру, вирус может защитить свой код от быстрой идентификации. Группы разработчиков вирусов, такие как 29A VX, и отдельные разработчики, например Zombie и Black Baron, работают над усовершенствованием методов шифрования и мутации.
В то же время создатели вирусов разработали методы сокрытия кода вируса путем варьирования его проявления. Полиморфные вирусы шифруют свой код с использованием различных схем шифрования и варьирующихся алгоритмов дешифровки. Однако вирусный код может быть без труда идентифицирован после дешифровки, благодаря наличию неизменных частей в нем, таких как область данных, заполненная строковыми константами. Полиморфные вирусы должны иметь «голову», или дешифровщик, используемый для дешифровки вируса перед запуском. Эти вирусы могут варьировать свое проявление изменением порядка процедур и вставкой случайного бесполезного кода, типа инструкций NOP (null operation). Примеры полиморфных вирусов включают SMEG.Pathogen (создатель которого был приговорен к 18 месяцам) и Elkern, вирус - компаньон червя Klez.
Позже создатели вирусов представили метаморфный вирус, который фактически меняет свой код от поколения к поколению (поколение – одна серия размножения). Метаморфный вирус также шифрует свой код, но его процедура дешифровки, ключ и даже местоположение ключа могут меняться со временем. И, в отличие от полиморфных вирусов, в метаморфных данные и код смешаны в теле вируса. Как и полиморфные вирусы, метаморфные тоже используют различные техники для сокрытия истинного предназначения своего кода.
Суть не только в том, чтобы спрятать злонамеренный код, создатели вирусов также предпринимают шаги для атак против антивирусного ПО. Существуют три основных атаки, которые могут быть применены против эмуляторов системы. Первая из них – включение ненормальных и неестественных инструкций. Это программные инструкции, которые АВ программисты могли не рассмотреть ввиду того, что они практически не используются в реальных программах и слишком сложны для эмуляции, в итоге они не обнаруживаются эмуляторами.
Во второй атаке на эмуляторы системы, создатели вирусов пытаются использовать задержку между оценкой эмулятором подозрительного кода и временем исполнения в реальной системе. IDEA.6155 – наиболее старый пример этой атаки, в котором долгая процедура дешифровки может переполнить ограниченные ресурсы эмулятора.
В третьей атаке на эмуляторы кода, вирус пытается определить, что он находится в эмуляторе, используя ограничения в дизайне эмуляторов кода. Никакой эмулятор не может учесть все вероятные ситуации. Вирус может также варьировать свое поведение в зависимости от системной даты или воспринимая изменения типа потери сетевого соединения. Например, известно, что Magistr не заражает исполняемые файлы при отсутствии Интернет-соединения.
Вирус W32.Simile - один из последних метаморфных вирусов. Этот очень сложный вирус способен существовать как на Linux, так и на Windows платформах. Большая часть кода вируса, содержащего более 14000 ассемблерных команд, посвящена собственному метаморфическому механизму. Этот вирус, написанный создателем вирусов The Mental Driller, и обнаруженный в марте 2002 г., имеет множество антиэмуляторных функций. Он использует псевдослучайный алгоритм дешифровки, который использует модульные арифметические функции для дешифровки тела вируса нелинейным способом, не от начала до конца, а кусками, выбранными, по видимому, случайным образом, для того, чтобы запутать эмулятор.
Чтобы еще больше запутать эмулятор, вирус Simile воспользовался инструкцией RDTSC (Read Time Stamp Counter). Вирус анализирует внутренний процессорный счетчик и случайным образом определяет, пора расшифровывать код, или еще подождать. Это означает, что вирус может не расшифроваться с первой или даже с нескольких попыток. Ввиду сложности вирусного кода, он содержит множество ошибок, которые могут помешать расшифровке вируса в течение длительного времени.
Сложность Simile также указывает на то, что мало кто из создателей вирусов возьмется за написание действительно сложных вирусов. Наоборот, успех Hybris, Klez , Magistr, MTX, и Sircam указывает на то, что вирусам, эффективно использующим поддельные адреса возврата или изменение тела вируса, обеспечена долгая жизнь на мировой арене.
Как антивирусные разработчики создадут эффективный сканер «при обращении», имея такую впечатляющую оппозицию, как метаморфные EPO вирусы, превосходно умеющие прятать вирусный код? Метод совпадения строк, в котором вирусы обнаруживаются по наличию строк в коде, индицирующих злонамеренные или вирусные свойства, был одним из опор антивирусного сканирования. Но с применением технологий сокрытия кода и возрастанием количества полиморфных и метаморфных вирусов, может оказаться сложным, если не невозможным для сканеров обнаружить распознаваемую строку. Также очень эффективным методом обнаружения вирусов было сравнение величин cyclic redundancy check (CRC). Теперь вирусы способны варьировать значения CRC, тем самым скрывая наличие своего кода (существует возможность заражения файла таким образом, что его CRC при этом не изменится).
Если файл в состоянии покоя не показывает наличие вируса, вирус все же может выйти из него при запуске. Анализ стека CPU эмулятора может указать на наличие признаков, сигнализирующих о наличии вируса.
Если говорить о полиморфных вирусах, существует момент, когда код вируса раскрывается в стеке после дешифровки, но эта техника может не работать с метаморфными вирусами, код которых меняется от поколения к поколению. В данном случае необходимо покинуть «вещественный» мир распознавания строк, и перейти к абстрактным рассуждениям и статистике. Где-то во всей этой высокой траве и бесполезных инструкциях обманного кода содержится сердце алгоритма, направленного на выполнение своих целей. Если сканер «при обращении» не может напрямую увидеть сердце вируса, он должен установить его наличие из косвенных улик.
Если распознаваемый код не может быть найден, необходимо ответить на вопросы, действует ли подозрительный код как какой-то вирус-предок? Действует ли он так же большую часть времени? Если это так, он может быть потомком известного вируса. Даже после этого может не быть однозначного ответа, тогда антивирусные программисты зададут вопрос о том, чего этот подозрительный код не делает. Эта техника, называемая «ложное обнаружение» полезна для принятия решения о том, когда прекратить анализ конкретной части кода и перейти к следующей подозрительной части.
Несомненно одно: чтобы называться вирусом, враждебный код должен размножаться. Вирусы не только размещают свой код в файлах, они зачастую помечают эти файлы для предотвращения повторного заражения. Таким образом, анализируя структуру файла,
сканеры «при обращении» могут определить, когда вирус пытается изменить его. Эта методика часто называется «эвристикой формы» или «геометрическим обнаружением». Анализируя файл в поисках меток или других известных величин, изменяемых вирусом внутри файла, сканеры «при обращении» имеют больше шансов для обнаружения вируса. Например, полиморфные вирусы могут иметь распознаваемые дешифровщики, или «головы». Каталогизируя дешифровщики, метки, и их разновидности, сканирующий модуль сможет использовать их характеристики для идентификации вируса.
Продолжающееся совершенствование вирусного кода показывает, что сканеры «при обращении» должны развиваться быстрее вирусов, оставляя им все меньше способов избежать обнаружения. К сожалению, постоянное введение новых операционных систем открывает все новые ящики Пандоры, полные уязвимостей. Как и раньше, создатели вирусов и антивирусного ПО будут вести войну нападения и защиты. Опыт показывает, что необходимо полное понимание работы операционной системы для предупреждения новых вирусных штаммов. Для большинства из нас хорошо, когда добро побеждает. Но чтобы победить, необходимо быстрое получение точных сведений о вирусном коде, чтобы понимать, как работают все возрастающие по сложности вирусы.
Сканеры «при обращении» сделали Интернет более безопасным местом благодаря их возможности тщательно проверять код до того, как он сможет свободно запуститься в системе. Однако, пути, которыми пойдут создатели вирусов для сокрытия кода и атак против методов антивирусного обнаружения, требуют сложных и надежных методов обнаружения, идущих далеко впереди проверок совпадения строк и CRC. Эти методы обнаружения становятся более абстрактными. Даже при этом они могут успешно обнаруживать вирусы через их поведение и подозрительные действия, которые выдают вирусные намерения. По-прежнему остается задачей для разработчиков антивирусов быть впереди оппозиции, которая использует подлог и маскировку для сокрытия зачастую деструктивной природы своих творений, и обеспечивать точное и надежное антивирусное обнаружение «при обращении».