Технологии борьбы с вредоносным ПО

История компьютерных вирусов насчитывает не один десяток лет. С появлением первых из них возникла необходимость борьбы с ними. И самыми первыми вирусными аналитиками становились энтузиасты-программисты, на компьютер которых попала вредоносная программа, заражающая файлы. Они разбирали вирус "по косточкам", понимали все принципы его работы и создавали первые в своем роде антивирусы, предназначенные для определенного вредителя. Именно так начала зарождаться индустрия, направленная на борьбу с компьютерными вирусами. Все это время вирусные технологии совершенствовались, обрастали новыми ухищрениями и возможностями, и, без сомнения, авторам антивирусных средств тоже приходилось дорабатывать свои продукты, чтобы те, в свою очередь, могли противодействовать любому типу "заразы". Именно о технологиях борьбы с вирусами, которые применяются на сегодняшний день (а они включают в себя еще и те методики, которые использовались 20 лет назад), мы поговорим сегодня.

Старый конь борозды не портит


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

А теперь, собственно, попытаюсь изложить суть этого старого, но достаточно действенного метода обнаружения вирусов. Представьте, что вы являетесь следователем, прибывшим на место преступления. С чего начинается каждое расследование? Правильно, с поиска отпечатков пальцев! Думаю, для вас не является секретом, что отпечатки пальцев каждого человека уникальны, и шансы встретить подобные отпечатки пальцев у других людей стремятся к нулю. Зная, кому принадлежат эти отпечатки, мы с легкостью можем вычислить преступника. На схожем принципе и основан так называемый "сигнатурный" поиск вирусов. Когда новый вирус попадает в руки исследователей, в первую очередь они выделяют "сигнатуру" — определенную последовательность байт, соответствующую конкретному вирусу (или семейству вирусов), после чего добавляют ее в антивирусную базу (конечно, не забывая добавить способ лечения и ли просто удаления зараженного файла) и с успехом начинают использовать для детектирования/удаления зловреда путем проверки всех файлов, хранящихся на жестком диске. Как вы могли понять, все достаточно просто, но именно эта методика остается одной из основных применяемых в антивирусах. В итоге мы имеем механизм, позволяющий отловить довольно большую долю вирусов. Но несмотря на это у нее все же есть недостатки. Одним из основных является необходимость постоянного обновления баз сигнатур — думаю здесь все очевидно. Как уже ранее говорилось, сигнатура — это последовательность байт, характерная для конкретного файла. А что будет, если несколько байт из этой последовательности будут изменены или вообще исключены? Как поведет себя антивирус? В такой ситуации все зависит от совести тех людей, которые разрабатывали движок антивируса. Если они подошли к этому процессу с умом и не халтурили, то, по идее, нас должны предупредить, что файл является подозрительным или же является модификацией какого-либо вируса. Но, к сожалению, такое бывает достаточно редко, и БОЛЬШИНСТВО современных продуктов, нацеленных на защиту от данного вида угрозы, не справляются с подобной задачей, что грозит заражением компьютера. Имена тех продуктов, которые подвержены данной "болезни", в целях антирекламы называть не буду, но, поверьте, это одни из самых популярных продуктов в России/Европе/Америке.

Полиморфизм

