Развитие информационных технологий сказывается на разработке всего спектра программного обеспечения (ПО). Не обходит оно стороной и вредоносные программы. Можно выделить основные приемы, применяемые при разработке «передового» вредоносного программного обеспечения (ВПО).
- Эксплуатация уязвимостей ПО, установленного на поражаемом компьютере для своего скрытого запуска или повышения привелегий.
Примеры — Stuxnet вместо традиционного запуска с USB носителя через автозапуск (autorun.inf) использовал уязвимость обработки ярлыков MS10-046, позже эту же уязвимость стал использоватьSality. Conficker использовал уязвимость сетевого сервиса «Сервер» MS08-067, это позволило ему размножиться на большое количество машин. Уязвимость, как правило, относится к классупереполнение буфера, но не обязательно, может быть еще переполнение кучи и др. Краткая суть переполнения буфера: в программировании часто используют стек. Концепция стека позволяет упростить передачу параметров в функцию и возврата управления в то место, откуда произошел вызов функции. Пример: вызвали мы свою нужную функцию, которая должна вводить строку с клавиатуры, в стек был помещен адрес возврата, допустим 4 байта, далее мы зарезервировали в стеке 255 байт под строку — нам не жалко. А товарищ Иванов при работе с нашей программой взял да и ввел строку длиной 364 байт. 4 байта адреса возврата при этом переписались другими байтами (из строки). Поэтому назад управление вернется не в то место, откуда вызывалась функция, а в какое-то другое. В том числе можно подстроить, что наша строка будет содержать в себе двоичные коды и переход произойдет на адрес, указывающий на область памяти внутри нашей строки. Такая подстроенная последовательность (вообще данных, не только строк) называется шелл-кодом, а вредоносная программа, внедряющая шелл-код — эксплоитом. Уязвимость же нашей программы заключается в том, что нет проверки длинны вводимой строки. Для устранения уязвимости применяется патч. Патч — это программа (или последовательность действий), которая изменяет определенные файлы для устранения уязвимостей. - Применение технологии полиморфизма.
Как известно, одним из методов антивируса для обнаружения вредоносных программ являетсясигнатурный анализ. Это значит, что для ВПО определяется какая-либо характерная последовательность данных (байт), которая называется сигнатурой. Такая сигнатура не должна встречаться ни у какой другой программы. В общем случае, она может выглядеть в текстовом описании так: 127 байт от начала равен 7, 145237 байт с конца равен 255, пр этом 145235 байт должен быть равен 0. Полиморфизм же направлен на то, чтобы каждый раз файл ВПО был другим, и для него нельзя было выделить какую-либо закономерность (сигнатуру). Например, Zeus при своей скрытой установке перекодировал свой основной модуль, поэтому на разных компьютерах одна и та же его версия различалась почти в каждом байте. Особо «продвинутым» методом является «серверный» (server-side) полиморфизм, когда вредоносный сервер каждому компьютеру загружает заново собранную копию ВПО. При этом алгоритм преобразования файлов не содержится в самом ВПО, а реализуется на сервере. Это многократно увеличивает возможности по формированию непохожих копий, так как код «мутации» может быть сколь угодно большим и сложным. Данный метод применялся, например, в Storm. - Наличие функционала руткита (rootkit), направленного на сокрытие признаков работы ВПО на зараженном компьютере.
Как правило, это подразумевает невидимость файлов ВПО на уровне системы, невидимость процессов ВПО в «Диспетчере задач», определенных ключей реестра и так далее. - Реализация функций самозащиты.
Самозащита подразумевает противодействие антивирусным программам, например, принудительное завершение их работы, или действиям пользователя, например, блокирование запуска редактора реестра. Также может предотвращаться доступ к порталам антивирусных компаний или сайтам по информационной безопасности, откуда можно получить инструкции по удалению того или иного ВПО, скачать обновление к антивирусу или сам антивирус. Правда, некорректная работа антивируса является демаскирующим фактором для ВПО. Отдельным пунктом идет удаление с поражаемого компьютера своих «конкурентов» — других вредоносных программ. Классическим случаем такого противостояния является борьба между семействами ботов Srizbi и Storm. - Использование системы управления для передачи команд и приема информации от ВПО, устойчивой к действиям антивирусных компаний, направленных на пресечение деятельностиботнета.
Ботнет — это совокупность ботов (вредоносных программ одной разновидности), получающих команды из одного источника — от оператора или операторов (злоумышленников).
Базовые сведения из области криптографии
Для общего понимания, в чем заключается технология электронной цифровой подписи (ЭЦП), о которой речь пойдет далее, необходимо раскрыть основные понятия криптографии. Существующие методы шифрования можно разделить на симметричные — DES, 3DES, AES, RC4, RC6 и асимметричные (или шифрование с открытым ключом) — RSA, ECDSA. Основные различия между ними:
- симметричное шифрование намного быстрее асимметричного (в десятки раз);
- в симметричном шифровании ключ один, в асимметричном — два.
При симметричном шифровании существует необходимость обмена ключом между двумя пользователями (что очень неудобно, особенно если они находятся очень далеко друг от друга), этого недостатка лишено асимметричное шифрование. Его основная сущность: имеется два ключа — закрытый и открытый, причем закрытый ключ невозможно за приемлемое время (например в течении жизни взломщика) подобрать или вычислить из открытого, используя доступные вычислительные мощности сегодняшнего дня. Естественно, что прямо сейчас 8 битный ключ можно вычислить меньше чем за секунду, тогда как 1024 битный придется подбирать в течение множества лет. Еще одно свойство открытого и закрытого ключа — что любым из них можно сообщение зашифровать, а другим расшифровать. То есть возможны две операции:
- отправитель — исходный текст — закрытый ключ — зашифрованный текст — открытый ключ — расшифрованный текст — получатель;
- отправитель — исходный текст — открытый ключ — зашифрованный текст — закрытый ключ — расшифрованный текст — получатель.
Операция 1 применяется для шифрования, операция 2 — для подписи, при этом используются две пары ключей по количеству участников обмена (пользователи A и B):
- отправитель A — исходный текст — закрытый ключ A — зашифрованный текст — открытый ключ A — расшифрованный текст — получатель B;
- отправитель A — исходный текст — открытый ключ B — зашифрованный текст — закрытый ключ B — расшифрованный текст — получатель B.
Закрытый ключ должен храниться только у пользователя и больше нигде, открытый ключ в виде связки пользователь-ключ может свободно распространяться где угодно. В первом случае (удостоверение личности или подпись) пользователь B уверен, что сообщение отправил пользователь A, так как никто кроме A не может зашифровать сообщение, что бы оно расшифровывалось открытым ключом А (закрытый ключ нельзя вычислить по открытому). Во втором случае (шифрование) только пользователь B может расшифровать при помощи своего закрытого ключа B сообщение, зашифрованное любым пользователем при помощи его открытого ключа B (закрытый ключ нельзя вычислить по открытому).
На практике схема несколько сложнее, так как уже опоминалось, что асимметричное шифрование в десятки раз медленнее симметричного. Поэтому при подписи используют шифрование не всего объема данных, а некоторой функции от этих данных, называемой хэш-функцией . В качестве простейшей хэш-функции можно рассмотреть прием, часто применяющийся в астрологии, например число года 1998 равно 1+9+9+8=27=2+7=9. В первом приближении именно так работает хэш-функция, только вместо сложения употребляются многие другие функции. В приведенном примере видно, что, например, год 1899 будет тоже иметь число 9, такая ситуация называется коллизией, это значит, что разным наборам данных соответствует одно значение хэш-функции (или просто хэш). Наиболее распространенные виды хэшей —MD5, MD6, SHA-1, SHA-2. Таким образом, технически ЭЦП — это добавочный блок данных, который содержит зашифрованный закрытым ключом пользователя хэш передаваемых данных. Коллизия может применяться для подделки ЭЦП. Если взять ЭЦП от какого либо файла и сформировать наш подложный файл с таким же хэшем, то у конечного пользователя все вычисления сойдутся, и он подумает, что файл отослан от известного ему человека (а не от нас). Проблема заключается в том, что невозможно создать алгоритм, какие байты добавить к нашему файлу, что бы получилась заданное значение хэша. Конечно можно, допустим, добавить к нашему файлу байт со значением 0, потом 1, 2 и так до 255, затем аналогичным образом добавлять второй, третий и т.д., но это займет очень много времени.
Что же касается шифрования, то там тоже применяются некоторые модификации. Так, асимметричным алгоритмом шифруется опять-таки не весь набор данных, а так называемый сеансовый ключ, генерируемый случайным образом. Этим сеансовым ключом и шифруется набор данных по симметричному алгоритму, что происходит гораздо быстрее. Сам сеансовый ключ шифруется открытым ключом получателя и добавляется к исходным данным. Получатель расшифровывает своим закрытым ключом сеансовый ключ, и с его помощью расшифровывает исходное сообщение.
Использование криптографии во вредоносных программах
С помощью применения криптографических методов злоумышленники решают следующие задачи:
- путем применения ЭЦП подтверждают, что обновленная версия ВПО или команда получена действительно от операторов, а не от конкурентов-злоумышленников или сотрудников антивирусных компаний. Для этого открытый ключ «зашивается» в бота, а закрытый — хранится в надежном месте (естественно, не на сервере). Не секрет, что многие программы содержат в себе уязвимости, не являются исключением в этом смысле и командные сервера ботнетов. В некоторых случаях удавалось осуществить взлом таких серверов, далее появлялась возможность отдать команду на самоуничтожение ботов, распространить антивирусную утилиту под видом новой версии бота или сменить адрес управляющего центра. Использование ЭЦП снимает проблему перехвата управления над ботнетом;
- шифруют информацию, украденную с зараженного компьютера. Таким образом, результатами работы ботсети могут воспользоваться только ее операторы (которые имеют закрытый ключ), то есть взлом сервера управления ничего не даст;
- многие антивирусные средства не анализируют действия программ (мониторинг подозрительных действий, например внедрения своего кода в другой процесс), если они подписаны ЭЦП крупных компаний-производителей ПО и разработчиков драйверов. Эта особенность успешно используется злоумышленниками для обхода систем антивирусной защиты. Подпись формируется при помощи украденных закрытых ключей (Stuxnet подписан украденным ключом Realtek), методом подбора коллизии (Flame подписан якобы Microsoft), в отдельных случаях удавалось зарегистрировать фиктивную компанию по разработке ПО и получить свой собственный закрытый ключ легально;
- эксперты антивирусных компаний отмечают, что в последнее время участились случаи распространения ransomware — программ-вымогателей. В качестве классического образца ransomware можно привести GPCode. Эта вредоносная программа шифрует файлы пользователя случайным сеансовым ключом, который сохраняет в зашифрованном при помощи открытого ключа (находится в GPCode) виде. Исходные данные, естественно, стираются. Для выполнения обратной операции необходимо перечислить определенную денежную сумму по реквизитам, оставленным злоумышленником и переслать ему этот зашифрованный сеансовый ключ. Он расшифровывается при помощи закрытого ключа (находится у злоумышленника) и отправляется обратно пользователю, после чего файлы будут успешно расшифрованы. Единственная надежная защита от воздействия подобных программ — резервное копирование.
Разновидности систем управления
В своем развитии системы управления прошли следующие стадии:
- жестко заданные адреса E-Mail;
- использование IRC чатов, боты подсоединялись к определенным каналам на заданных серверах, при этом сервера могли быть как легальными, так и взломанными, с последующей установкой на него ПО IRC сервера;
- жестко заданные доменные имена или IP адреса;
- использование DGA (Domain Generation Algorithm – алгоритм генерации доменных имен);
- использование технологий P2P.
Очевидно, что все, что задано статически, рано или поздно блокировалось антивирусными компаниями. Для решения этих проблем и используются технологии DGA и P2P.
Сущность DGA заключается в том, что имена командных центров для управления не являются жестко заданным, а генерируются по псевдослучайному алгоритму с использованием текущей даты и времени, причем количество таких доменов должно быть достаточно большим, например 1000 в сутки. Это приводит к тому, что зарегистрировать или заблокировать все такие имена — очень сложная и практически неосуществимая задача. Однако использование DGA в ВПО позволяет антивирусным компаниям использовать так называемый sinkhole-маршрутизатор — поддельный управляющий центр, который боты начинают воспринимать как свой. Таким образом, становится возможным оценить масштабы заражений и их географическое распределение путем анализа IP адресов входящих соединений. В отдельных случаях это даже позволяет перехватить управление и дать команду на самоуничтожение, что, впрочем, редкость, так как команды и новые файлы обычно подписываются ЭЦП злоумышленниками.
Использование же P2P позволяет полностью отказаться от концепции управляющего центра, управление или распространение новых версий бота может производиться с любого зараженного компьютера.
P2P (peer-to-peer, одноранговая сеть) предполагает большое количество компьютеров, каждый из которых содержит некоторую информацию о других таких же компьютерах, например IP адрес. Список таких компьютеров (пиров, peer) называется bootstrap list (список первоначальной инициализации). В зависимости от того, откуда берется этот список, различают частично децентрализованные и полностью децентрализованные P2P сети.
Частично децентрализованные P2P сети предполагают загрузку bootstrap list с заранее известных серверов. В частности, так работает uTorrrent. В такой системе существует слабое место — достаточно заблокировать доступ к серверам, содержащим bootstrap list. Поэтому в ВПО используется полностью децентрализованная схема. Следует отметить, что концепция полностью децентрализованный P2P сети применительно к ВПО подразумевает, что распространение будет проходить в два этапа. На первом этапе распространяется бот с пустым bootstrap list, он периодически обращается к командному центру, тот в свою очередь фиксирует IP адрес бота. Кроме непосредственно IP адреса, операторов ботнета интересует информация, не находится ли бот за шлюзом (gateway) или сетевым экраном (firewall). Если это не так, значит, бот может выступать в роли супер пира (super peer, super node), то есть к нему могут напрямую подключаться другие пиры. Как только набрано необходимое количество суперпиров, их список заносится в bootstrap list, и новая версия бота с ним начинает распространяться злоумышленниками. После распространения все боты обмениваются информацией о своих соседях и формируют свой собственный bootstrap list. В результате этого возникает P2P сеть. Она устойчива к пропаданию определенного количества ботов, так как список соседей постоянно меняется. В ходе обмена боты также обмениваются информацией о своей версии. Если бот обнаруживает, что он «устарел», происходит закачка новой версии с одного из соседей. При закачке, как правило, проверяется ЭЦП файла, что бы исключить возможность распространения «не своих» файлов. Таким образом, все боты в P2P поддерживают себя в актуальном состоянии. Именно по вышеописанной двухэтапной схеме работают последние версии Storm, Sality и Zeus. Используемая ими реализация P2P базируется на протоколе Kademlia. Conficker использует свою собственную реализацию, самое интересное в ней то, что bootstrap list у него первоначально пустой, своих соседей он обнаруживает методом сканирования IP адресов. В связи со своими особенностями Conficker более напоминает средство отработки новейших технологий в написании ВПО, чем просто очередной бот.
Подводя итоги, можно сделать вывод, что создатели современного ВПО достаточно серьезно подходят к вопросам обеспечения живучести своих вредоносных программ. Причем имеется тенденция, что антивирусные компании реально проигрывают в этой гонке. Использование P2P и ЭЦП практически не дает шансов «расправиться» с ботнетами.