Эволюция технологий самозащиты вредоносных программ
Мы попробуем проследить пути зарождения «инстинкта самосохранения» вредоносных программ, его эволюцию под давлением все более жестких для вируcов условий и оценить, каково нынешнее положение дел.
Но прежде необходимо определить, что именно мы будем понимать под словосочетанием «самозащита вредоносных программ». Оно не столь однозначно, как кажется на первый взгляд. Нападение на антивирус — это, очевидно, вид самозащиты. Сокрытие следов функционирования — тоже в каком-то смысле самозащита, хотя уже не столь явная. И уже совсем не очевидно, что самозащитой является и сам факт эволюции вредоносных программ. Однако это так. Ведь одной из мотиваций вирусописателя к поиску новых платформ для заражения, новых лазеек в системе является в том числе и желание выпустить свое детище в свободную среду — в такую область, куда еще не смотрит ни одна пара глаз, потому что там никогда ничего не находили.
Во избежание такой путаницы — что считать технологией самозащиты, а что нет — мы рассмотрим только наиболее популярные и очевидные способы самозащиты вредоносных программ. В первую очередь к таковым относятся разные способы модификации и упаковки кода, самосокрытия в системе и нарушения функционирования систем антивирусной защиты.
Способы самозащиты вредоносных программ очень многочисленны и разнообразны. Некоторые из защитных технологий нацелены на обход сигнатурных антивирусов, другие — на затруднение анализа кода специалистами; одна вредоносная программа старается как можно тщательнее спрятаться в системе, в то время как другая, не тратя на это свое драгоценное процессорное время, занимается непосредственно поиском и «отстрелом» конкретных средств антивирусной защиты. К тому же, тот или иной прием можно классифицировать по-разному и отнести к разным категориям.
Поскольку нашей целью не является построение строгой системы классификации технологий самозащиты, рассмотрим такую систему, которая позволила бы сориентироваться в предмете на интуитивном уровне. За основу возьмем два параметра, которые, на наш взгляд, являются наиболее существенными, и построим своеобразную систему координат, по осям которой будем откладывать «значения» этих двух параметров.
Первый параметр — это степень активности самозащиты вредоносной программы. Наиболее «пассивные» представители цифровой фауны вообще не защищаются самостоятельно — т.е. не содержат в себе соответствующего кода. Некая защитная оболочка для них была создана самим автором. У наиболее «активных» самозащита превращается в целенаправленную агрессию.
Второй параметр — это степень специализации защиты вредоносной программы. Наиболее «узкая специализация» защиты — у вредоносных программ, так или иначе нарушающих работу конкретного антивируса. Наиболее широкая, «общая» защита — «защита от всего» — у вредоносных программ, стремящихся сделать свое пребывание в системе максимально незаметным во всех отношениях.
В этой системе координат разместим виды самозащиты вредоносных программ. Следует помнить, что приведенная диаграмма — не более чем игрушечное наглядное пособие, позволяющее сориентироваться в технологиях самозащиты вредоносных программ. Эта модель — субъективное построение автора, основанное, однако, на тщательном анализе поведения вредоносных программ.
Тот или иной способ самозащиты вредоносной программы решает одну или сразу несколько задач. Вот основные из них:
1)Затруднить детектирование вируса сигнатурными методами;
2)Затруднить анализ кода вируса специалистами;
3)Затруднить обнаружение вредоносной программы в системе;
4)Затруднить работу «защитного» ПО (антивирусов, файерволов).
В данной статье я рассматриваю только вредоносные программы для операционной системы Windows (и предшествовавшей ей DOS) — ввиду малой популярности и, как следствие, слабо выраженных тенденций развития вредоносных программ для других платформ. Все тенденции, рассматриваемые в статье по отношению к исполняемым (EXE, DLL, SYS) вредоносным файлам, с некоторым округлением относятся также к макро- и скрипт-вирусам, поэтому я не буду упоминать последние отдельно.
Полиморфизм, обфускацию и шифрование имеет смысл рассматривать вместе, поскольку они решают одни и те же задачи, разве что в разных пропорциях. Изначально у модификации кода вредоносной программы было две цели: затруднение файлового детектирования и затруднение анализа кода специалистом.
История вредоносных программ начинается в 70-х годах, а история их самозащиты — в конце 80-х. Первым вирусом, который попытался решить задачу защиты своего тела от уже существовавших тогда антивирусных утилит, был DOS-вирус Cascade (Virus.DOS.Cascade). Его «самозащита» заключалась в частичном шифровании собственного кода. Эта задача оказалась не решена, поскольку каждый новый экземпляр вируса, хотя и был уникален, все же содержал в себе неизменную часть, которая «выдавала» его и позволяла антивирусам его поймать. Однако новое направление мысли вирусописателей было задано, и через два года появился первый полиморфный вирус Chameleon (Virus.DOS.Chameleon), известный также под именем «1260», а его ровесник Whale использовал для защиты своего кода сложное шифрование и обфускацию. Еще через два года начали появляться так называемые полиморфик-генераторы, которые можно было применить в качестве готового решения для защиты кода вредоносной программы.
Тут необходимо пояснить, почему модификация кода является средством противодействия файловому детектированию, и как это детектирование работает.
До последних лет работа антивирусов была основана исключительно на анализе кода файла. При этом более ранний сигнатурный способ детектирования опирался на поиск жестко заданных последовательностей байт, зачастую по фиксированному смещению от начала файла, в бинарном коде вредоносной программы. Появившийся несколько позже эвристический способ детектирования также работал с кодом файла, но опирался уже на более свободный, вероятностный поиск характерных для вредоносной программы последовательностей байт. Очевидно, что вредоносная программа легко обойдет такую защиту, если каждая ее копия будет представлять собой новый набор байт.
Именно эту задачу и решают полиморфизм и метаморфизм, суть которых, без углубления в технические детали, заключается в том, что при создании своей копии вредоносная программа полностью мутирует на уровне набора байт, из которого она состоит. При этом ее функционал остается неизменным. Шифрование и обфускация сами по себе в первую очередь нацелены на затруднение анализа кода, но, реализованные определенным образом, оказываются разновидностями полиморфизма — как, например, шифрование каждой копии вируса уникальным ключом в Cascade. Обфускация сама по себе лишь затрудняет анализ, но, используемая по-новому в каждой копии вредоносной программы, препятствует сигнатурному детектированию. Хотелось бы подчеркнуть: нельзя сказать, что одна из вышеперечисленных техник сама по себе является эффективнее других с точки зрения самозащиты вредоносной программы. Скорее, эффективность техники зависит от конкретных обстоятельств и способа ее реализации.
Относительно широкое распространение полиморфизм получил только в эпоху DOS-вирусов, заражающих файлы. Этому есть причины. Написание полиморфного кода — задача исключительно ресурсоемкая и оправдывается только в тех случаях, когда вредоносная программа самостоятельно размножается: при этом каждый новый ее экземпляр представляет собой более или менее уникальный набор байт. Для большинства современных троянцев, не имеющих функции саморазмножения, это не актуально. Поэтому, когда закончилась эпоха DOS-вирусов, полиморфизм стал встречаться во вредоносных программах не слишком часто и использовался скорее для самоутверждения вирусописателя, чем в качестве полезной (с точки зрения задач вредоносной программы) функции.
Напротив, обфускация, равно как и иные способы модификации кода, в большей степени решающие задачу затруднения его анализа, а не задачу затруднения детектирования, именно благодаря этому не теряет своей актуальности.
С тех пор как поведенческие методы детектирования начали вытеснять сигнатурные, приемы модификации кода все меньше способны препятствовать обнаружению вредоносных программ. Поэтому полиморфизм и смежные с ним технологии сегодня непопулярны и остаются лишь средством затруднения анализа кода.
Сокрытие вредоносной программы в системе стало вторым способом защиты от детектирования, реализованным вирусописателями в эпоху DOS. Впервые эта техника была применена в 1990 году, в частности, она входила в арсенал уже упомянутого вируса Whale. Суть ее сводится к тому, что скрывающийся вирус тем или иным способом перехватывает системные сервисы DOS и «подсовывает» пользователю или антивирусной программе ложные данные: например, «чистое» содержимое загрузочного сектора вместо реального, зараженного вредоносной программой.
То, что для операционной системы DOS называлось stealth-технологиями, было «возрождено» на новом уровне в ОС Windows лет 10 спустя под именем rootkit-технологий.
Более подробно о механизмах сокрытия вируса в системе читайте в разделе «Руткиты».
Постепенно вирусы — вредоносные программы, функционирующие лишь в теле «жертвы» и бессильные в качестве отдельного файла — стали замещаться троянцами — полностью самостоятельными вредоносными программами. Этот процесс начался в то время, когда Интернет еще был медленным и не таким бескрайним, как сейчас, а жесткие диски и дискеты — маленькими, вследствие чего размер программы имел большое значение. Для уменьшения размера файла троянца еще в эпоху DOS начали использовать так называемые пакеры — специальные программы, обрабатывающие заданный файл по принципу архиватора.
Побочный — и полезный с точки зрения самозащиты вредоносной программы — эффект от использования пакеров заключается в некотором затруднении детектирования вредоносной программы файловыми методами.
Дело в том, что, разрабатывая новую модификацию вредоносной программы, ее автор обычно меняет несколько строк кода, оставляя его костяк нетронутым. В скомпилированном файле при этом меняются байты на определенном отрезке, и если сигнатура антивируса не состояла именно из этого отрезка, то вредоносная программа будет по-прежнему детектироваться. Обработка программы упаковщиком решает эту проблему, поскольку изменение даже одного байта в исходном исполняемом файле приводит к совершенно новому набору байт в файле упакованном.
Пакеры активно используются и по сей день. Их многообразие и изощренность растет. Многие современные упаковщики, помимо сжатия исходного файла, снабжают его дополнительными функциями самозащиты, нацеленными на затруднение распаковки файла и его анализа при помощи отладчика.
Вредоносные программы для операционной системы Windows начали скрываться в начале 2000-х — то есть, как уже было сказано выше, примерно через 10 лет после появления концепции сокрытия вредоносной программы в системе и реализации ее в DOS. В начале 2004 года в «Лабораторию Касперского» попала удивительная программа, которая не была видна в списке процессов и файлов Windows. Для многих антивирусных экспертов это было началом знакомства с технологиями сокрытия программ в Windows, а для вирусной индустрии она стала предвестником новой серьезной тенденции.
Термин «руткит» (root-kit) восходит к Unix-утилитам, предназначенным для получения несанкционированного root-доступа к системе прозрачно для ее администратора. В настоящий момент под определение «руткит» подпадают как специальные утилиты для сокрытия информации в системе, так и вредоносные программы с функциями сокрытия следов своего присутствия. К последним могут относиться любые внешне регистрируемые проявления приложения: строка в списке процессов, файл на диске, ключи в реестре или даже сетевой трафик.
Каким образом руткит-технология, направленная на сокрытие вредоносной программы в системе, препятствует ее обнаружению средствами защиты? Очень просто: антивирусная утилита является по отношению к системе таким же внешним агентом, как и пользователь. Обычно то, что не видно пользователю, не видно и антивирусу. К счастью, последний может технологически развивать «остроту зрения» и видеть руткит там, где его не видит пользователь.
В основе функционирования руткита лежит тот же принцип, что и в основе stealth-вирусов в DOS. Чаще всего встречаются руткиты, механизм работы которых основан на модификации цепочки системных вызовов и поэтому носит название Execution Path Modification. Такой руткит можно представить себе в качестве шпиона-перехватчика, находящегося в некоторой точке пути, по которому передаются команды или информация, и модифицирующего эти команды или информацию в целях их искажения или управления принимающей стороной незаметно для нее. Теоретически количество точек, в которых может разместиться перехватчик, не ограничено. На практике в настоящий момент в основном используются несколько видов перехвата функций пользовательских приложений (API) и перехвата системных функций ядра. Этот тип руткитов представлен, например, широко известными утилитами Vanquish и Hacker Defender и такими вредоносными программами, как Backdoor.Win32.Haxdoor, Email-Worm.Win32.Mailbot, некоторыми версиями Email-Worm.Win32.Bagle.
Другой распространенный тип руткитов — Direct Kernel Object Modification (DKOM) — можно представить как шпиона-инсайдера, который модифицирует информацию или команды непосредственно в их источнике. Это руткиты, изменяющие системные данные. Типичный представитель — утилита FU; соответствующие функции присутствуют и в троянце Gromozon (Trojan.Win32.Gromp).
Более новая технология, формально соответствующая приведенному здесь определению руткита, — сокрытие файлов в альтернативных потоках данных (Alternate Data Streams, ADS) файловой системы NTFS. Впервые она была использована в 2000 году во вредоносной программе Stream (Virus.Win32.Stream), а «второе рождение» обрела в 2006 году — в Mailbot и Gromozon. Строго говоря, эксплуатация ADS — не столько способ обмана системы, сколько использование малоизвестной ее функции. Поэтому особых перспектив у нее нет.
Еще одна редкая технология, подпадающая под определение руткита лишь частично (но еще меньше соответствующая определениям других классов самозащиты, приведенным в данной статье), — технология использования бестелых файлов, когда вредоносные программы совершенно лишены тела на диске. На данный момент известны два представителя этой технологии: нашумевший в 2001 году Codered (Net-Worm.Win32.CodeRed), существовавший подобно призраку лишь в контексте MS IIS, и обнаруженный совсем недавно концептуальный троянец, хранящий свое тело в реестре.
Вектор современного руткит-движения направлен в сторону виртуализации и использования функций оборудования — обобщенно, в сторону все более глубокого внедрения в систему.
Во все времена существовали вредоносные программы, защищающие себя достаточно активно. В качестве такой защиты может выступать:
1)целенаправленный поиск в системе антивируса, файервола или другой защитной утилиты и нарушение ее работы. В качестве примера можно привести поиск вредоносной программой имени конкретного антивируса в списке процессов и попытку выгрузить этот антивирус;
2)блокирование файлов и открытие их с эксклюзивным доступом в качестве меры противодействия файловым антивирусам;
3)модификация файла hosts с целью блокирования доступа к сайтам антивирусных обновлений;
4)обнаружение окон запросов от системы безопасности (например, окна файервола «Разрешить ли данное соединение?») и имитация нажатия кнопки «Разрешить».
Фактически, целевое нападение на средства защиты — это больше «вынужденная мера», защита прижатого к стенке, чем активное нападение. В современных условиях, когда антивирусы анализируют не только код вредоносных программ, но и их поведение, последние оказываются в большей или меньшей степени безоружны: полной защиты им не обеспечивает ни полиморфизм, ни упаковка, ни даже технологии сокрытия в системе. Поэтому вредоносным программам остается только прицельно отстреливать отдельные проявления или функции «врага». Вне неизбежной необходимости этот способ самозащиты не был бы так популярен, поскольку он является слишком невыгодным с точки зрения максимально широкой защиты.
Антивирусная защита непрерывно развивается от анализа файлов к анализу поведения программ. В отличие от файлового анализа, суть которого разъяснена в разделе «Полиморфизм, обфускация...», поведенческий анализ основан на работе не с файлами, а с событиями на уровне системы, такими как «перечислить процессы, активные в системе», «создать файл с заданным именем в заданной директории», «открыть заданный порт для приема данных». Анализируя цепочки таких событий, антивирус вычисляет вероятность вредоносности порождающего их процесса и при необходимости сигнализирует об опасности.
Отметим, что в области поведенческого анализа происходит терминологическая путаница, разобраться в которой – задача непростая. В частности, модуль поведенческого анализатора может называться у разных производителей по-разному: «HIPS», «проактивная защита», «эвристика» (Heuristic), «песочница» (Sandbox)… Однако вне зависимости от терминологии очевидно одно: вредоносные программы против поведенческого анализа принципиально бессильны. И эта принципиальная уязвимость задает вероятный вектор эволюции для вредоносных программ.
Иными словами, перед вирусописателями стоит задача научиться обходить поведенческий анализатор. Каким именно способом она будет решена — неясно. Но ясно, например, что использование обфускации на уровне поведения практически бесполезно. А вот развитие технологий диагностики состояния среды, напротив, весьма интересно. В том числе и тем, что они подразумевают повышение «самоосознания» вируса, которое позволило бы ему определить, где именно он находится: в «реальном мире» (в чистой рабочей среде пользователя) или же в «матрице» (под управлением антивируса-анализатора).
У диагностических технологий уже есть предшественник: некоторые вредоносные программы, если их запустить в виртуальной среде (VMWare, Virtual PC), немедленно убивают себя. Встраивая такой механизм самоуничтожения во вредоносную программу, ее автор препятствует ее анализу, иногда проводимому антивирусными специалистами именно в виртуальной среде.
С точки зрения перспектив и динамики развития, состояние рассмотренных выше направлений самозащиты таково:
1. Руткиты стремятся к эксплуатации функций оборудования и к виртуализации. Однако это направление еще не созрело и вряд ли станет существенным (применительно к массивному использованию данной технологии) в ближайшие годы.
2. Технология отказа от файла на диске: два известных концепта вполне позволяют ожидать развития темы в ближайшее время.
3. Использование технологий обфускации незначительно, но неизменно актуально.
4. Использование технологий обнаружения средств защиты и нарушения их функционирования — значительно и неизменно актуально.
5. Использование пакеров значительно и равномерно растет (как по количественным, так и по качественным показателям).
6. Использование технологий обнаружения отладчиков, эмуляторов, виртуальных машин, равно как и других технологий диагностики среды, должно развиваться, чтобы компенсировать массовый переход антивирусов к поведенческому анализу.
Несложно заметить, что тенденции развития самозащиты вредоносных программ изменяются в соответствии с тенденциями развития самих вредоносных программ и защиты от них. В то время, когда большинство вредоносных программ заражали файлы, а в антивирусах использовалось только сигнатурное детектирование, актуальными были полиморфизм и защита кода. В настоящее время вредоносные программы в основном самостоятельны, а антивирусы — все более проактивны. Исходя из этого можно сделать прогноз, какие направления самозащиты вредоносных программ будут развиваться интенсивнее других:
1. Руткиты. Невидимость в системе всегда дает преимущества — даже если уже не спасает от детектирования. Наиболее вероятно появление новых типов бестелых вредоносных программ и, немного позже, использование технологий виртуализации.
2. Обфускация и шифрование. Затруднение анализа кода сохранит актуальность.
3. Противодействие средствам защиты, основанной на поведенческом анализе. Здесь можно ожидать появления каких-то новых технологий, поскольку те, что используются сейчас (целевое нападение на антивирусы), не являются эффективными. Возможно, это будут какие-то способы детектирования виртуальной среды или некое шифрование поведенческих паттернов.
Заключение
Что остается сказать в заключение? Поскольку существуют вредоносные программы — постольку существует и развивается защита от них, — и постольку же будет существовать и развиваться защита вредоносных программ от защиты от вредоносных программ. В связи с чем хочется привести некоторые мысли на тему этого бесконечного противостояния, навеянные наблюдениями за «живой природой».
В последние годы чрезвычайно актуальна следующая ситуация. Некто из среды киберпреступников (или «исследователей», прикрывающихся белыми шляпами) разрабатывает концепт кода, обходящего современные средства защиты, и в целях самопиара, замаскированного под заботу о прогрессе, публикует его как «недетектируемый». Подчеркнем: разумеется, на деле такой концепт является не принципиально недетектируемым, а недетектируемым на уровне одно-двухшагового обхода известных функций средств защиты. Сделать такой одношаговый обход достаточно просто, если известны механизмы защиты.
Подобные публикации заставляют беспокоиться определенный процент пользователей, не знакомых с принципами работы вредоносных программ и антивирусов («А защищает ли мое антивирусное средство от этого нового типа угроз?). В такой ситуации производителям средств защиты остается только бросить долю ресурсов на восстановление своего авторитета: на разработку технологий обхода описанного концепта, обычно таких же, как и сам концепт — одношаговых. В итоге авторитет восстанавливается (а как же иначе?), система «вредоносная программа — антивирус — пользователь» приходит в изначальное состояние, и процесс замыкается в цикл. Каждая новая его итерация порождает все более изощренные вредоносные программы и все более тяжеловесные средства защиты.
Хочется подчеркнуть, что процесс этот весьма ресурсоемкий, бессмысленный и бесконечный, а в последнее время — все более гротескный, и призвать все три его стороны к повышению сознательности. Пользователей — к пониманию того, что никакое средство защиты не является абсолютным, а лучшая защита от опасности — ее предупреждение. Концептуалистов — к тому, чтобы лишний раз задуматься о чистоте своих побуждений перед публикацией концепта, подливающего масла в огонь. А «защитников» — к тому, чтобы заставить себя мыслить шире и глубже, стараясь опережать «врага» не на один шаг, а хотя бы на порядок. И хотя о полном прекращении «гонки вооружений» речь и не идет, препятствовать ее ускорению вполне в силах участников процесса.
---------------------------------------
---------------------------------------
---------------------------------------
---------------------
* Полиморфизм — класс технологий, позволящих саморазмножающейся программе полностью или частично изменять внешний вид и/или структуру своего кода в процессе размножения.
* Обфускация — совокупность приемов запутывания исходного кода программы, имеющих целью максимально затруднить его чтение и анализ, но полностью сохранить функциональность. Технологии обфускации могут быть применены на уровне любого языка программирования – высокоуровневого, скриптового, ассемблера. Примеры простейшей обфускации: разбавление кода нейтральными (не изменяющими функционал программы) операторами; снижение его наглядности посредством использования чрезмерного количества безусловных (либо маскирующихся под условные безусловных) переходов.
* Широко известная в сфере компьютерной безопасности диалектическая пара терминов: Black Hat («черная шляпа», хакер-нелегал) — White Hat («белая шляпа», специалист по информационной безопасности).
Во избежание такой путаницы — что считать технологией самозащиты, а что нет — мы рассмотрим только наиболее популярные и очевидные способы самозащиты вредоносных программ. В первую очередь к таковым относятся разные способы модификации и упаковки кода, самосокрытия в системе и нарушения функционирования систем антивирусной защиты.
Пространство классификации
Способы самозащиты вредоносных программ очень многочисленны и разнообразны. Некоторые из защитных технологий нацелены на обход сигнатурных антивирусов, другие — на затруднение анализа кода специалистами; одна вредоносная программа старается как можно тщательнее спрятаться в системе, в то время как другая, не тратя на это свое драгоценное процессорное время, занимается непосредственно поиском и «отстрелом» конкретных средств антивирусной защиты. К тому же, тот или иной прием можно классифицировать по-разному и отнести к разным категориям.
Поскольку нашей целью не является построение строгой системы классификации технологий самозащиты, рассмотрим такую систему, которая позволила бы сориентироваться в предмете на интуитивном уровне. За основу возьмем два параметра, которые, на наш взгляд, являются наиболее существенными, и построим своеобразную систему координат, по осям которой будем откладывать «значения» этих двух параметров.
Первый параметр — это степень активности самозащиты вредоносной программы. Наиболее «пассивные» представители цифровой фауны вообще не защищаются самостоятельно — т.е. не содержат в себе соответствующего кода. Некая защитная оболочка для них была создана самим автором. У наиболее «активных» самозащита превращается в целенаправленную агрессию.
Второй параметр — это степень специализации защиты вредоносной программы. Наиболее «узкая специализация» защиты — у вредоносных программ, так или иначе нарушающих работу конкретного антивируса. Наиболее широкая, «общая» защита — «защита от всего» — у вредоносных программ, стремящихся сделать свое пребывание в системе максимально незаметным во всех отношениях.
В этой системе координат разместим виды самозащиты вредоносных программ. Следует помнить, что приведенная диаграмма — не более чем игрушечное наглядное пособие, позволяющее сориентироваться в технологиях самозащиты вредоносных программ. Эта модель — субъективное построение автора, основанное, однако, на тщательном анализе поведения вредоносных программ.
Рис. 1. Пространство технологий самозащиты
Тот или иной способ самозащиты вредоносной программы решает одну или сразу несколько задач. Вот основные из них:
1)Затруднить детектирование вируса сигнатурными методами;
2)Затруднить анализ кода вируса специалистами;
3)Затруднить обнаружение вредоносной программы в системе;
4)Затруднить работу «защитного» ПО (антивирусов, файерволов).
В данной статье я рассматриваю только вредоносные программы для операционной системы Windows (и предшествовавшей ей DOS) — ввиду малой популярности и, как следствие, слабо выраженных тенденций развития вредоносных программ для других платформ. Все тенденции, рассматриваемые в статье по отношению к исполняемым (EXE, DLL, SYS) вредоносным файлам, с некоторым округлением относятся также к макро- и скрипт-вирусам, поэтому я не буду упоминать последние отдельно.
Истоки: полиморфизм, обфускация и шифрование
Полиморфизм, обфускацию и шифрование имеет смысл рассматривать вместе, поскольку они решают одни и те же задачи, разве что в разных пропорциях. Изначально у модификации кода вредоносной программы было две цели: затруднение файлового детектирования и затруднение анализа кода специалистом.
История вредоносных программ начинается в 70-х годах, а история их самозащиты — в конце 80-х. Первым вирусом, который попытался решить задачу защиты своего тела от уже существовавших тогда антивирусных утилит, был DOS-вирус Cascade (Virus.DOS.Cascade). Его «самозащита» заключалась в частичном шифровании собственного кода. Эта задача оказалась не решена, поскольку каждый новый экземпляр вируса, хотя и был уникален, все же содержал в себе неизменную часть, которая «выдавала» его и позволяла антивирусам его поймать. Однако новое направление мысли вирусописателей было задано, и через два года появился первый полиморфный вирус Chameleon (Virus.DOS.Chameleon), известный также под именем «1260», а его ровесник Whale использовал для защиты своего кода сложное шифрование и обфускацию. Еще через два года начали появляться так называемые полиморфик-генераторы, которые можно было применить в качестве готового решения для защиты кода вредоносной программы.
Тут необходимо пояснить, почему модификация кода является средством противодействия файловому детектированию, и как это детектирование работает.
До последних лет работа антивирусов была основана исключительно на анализе кода файла. При этом более ранний сигнатурный способ детектирования опирался на поиск жестко заданных последовательностей байт, зачастую по фиксированному смещению от начала файла, в бинарном коде вредоносной программы. Появившийся несколько позже эвристический способ детектирования также работал с кодом файла, но опирался уже на более свободный, вероятностный поиск характерных для вредоносной программы последовательностей байт. Очевидно, что вредоносная программа легко обойдет такую защиту, если каждая ее копия будет представлять собой новый набор байт.
Именно эту задачу и решают полиморфизм и метаморфизм, суть которых, без углубления в технические детали, заключается в том, что при создании своей копии вредоносная программа полностью мутирует на уровне набора байт, из которого она состоит. При этом ее функционал остается неизменным. Шифрование и обфускация сами по себе в первую очередь нацелены на затруднение анализа кода, но, реализованные определенным образом, оказываются разновидностями полиморфизма — как, например, шифрование каждой копии вируса уникальным ключом в Cascade. Обфускация сама по себе лишь затрудняет анализ, но, используемая по-новому в каждой копии вредоносной программы, препятствует сигнатурному детектированию. Хотелось бы подчеркнуть: нельзя сказать, что одна из вышеперечисленных техник сама по себе является эффективнее других с точки зрения самозащиты вредоносной программы. Скорее, эффективность техники зависит от конкретных обстоятельств и способа ее реализации.
Относительно широкое распространение полиморфизм получил только в эпоху DOS-вирусов, заражающих файлы. Этому есть причины. Написание полиморфного кода — задача исключительно ресурсоемкая и оправдывается только в тех случаях, когда вредоносная программа самостоятельно размножается: при этом каждый новый ее экземпляр представляет собой более или менее уникальный набор байт. Для большинства современных троянцев, не имеющих функции саморазмножения, это не актуально. Поэтому, когда закончилась эпоха DOS-вирусов, полиморфизм стал встречаться во вредоносных программах не слишком часто и использовался скорее для самоутверждения вирусописателя, чем в качестве полезной (с точки зрения задач вредоносной программы) функции.
Рис. 2. Полиморфный код P2P-Worm.Win32.Polip
Напротив, обфускация, равно как и иные способы модификации кода, в большей степени решающие задачу затруднения его анализа, а не задачу затруднения детектирования, именно благодаря этому не теряет своей актуальности.
Рис. 3. Диаграмма обфусцированного кода Trojan-Dropper.Win32.Small.ue
С тех пор как поведенческие методы детектирования начали вытеснять сигнатурные, приемы модификации кода все меньше способны препятствовать обнаружению вредоносных программ. Поэтому полиморфизм и смежные с ним технологии сегодня непопулярны и остаются лишь средством затруднения анализа кода.
Stealth-вирусы
Сокрытие вредоносной программы в системе стало вторым способом защиты от детектирования, реализованным вирусописателями в эпоху DOS. Впервые эта техника была применена в 1990 году, в частности, она входила в арсенал уже упомянутого вируса Whale. Суть ее сводится к тому, что скрывающийся вирус тем или иным способом перехватывает системные сервисы DOS и «подсовывает» пользователю или антивирусной программе ложные данные: например, «чистое» содержимое загрузочного сектора вместо реального, зараженного вредоносной программой.
То, что для операционной системы DOS называлось stealth-технологиями, было «возрождено» на новом уровне в ОС Windows лет 10 спустя под именем rootkit-технологий.
Более подробно о механизмах сокрытия вируса в системе читайте в разделе «Руткиты».
Пакеры
Постепенно вирусы — вредоносные программы, функционирующие лишь в теле «жертвы» и бессильные в качестве отдельного файла — стали замещаться троянцами — полностью самостоятельными вредоносными программами. Этот процесс начался в то время, когда Интернет еще был медленным и не таким бескрайним, как сейчас, а жесткие диски и дискеты — маленькими, вследствие чего размер программы имел большое значение. Для уменьшения размера файла троянца еще в эпоху DOS начали использовать так называемые пакеры — специальные программы, обрабатывающие заданный файл по принципу архиватора.
Побочный — и полезный с точки зрения самозащиты вредоносной программы — эффект от использования пакеров заключается в некотором затруднении детектирования вредоносной программы файловыми методами.
Дело в том, что, разрабатывая новую модификацию вредоносной программы, ее автор обычно меняет несколько строк кода, оставляя его костяк нетронутым. В скомпилированном файле при этом меняются байты на определенном отрезке, и если сигнатура антивируса не состояла именно из этого отрезка, то вредоносная программа будет по-прежнему детектироваться. Обработка программы упаковщиком решает эту проблему, поскольку изменение даже одного байта в исходном исполняемом файле приводит к совершенно новому набору байт в файле упакованном.
Рис. 4. Визуальное отличие между упакованным и неупакованным кодом
Пакеры активно используются и по сей день. Их многообразие и изощренность растет. Многие современные упаковщики, помимо сжатия исходного файла, снабжают его дополнительными функциями самозащиты, нацеленными на затруднение распаковки файла и его анализа при помощи отладчика.
Руткиты
Вредоносные программы для операционной системы Windows начали скрываться в начале 2000-х — то есть, как уже было сказано выше, примерно через 10 лет после появления концепции сокрытия вредоносной программы в системе и реализации ее в DOS. В начале 2004 года в «Лабораторию Касперского» попала удивительная программа, которая не была видна в списке процессов и файлов Windows. Для многих антивирусных экспертов это было началом знакомства с технологиями сокрытия программ в Windows, а для вирусной индустрии она стала предвестником новой серьезной тенденции.
Термин «руткит» (root-kit) восходит к Unix-утилитам, предназначенным для получения несанкционированного root-доступа к системе прозрачно для ее администратора. В настоящий момент под определение «руткит» подпадают как специальные утилиты для сокрытия информации в системе, так и вредоносные программы с функциями сокрытия следов своего присутствия. К последним могут относиться любые внешне регистрируемые проявления приложения: строка в списке процессов, файл на диске, ключи в реестре или даже сетевой трафик.
Каким образом руткит-технология, направленная на сокрытие вредоносной программы в системе, препятствует ее обнаружению средствами защиты? Очень просто: антивирусная утилита является по отношению к системе таким же внешним агентом, как и пользователь. Обычно то, что не видно пользователю, не видно и антивирусу. К счастью, последний может технологически развивать «остроту зрения» и видеть руткит там, где его не видит пользователь.
В основе функционирования руткита лежит тот же принцип, что и в основе stealth-вирусов в DOS. Чаще всего встречаются руткиты, механизм работы которых основан на модификации цепочки системных вызовов и поэтому носит название Execution Path Modification. Такой руткит можно представить себе в качестве шпиона-перехватчика, находящегося в некоторой точке пути, по которому передаются команды или информация, и модифицирующего эти команды или информацию в целях их искажения или управления принимающей стороной незаметно для нее. Теоретически количество точек, в которых может разместиться перехватчик, не ограничено. На практике в настоящий момент в основном используются несколько видов перехвата функций пользовательских приложений (API) и перехвата системных функций ядра. Этот тип руткитов представлен, например, широко известными утилитами Vanquish и Hacker Defender и такими вредоносными программами, как Backdoor.Win32.Haxdoor, Email-Worm.Win32.Mailbot, некоторыми версиями Email-Worm.Win32.Bagle.
Рис. 5. Перехват функции ZwQueryDirectoryFile скрывает
файл драйвера в списке файлов
файл драйвера в списке файлов
Другой распространенный тип руткитов — Direct Kernel Object Modification (DKOM) — можно представить как шпиона-инсайдера, который модифицирует информацию или команды непосредственно в их источнике. Это руткиты, изменяющие системные данные. Типичный представитель — утилита FU; соответствующие функции присутствуют и в троянце Gromozon (Trojan.Win32.Gromp).
Более новая технология, формально соответствующая приведенному здесь определению руткита, — сокрытие файлов в альтернативных потоках данных (Alternate Data Streams, ADS) файловой системы NTFS. Впервые она была использована в 2000 году во вредоносной программе Stream (Virus.Win32.Stream), а «второе рождение» обрела в 2006 году — в Mailbot и Gromozon. Строго говоря, эксплуатация ADS — не столько способ обмана системы, сколько использование малоизвестной ее функции. Поэтому особых перспектив у нее нет.
Рис. 6. Эксплуатация «стрима» системной директории
вредоносной программой Mailbot (Rustock)
вредоносной программой Mailbot (Rustock)
Еще одна редкая технология, подпадающая под определение руткита лишь частично (но еще меньше соответствующая определениям других классов самозащиты, приведенным в данной статье), — технология использования бестелых файлов, когда вредоносные программы совершенно лишены тела на диске. На данный момент известны два представителя этой технологии: нашумевший в 2001 году Codered (Net-Worm.Win32.CodeRed), существовавший подобно призраку лишь в контексте MS IIS, и обнаруженный совсем недавно концептуальный троянец, хранящий свое тело в реестре.
Вектор современного руткит-движения направлен в сторону виртуализации и использования функций оборудования — обобщенно, в сторону все более глубокого внедрения в систему.
Борьба с антивирусами
Во все времена существовали вредоносные программы, защищающие себя достаточно активно. В качестве такой защиты может выступать:
1)целенаправленный поиск в системе антивируса, файервола или другой защитной утилиты и нарушение ее работы. В качестве примера можно привести поиск вредоносной программой имени конкретного антивируса в списке процессов и попытку выгрузить этот антивирус;
2)блокирование файлов и открытие их с эксклюзивным доступом в качестве меры противодействия файловым антивирусам;
3)модификация файла hosts с целью блокирования доступа к сайтам антивирусных обновлений;
4)обнаружение окон запросов от системы безопасности (например, окна файервола «Разрешить ли данное соединение?») и имитация нажатия кнопки «Разрешить».
Фактически, целевое нападение на средства защиты — это больше «вынужденная мера», защита прижатого к стенке, чем активное нападение. В современных условиях, когда антивирусы анализируют не только код вредоносных программ, но и их поведение, последние оказываются в большей или меньшей степени безоружны: полной защиты им не обеспечивает ни полиморфизм, ни упаковка, ни даже технологии сокрытия в системе. Поэтому вредоносным программам остается только прицельно отстреливать отдельные проявления или функции «врага». Вне неизбежной необходимости этот способ самозащиты не был бы так популярен, поскольку он является слишком невыгодным с точки зрения максимально широкой защиты.
Будущее: рефлексирующий вирус?
Антивирусная защита непрерывно развивается от анализа файлов к анализу поведения программ. В отличие от файлового анализа, суть которого разъяснена в разделе «Полиморфизм, обфускация...», поведенческий анализ основан на работе не с файлами, а с событиями на уровне системы, такими как «перечислить процессы, активные в системе», «создать файл с заданным именем в заданной директории», «открыть заданный порт для приема данных». Анализируя цепочки таких событий, антивирус вычисляет вероятность вредоносности порождающего их процесса и при необходимости сигнализирует об опасности.
Отметим, что в области поведенческого анализа происходит терминологическая путаница, разобраться в которой – задача непростая. В частности, модуль поведенческого анализатора может называться у разных производителей по-разному: «HIPS», «проактивная защита», «эвристика» (Heuristic), «песочница» (Sandbox)… Однако вне зависимости от терминологии очевидно одно: вредоносные программы против поведенческого анализа принципиально бессильны. И эта принципиальная уязвимость задает вероятный вектор эволюции для вредоносных программ.
Иными словами, перед вирусописателями стоит задача научиться обходить поведенческий анализатор. Каким именно способом она будет решена — неясно. Но ясно, например, что использование обфускации на уровне поведения практически бесполезно. А вот развитие технологий диагностики состояния среды, напротив, весьма интересно. В том числе и тем, что они подразумевают повышение «самоосознания» вируса, которое позволило бы ему определить, где именно он находится: в «реальном мире» (в чистой рабочей среде пользователя) или же в «матрице» (под управлением антивируса-анализатора).
У диагностических технологий уже есть предшественник: некоторые вредоносные программы, если их запустить в виртуальной среде (VMWare, Virtual PC), немедленно убивают себя. Встраивая такой механизм самоуничтожения во вредоносную программу, ее автор препятствует ее анализу, иногда проводимому антивирусными специалистами именно в виртуальной среде.
Тенденции и прогнозы
С точки зрения перспектив и динамики развития, состояние рассмотренных выше направлений самозащиты таково:
1. Руткиты стремятся к эксплуатации функций оборудования и к виртуализации. Однако это направление еще не созрело и вряд ли станет существенным (применительно к массивному использованию данной технологии) в ближайшие годы.
2. Технология отказа от файла на диске: два известных концепта вполне позволяют ожидать развития темы в ближайшее время.
3. Использование технологий обфускации незначительно, но неизменно актуально.
4. Использование технологий обнаружения средств защиты и нарушения их функционирования — значительно и неизменно актуально.
5. Использование пакеров значительно и равномерно растет (как по количественным, так и по качественным показателям).
6. Использование технологий обнаружения отладчиков, эмуляторов, виртуальных машин, равно как и других технологий диагностики среды, должно развиваться, чтобы компенсировать массовый переход антивирусов к поведенческому анализу.
Рис.7. Примерное распределение технологий самозащиты
вредоносных программ на начало 2007г.
вредоносных программ на начало 2007г.
Несложно заметить, что тенденции развития самозащиты вредоносных программ изменяются в соответствии с тенденциями развития самих вредоносных программ и защиты от них. В то время, когда большинство вредоносных программ заражали файлы, а в антивирусах использовалось только сигнатурное детектирование, актуальными были полиморфизм и защита кода. В настоящее время вредоносные программы в основном самостоятельны, а антивирусы — все более проактивны. Исходя из этого можно сделать прогноз, какие направления самозащиты вредоносных программ будут развиваться интенсивнее других:
1. Руткиты. Невидимость в системе всегда дает преимущества — даже если уже не спасает от детектирования. Наиболее вероятно появление новых типов бестелых вредоносных программ и, немного позже, использование технологий виртуализации.
2. Обфускация и шифрование. Затруднение анализа кода сохранит актуальность.
3. Противодействие средствам защиты, основанной на поведенческом анализе. Здесь можно ожидать появления каких-то новых технологий, поскольку те, что используются сейчас (целевое нападение на антивирусы), не являются эффективными. Возможно, это будут какие-то способы детектирования виртуальной среды или некое шифрование поведенческих паттернов.
Заключение
Что остается сказать в заключение? Поскольку существуют вредоносные программы — постольку существует и развивается защита от них, — и постольку же будет существовать и развиваться защита вредоносных программ от защиты от вредоносных программ. В связи с чем хочется привести некоторые мысли на тему этого бесконечного противостояния, навеянные наблюдениями за «живой природой».
В последние годы чрезвычайно актуальна следующая ситуация. Некто из среды киберпреступников (или «исследователей», прикрывающихся белыми шляпами) разрабатывает концепт кода, обходящего современные средства защиты, и в целях самопиара, замаскированного под заботу о прогрессе, публикует его как «недетектируемый». Подчеркнем: разумеется, на деле такой концепт является не принципиально недетектируемым, а недетектируемым на уровне одно-двухшагового обхода известных функций средств защиты. Сделать такой одношаговый обход достаточно просто, если известны механизмы защиты.
Подобные публикации заставляют беспокоиться определенный процент пользователей, не знакомых с принципами работы вредоносных программ и антивирусов («А защищает ли мое антивирусное средство от этого нового типа угроз?). В такой ситуации производителям средств защиты остается только бросить долю ресурсов на восстановление своего авторитета: на разработку технологий обхода описанного концепта, обычно таких же, как и сам концепт — одношаговых. В итоге авторитет восстанавливается (а как же иначе?), система «вредоносная программа — антивирус — пользователь» приходит в изначальное состояние, и процесс замыкается в цикл. Каждая новая его итерация порождает все более изощренные вредоносные программы и все более тяжеловесные средства защиты.
Хочется подчеркнуть, что процесс этот весьма ресурсоемкий, бессмысленный и бесконечный, а в последнее время — все более гротескный, и призвать все три его стороны к повышению сознательности. Пользователей — к пониманию того, что никакое средство защиты не является абсолютным, а лучшая защита от опасности — ее предупреждение. Концептуалистов — к тому, чтобы лишний раз задуматься о чистоте своих побуждений перед публикацией концепта, подливающего масла в огонь. А «защитников» — к тому, чтобы заставить себя мыслить шире и глубже, стараясь опережать «врага» не на один шаг, а хотя бы на порядок. И хотя о полном прекращении «гонки вооружений» речь и не идет, препятствовать ее ускорению вполне в силах участников процесса.
---------------------------------------
---------------------------------------
---------------------------------------
---------------------
* Полиморфизм — класс технологий, позволящих саморазмножающейся программе полностью или частично изменять внешний вид и/или структуру своего кода в процессе размножения.
* Обфускация — совокупность приемов запутывания исходного кода программы, имеющих целью максимально затруднить его чтение и анализ, но полностью сохранить функциональность. Технологии обфускации могут быть применены на уровне любого языка программирования – высокоуровневого, скриптового, ассемблера. Примеры простейшей обфускации: разбавление кода нейтральными (не изменяющими функционал программы) операторами; снижение его наглядности посредством использования чрезмерного количества безусловных (либо маскирующихся под условные безусловных) переходов.
* Широко известная в сфере компьютерной безопасности диалектическая пара терминов: Black Hat («черная шляпа», хакер-нелегал) — White Hat («белая шляпа», специалист по информационной безопасности).
Пожалуйста оцените статью и поделитесь своим мнением в комментариях — это очень важно для нас!
Комментарии8