С ростом числа вирусов росло число антивирусов — таким образом, рано или поздно новые вариации вредоносных программ попадали во все антивирусные базы! Одним из переходных моментов стало появление первых полиморфных вирусов — вредоносных программ, способных при своем размножении частично изменять(в различной степени) свое тело (ну, это не совсем точно сказано — на самом деле речь идет о полиморфизме дескриптора). Это означало, что "старый добрый" сигнатурный поиск оказывался бесполезным. Раз вирус не обладает четкой структурой — значит, нельзя выделить четкую сигнатуру... Думаю, теперь все стало ясно. Кстати, стоит отметить, что полиморфики появились не сразу — этой технологии предшествовали так называемые "самошифрующиеся" вирусы. По сути, они состояли из 2-х частей: тело самого вируса и шифратора/дешифратора. Основное тело при размножении шифровалось разными ключами (иногда разными алгоритмами), и добавлялся код расшифровки. При запуске зараженного файла(забегаю чуть вперед, скажу, что эта технология приобрела свою новую вариацию в наши дни) дешифратор восстанавливает основное тело вируса и передает ему управление. На выходе получалась почти полностью отличающаяся от оригинала копия. Опять же, для детектирования использовался усложненный сигнатурный подход! Т.е. в качестве изначальной сигнатуры брались постоянные участки дешифровщика, если сигнатура совпадала, то в ход шла заранее заложенная процедура дешифровки, и уже к расшифрованному коду применяли общую сигнатурную базу! Сразу можно сделать вывод, что такой подход не очень эффективен, а в первую очередь трудоемок (написание процедур расшифровки — длительный процесс, требующий детального изучения кода вирусов). Но давайте вернемся вновь к полиморфным вирусам. Они работали на схожих принципах и, к примеру, могли быть также самошифрующимися, а для своей защиты генерировать полиморфный дешифратор!

С их появлением умерла большая доля существовавших на тот момент антивирусных продуктов, ибо те не могли предоставить от них защиту. Конечно, их тоже можно обнаружить, использовав процедурно-сигнатурный подход, но ситуация осложнялась тем, что число полиморфиков росло в геометрической прогрессии! У разработчиков чисто физически не хватало времени для написания процедуры детектирования для каждого. И все же решение было найдено... Изначально им оказалась обычная трассировка программы! Трассировка — это пошаговое исполнение программы. Детали реализации рассматривать не стоит — отмечу лишь то, что на этом принципе основаны все отладчики. Таким образом мы можем определить некую логику программы, выделить характерные признаки, которые справедливы при исполнении конкретного вируса, и вынести свой вердикт. Но, увы, противодействовать ей очень легко — существует огромное число способов узнать, находимся ли мы под трассировкой. В лучшем случае вирус может завершить себя, заблокировав работу антивируса, а в худшем — запустить на исполнение деструктивный код. Идеологическим продолжением стало создание эмулятора кода. В этом случае непосредственно кусок кода помещается в специальную среду (буфер), в которой разбирается на инструкции и запускается на псевдоисполнение! Но везде есть свои нюансы, и правильно обработать любую ситуацию достаточно сложно, поэтому к разработке эмуляторов прилагают очень много усилий. Еще одним недостатком является такое понятие, как время эмуляции — предельное время, по истечении которого процесс псевдоисполнения будет прекращен. Грубо говоря, эмулятор может зависнуть, или уйти в бесконечный цикл, да и если тратить много времени на эмуляцию каждого файла, процесс сканирования может затянуться на несколько суток. Также существует проблема, связанная с тем, что, если эмулятор не знает какой-либо инструкции или неправильно воспринимает логику участка кода, он либо прекращает свою работу, либо начинает неправильный процесс эмуляции, в результате чего будет прекращен через некоторое время (время эмуляции). Именно этими недостатками пользуются разработчики вирусов — они часто в свои творения вставляют подобные ловушки. Но, несмотря на это, эмуляторы достаточно часто выходят из сложных ситуаций "с чистой совестью".

И в конце хотелось бы сказать о достойном наследнике полиморфизма — метаморфизме. Суть этого метода заключается в ПОЛНОМ изменении тела вируса без изменения его функциональности. Здесь уже нет никаких общих решений для детектирования подобного семейства вирусов — подход индивидуальный. Единственным вариантом, который можно применить в общих ситуациях, является построение графа потока исполнения. Имея один (несколько) экземпляров, мы, грубо говоря, запоминаем его логику и сравниваем его с логикой проверяемой программы, т.е. оцениваем их семантически, а не синтаксически! Данные методы достаточно сложны в реализации, а других внятных решений подобной проблемы мне отыскать не удалось.

Эвристика

