Раздел: Документация
0 ... 27 28 29 30 31 32 33 ... 102 -iHepB, умолчанию запрещает исполнение1, остается стек и куча. Стек чаще всего полняем но дефолту, а куча — нет, и для установки атрибута Executable черВк приходится «химичить» с системными функциями менеджера виртуадьц0. памяти. Если же голова червя получает управление до того, как уязвимый се" вис создаст новый поток или успеет расщепить процесс вызовом fork, черв, должен обязательно возвратить управление программе-носителю, в противном случае та немедленно ляжет и получится самый натуральный DoS. При ЭТ№ полный возврат управления предполагает потерю власти над машиной, азна чит, и смерть червя. Чтобы не уронить систему, но и не лишиться жизни сам0. му, червь должен оставить свою резидентную копию или модифицировать систему так, чтобы хотя бы изредка получать управление. Это легко. Первое, це самое удачное, зато элементарно реализуемое решение заключается в создании нового файла с последующим добавлением его в список автоматически запускаемых программ. Более изощренные черви внедряют свое тело в подложную динамическую библиотеку и размещают ее в текущем каталоге уязвимого приложения (или просто в каталоге любого более или менее часто запускаемого приложения). Еще червь может изменить порядок загрузки динамических библиотек или даже назначить существующим динамическим библиотекам подложные псевдонимы (в ОС семейства Windows за это отвечает следующий раздел реестра: HKLM\SYSTEM\CurrentControlSet\Control\Session Maneger\KnownDLLs). Сильно извращенные черви могут регистрировать в системе свои ловушки (hocks), модифицировать таблицу импорта процесса-носителя, вставлять в кодовый сегмент команду перехода на свое тело (разумеется, предварительно присвоив ему атрибут Writable), сканировать намять в поисках таблиц виртуальных функций и модифицировать их но своему усмотрению. ВНИМАНИЕ-—- В мире UNIX большинство таблиц виртуальных функций располагаются в области памяти, доступной лишь для чтения, но не для записи. Короче говоря, возможных путей здесь не но-детски много, и затеряться в гуще системных, исполняемых и конфигурационных файлов червю ничего и? стоит. Попутно отметим, что только самые примитивные из червей могут по зволить себе роскошь создания нового процесса, красноречиво свидетельст вующего о наличии посторонних. Печально известный Love San, кстати, отно сится именно к этому классу. Между тем, используя межпроцессорны1 средства взаимодействия, внедриться в адресное пространство чужого пр° цесса ничего не стоит, равно как ничего не стоит заразить любой исполнЯ мый файл, в том числе и ядро системы. Кто там говорит, что операционнь системы класса Windows NT блокируют доступ к запущенным исполняемы* файлам? Выберите любой понравившийся вам файл (пусть для определение сти это будет iexplore.exe) и переименуйте его в iexplore.dll. При наличии Д статочного уровня привилегий (но умолчанию это привилегии адмииистР1 1 По отношению к Windows NT это не так, и всякий код, который только можно прочитать, гюУ*" чаиию можно и исполнить. тора) операция переименования завершается успешно, и активные копии Internet Explorer автоматически перенаправляются системой к новому имени. Теперь создайте подложный iexplore.exe-файл, записывающий какое-нибудь приветствие в системный журнал и загружающий оригинальный Internet Explorer. Разумеется, это только демонстрационная схема. В реальности нес намного сложнее, но вместе с тем и... интереснее! Впрочем, мы отвлеклись. Вернемся к нашему вирусу, в смысле — к червю. Укрепившись в системе, червь переходит к самой главной фазе своей жизнедеятельности — фазе размножения. При наличии полиморфного генератора, вирус создает совершенно видоизмененную копию своего тела, ну или, на худой конец, просто зашифровывает критические сегменты своего тела. Отсутствие всех этих механизмов оставляет червя вполне боевым и жизнеспособным, однако существенно сужает ареал его распространения. Судите сами, незашифрованный вирус легко убивается любым сетевым фильтром, как-то бранлмаузером или маршрутизатором. А вот против полиморфных червей адекватных средств борьбы до сих пор нет, и сомнительно, чтобы они появились в обозримом будущем. Распознание полиморфного кода — эта не та операция, которая может быть осуществлена в реальном времени на магистральных Интернет-каналах. Соотношение пропускной способности современных сетей и вычислительной мощности современных же процессоров явно не в пользу последних. И хотя ни один полиморфный червь до сих пор не замечен в «живой природе», нет никаких гарантий, что таких вирусов не появится впредь. Локальных полиморфных вирусов на платформе Intel IA-32 известен добрый десяток (речь идет о подлинном полиморфизме, а не тривиальном замусоривании кода незначащими машинными командами и иже с ними), как говорится — выбирай, не хочу. Но какой бы алгоритм червь ни использовал для своего размножения, новорожденные экземпляры покидают родительское гнездо и расползаются по соседним машинам, если, конечно, им удастся эти самые машины найти. Существует несколько независимых стратегий распространения, среди которых в первую очередь следует выделить импорт данных из адресной книги Outlook Express или аналогичного почтового клиента, просмотр локальных файлов жертвы на предмет поиска сетевых адресов, сканирование IP-адресов текущей подсети и генерация случайного IP-адреса. Чтобы не парализовать сеть чрезмерной активностью и не отрезать себе пути к распространению, вирус должен использовать пропускные способности захваченных им информационных каналов максимум наполовину, а лучше на десятую или даже сотую часть. Чем меньший вред вирус наносит сетевому сообществу, тем позже он оказывается обнаруженным и тем с меньшей поспешностью администраторы устанавливают соответствующие обновления. Установив соединение с предполагаемой жертвой, червь должен убедиться в наличии необходимой ему версии программного обеспечения и проверить, нет ли на этой системе другого червя. В простейшем случае идентификация осуществляется через рукопожатие. Жертве посылается определенное ключевое слово, внешне выглядящее как безобидный сетевой запрос. Червь, если он только 100Глава 3. Жизненный там есть, перехватывает пакет, возвращая инициатору обмена другое клщ слово, отличное от стандартного ответа незараженного сервера. Механи3!ВОе копожатия — это слабейшее звено обороны червя, конечно, при условщ, червь безоговорочно доверяет своему удаленному собрату. А вдруг это н.4*0 кой не собрат, а его имитатор? Это обстоятельно очень беспокоило Роберта,\j риса, и для борьбы с возможными имитаторами червь был снабжен механи* мом, который по замыслу должен был в одном из семи случаев игнорир0Ват признак червя, повторно внедряясь в уже захваченную машину. Однако вы бранный коэффициент оказался чересчур «параноическим», и уязвимые уз инфицировались многократно, буквально киша червями, съедающими все про цессорное время и всю пропускную способность сетевых каналов. В конечном счете вирусная атака захлебнулась сама собой, и дальнейшее распространение червя стало невозможным. Чтобы этого не произошло, всякий червь должен иметь внутренний счетчик уменьшающийся при каждом успешном расщеплении и при достижении нуля подрывающий червя изнутри. Так или приблизительно так устроен любой живой организм, в противном случае нашей биосфере давно бы наступил конец. А сеть Интернет как раз и представляет собой великолепную модель биосферы в натуральную величину. Поэтому — хотим мы того или нет — программный код должен подчиняться объективным законам природы, не пытаясь идти ей наперекор. Это все равно бесполезно. Кстати говоря, анатомическая схема червя, описанная выше, не является и: общепринятой, ни единственной. Мы выделили в черве два основных компонента — голову и хвост. Другие же исследователи склонны рассматривать червя как организм, состоящий из пасти, именуемой непереводимым термине*: enabling exploit code (отпирающий эксплоитный код); механизма распростри-нения (propagation mechanism) и полезной нагрузки (payload), ответственной за выполнение тех или иных деструктивных действий. Принципиальной разницы между различными изображениями червя, разумеется, нет, но вот термин0 логической путаницы предостаточно. В листинге 3.1. показаны пять голов червя MWORM, поражающие множеств0 уязвимых сервисов. Листинг 3.1. Пять голов червя MWORM switchCIptr->h port) { case 80: //web hole Handl e Port 80 С sock. i net n toa (sin. si naddr). I ptr): break: case 21: // ftp hole if (Handle Port 21 (sock.inet ntoaCsir.sinaddr).Iptr)) { pthread mutex lock(&ndone mutex): wuftp260 vuln(sock. inet ntoa(sin.snn addr). Iptr): pthread nutex unlock(&ndone mutex): 0 ... 27 28 29 30 31 32 33 ... 102
|