Достаточно загадочное, но часто употребляемое в рекламных акциях слово греческого происхождения. Обычно его употребляют, когда речь идет о детектировании неизвестных вирусов. Ну что ж, давайте разберемся с самого начала. На мой взгляд, данная технология является скорее попыткой выделиться на рынке антивирусных продуктов, нежели действительно придумать технологию по борьбе с неизвестными вредоносными программами. Вирус хоть и очень сложно отличить от обычной программы, но существует ряд признаков, которые в совокупности дают возможность полагать, что перед нами зловред или зараженная программа. Ну, для начала рассмотрим файловые вирусы — при заражении исполняемого файла они должны каким-то образом добавить в него свой код. Существует три основных техники: создание новой секции либо увеличение размера последней в исполняемом файле с последующим помещением кода в новое пространство, либо внедрение в пустые участки файла (например, пространство между секциями файла). При этом у каждого исполняемого файла (дальше для простоты будем называть его PE-файлом) есть строго определенная структура и свой заголовок, при помощи которого можно ориентироваться в этой структуре. Так вот, одним из полей заголовка является поле, указывавшее на Точку Входа (Entery Point — EP). EP — место (адрес), с которого начинается исполнение программы. При заражении он правит это поле и меняет адрес на тот, откуда начинается его собственный код. После запуска зараженной программы сначала исполнится тело вируса, а потом он передаст управление на оригинальную EP программы. Таким образом, мы имеем зараженный файл, при этом он сохраняет свою работоспособность. Так как же нам в таком случаи поможет эвристика? Очень редко точка входа незараженного файла находится в последней секции и уж тем более не может (с точки зрения правильной программы) находиться между другими секциями. Пользуясь этим, антивирус делает вывод, что перед нами Unknown_WIN32_Virus. В набор подобных правил также входят списки подозрительных команд (или, опять же, их сочетание), подозрительные строки внутри бинарного файла, API-функции, которые использует приложение, и т.д. Данный метод — это попытка имитировать процесс человеческого мышления. Но, на мой взгляд, это не совсем удачная попытка, т.к. часты случаи ложных срабатываний, и порой они по количеству превышают верные.

Проактивная защита (HIPS)

Довольно изобретательная техника, появившаяся совсем недавно. Не все антивирусы успели обзавестись ей, но многие уже к этому стремятся. Начнем, как всегда, с самого начала. Когда вирус (в качестве примера будем рассматривать троянскую программу) попадает на компьютер, первым делам он должен закрепиться в системе: поместить свою копию в каком-либо системном каталоге, т.к. обычно рядовые пользователи туда не заглядывают. Следующим этапом закрепления становится запись в автозагрузку (существует уйма способов это сделать, поэтому чем больше подобных мест знакомо проактивной защите, тем лучше), ну, а дальше идет полезная нагрузка/установка вспомогательных драйверов в ситему (достаточно популярная техника), изменение памяти других процессов (в частности, внедрение dll-библиотеки в адресное пространство доверенного процесса — например, интернет-браузера), кража конфиденциальных данных. Как же нам поможет эта самая проактивная защита? Ее основная задача заключается в том, чтобы предотвратить потенциально опасные действия, производимые в системе, но есть один недостаток. Система не может принимать решений самостоятельно, выбор действия предоставляется самому пользователю (собственно, он либо разрешает потенциально опасное действие, либо нет). В большинстве случаев он способен выбрать адекватное действие для данной ситуации, но, как всегда, свою роль играет человеческий фактор, поэтому даже наличие подобной системы не способно полностью оградить нас от угрозы.

Но существуют и более основательные решения, обладающие серьезным аналитическим компонентом, который уже сам может принимать часть решений без вмешательства пользователя. Возьму на себя смелость отнести часть функций файрволла к проативной защите(а в большинстве случаев они в полной мере обладают таковой). Как вы могли догадаться, это доступ интернет-приложений — даже если антивирус не смог обнаружить трояна, данная возможность просто-напросто заблокирует его работу с сетью, поэтому вся украденная информация не будет передана. В технологию создания проактивной защиты углубляться не буду — скажу лишь ключевую фразу, которую стоит ввести в поисковик, и он вам выдаст целую кучу статей по этому поводу. Перехват API-функций — на этот запрос вы получите нужные результаты. А теперь, как всегда, небольшая ложка дегтя в бочке меда. Т.к. технология относительно молода, в ее реализации очень часто допускаются грубые ошибки, что приводит к зависанию системы, или появлению BSOD (Blue Screen Of Dead), или даже порой встраиваются механизмы, способные отключить данный вид защиты. Как уже было сказано, подобную технику принято еще называть словом HIPS. Также существует некоторое ответвление этой технологии — Sandbox (от англ. "песочница") — хотя это является скорее логическим продолжением эмулятора, но полноценную реализацию подобной "песочницы" я встречал всего в одном антивирусе. Его разработчики пошли намного дальше остальных. Можно сказать, что они смогли сэмулировать работу операционной системы в защищенной среде, помещая в нее вирус и анализируя его поведение (копирование в системные папки, запись в реестр, попытка доступа к сети, активная запись в файлы и многое другое). Это способно не только пометить его как потенциальный вирус (не только трояны, но и все остальные классификации), но и даже определить его тип.

Способы борьбы с руткитами (Rootkits)

Для людей, не знакомых с данным термином, попытаюсь доходчиво объяснить, что же из собой представляют руткиты. Как таковым вирусом их называть нельзя, т.к. они не обладают никакими деструктивными действиями, не размножаются, не крадут конфиденциальную информацию. Это лишь техника, применяемая для скрытого присутствия в системе. Как ни странно, но все HIPS'ы основаны именно на той технологии, которая изначально была заложена в руткиты. Так что же они делают? В первую очередь они способны скрывать файлы на жестком диске, ключи реестра, загруженные драйверы, процессы, сетевые подключения, входящий/исходящий трафик. Уже, наверно, стало очевидно, чем это грозит. Без специальных программ невозможно определить присутствие вирусов, использующих данный метод сокрытия, в системе (Rku, AVZ, GMER). Каждый уважающий себя антивирус просто обязан иметь способы противодействия руткитам. Еще одним важным моментом является то, что обычно руткит-компонент находится в драйвере (об использовании драйверов я упоминал ранее), что позволяет ему работать в Ring0 (нулевое кольцо) — в этом режиме ему дозволено все... Конечно, антивирусы тоже прибегают к выходу в этот режим для противодействия руткитам, но, т.к. в этом режиме нет ограничений, то охота на руткит напоминает игру "кошки-мышки" — вирусописатели прибегают к недокументированным возможностям ОС, что прибавляет головной боли разработчикам антивирусов. Сами методы поиска никто не раскрывает, но, если хорошо поискать в интернете, можно обнаружить парочку способов. Обсуждать их все — тема отдельной статьи. Могу лишь сказать, что антивирусы с уверенностью справляются только с теми руткитами, которые используют стандартные технологии (на текущий момент существует очень много способов реализации этой техники), а ведь попадаются очень сложные случаи, которые гуляли в интернете очень долгое время, и при этом никем не были обнаружены (пример: семейство руткитов Rustok).

Крипторы\Упаковщики и прочие

В последнее время вся индустрия создания вирусов перешла на коммерческую основу. Если раньше вирусы разрабатывались только за счет чистого энтузиазма, то теперь ситуация изменилась в корни. Файловые вирусы стали совсем невостребованными, т.к., кроме эстетического удовольствия и деструкции, ничего не несут. Поэтому возможность подхватить подобную разновидность вируса очень мала. Большую же популярность получили трояны. Их основная функция — кража каких-либо данных — например, паролей. На особом положении находятся DdoS- и Spam-боты. Это тоже целая индустрия, приносящая огромные доходы владельцам ботнет-сетей. В настоящее время обязанности в этой сфере строго распределены — те люди, которые создают троянов\ботов, сами ими не пользуются, а продают их. И цена зависит от полезной нагрузки. Также встречаются случаи разработки на заказ. А сейчас перейду к главному.

Представьте: нехороший человек заказал создание индивидуального троянам и некоторое время начинает использовать его в своих корыстных целях. В скором времени вирус попадает на анализ в антивирусные лаборатории, и его уже начинают поголовно обнаруживать. И как поступает в таком случае обладатель этого трояна? Разумеется, отдавать N-ную сумму (которая может достигать нескольких тысяч долларов) за создание нового трояна он не хочет. Ну, в принципе, он может обратиться с просьбой "очистки" к тому, кто его разрабатывал, но иногда либо возникают какие-то проблемы, либо стоимость этой услуги превышает допустимую. Вот тут-то ему на помощь и приходят крипторы\упаковщики. Изначально они использовались для защиты от дизассемблирования и сжатия исполняемого файла, но при этом возникает, так сказать, побочное действие, а именно меняется полностью код трояна (т.к. он шифруется и\или сжимается). При этом крипторы основаны на технике "самошифрующихся" вирусов — как говорится, "все новое — это хорошо забытое старое". Да и упаковщики не многим отличаются. Из-за этого сигнатуры становятся бесполезными, и вирус снова не детектируется. Но это лишь минимальная нагрузка, которую они могут нести — почти все современные крипторы используют полиморфизм, во-вторых, в них также включаются компоненты для обхода проактивных защит и файрволлов, разные техники для усложнения его анализа, антиэмуляционные и антиотладочные трюки. В общем, полный букет. При этом стоимость подобных утилит находится в приемлемом диапазоне цен (если речь идет о покупке самого криптора). Также существую "крипт-сервисы", которые за очень малые деньги способны затереть сигнатуру трояна — цена их обычно варьируется в диапазоне от 10 центов до нескольких долларов! Именно поэтому эта услуга так популярна — она требует минимальных затрат и времени.

Также хотелось бы отметить джоинеры (Joiners). Единственная их задача — склеить файл вируса с какой-нибудь безвредной программой. На входе имеем 2 или более файлов, на выходе — 1. Если запустить этот файл, одновременно запустятся обе программы, которые изначально были подготовлены. Пользователь думает, что все в порядке, т.к. действительно запустилась программка с красочным интерфейсом и радующая глаз, а в это время вирус уже закрепился в системе и начал свое дело. Ну, а теперь перейдем к самим методам борьбы с ними. Если вы внимательно читали предыдущие части статьи, то могли догадаться, что одним из способов обнаружения является эмулятор кода — собственно, именно для этого он был и создан. Но помогает он не всегда, поэтому многие разработчики антивирусного ПО пошли более простым путем (и более небезопасным с точки зрения защиты). Они создают еще одну базу, в которой хранятся сигнатуры крипторов\упаковщиков, ну, или алгоритмы, которые способны их детектировать (если речь идет о полиморфных гибридах), и базу процедур распаковки. Но распаковывают они не полностью, а только ту часть программы, к которой можно было бы применить уже обычное сигнатурное сканирование. Но иногда они поступают еще проще: если к ним попадает вирус, защищенный криптором, причем этот криптор специально нацелен на сокрытие сигнатур вирусов, то они не мучаются с написанием распакованных процедур, а просто выделяют сигнатуру расшифровщика и добавляют его в базу как вирус. Достаточно интересным моментом является то, что антивирус все равно умудряются обмануть путем совмещения нескольких крипторов и\или упаковщика — не всегда это получается, но многие антивирусы неадекватно реагируют на подобные симбиозы и пропускают файл как чистый.

Заключение

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

Ne0n, ne0n@sa-sec.org, SASwcurity gr.


Компьютерная газета. Статья была опубликована в номере 14 за 2008 год в рубрике безопасность

©1997-2024 Компьютерная газета