Легенды вирусостроения: Великий Червь

:

image21 год назад произошло событие навеки впечатавшее себя в историю интернета.

2 ноября 1988 года 99 строк кода вызвали двухдневный шоковый паралич еще молодого и неопытного в делах безопасности интернета.

Около 6000 VAX машин под управлением операционных систем SUN и BSD UNIX оказались зараженными невиданной доселе заразой. Многие администраторы были вынуждены отключить своих подопечных, чтобы хоть как-то остановить перегрузку компьютеров и распространение заразы.
                              
Это был Червь Морриса или в простонародье просто Великий Червь. Из-за разрушительных последствий, которые он оказал на интернет как в плане общего простоя системы, так и психологического воздействия на представление о безопасности и надежности в сети (по аналогии с Великими Червями Толкиена). Неожиданность атаки и некоторые встроенные в червя механизмы вводили многих админов того времени в пограничные эмоциональные состояния. Реакция размазывалась по спектру от «отключить все!» до панического «нас атакуют!»

Создатель и инициатор червя, на тот момент студент Корнельского университета, Роберт Моррис-младший (старший в это время занимался прямо противоположными вещами, он занимал должность научного руководителя NCSC (National Computer Security Center)) запустил своего монстра с компьютера MIT (prep.ai.mit.edu — машина с открытым доступом), чтобы не привлекать внимания к своему университету. Зачем он это сделал — навсегда останется загадкой. По его собственным утверждениям, это был всего лишь эксперимент, вышедший из-под контроля. Впрочем, строго говоря, Червь и не нанес никакого прямого ущерба.

Небольшой список атакованных компьютеров

   MIT, Университет штата Миннесота, Северная Каролина, Питтсбургский Университет, машины корпорации RAND, Стэнфорд, Беркли, Университет Карнеги-Меллона, Университет Мэриленда, Университет Пенсильвании, снова Массачусетский Технологический, машины Лаборатории Баллистических Исследований, Университет штата Колорадо и Университет Пурдью а также многие другие.

Векторы атаки Червя

image
Для распространения червь использовал несколько различных путей, сводящихся к эксплуатированию уязвимостей и простейшему подбору паролей доступа.

Червь состоял из двух частей: загрузчика (99 строк на языке C) и ядра, состоявшего из двух бинарных модулей — кода скомпилированного для BSD и такого же кода только под архитектуру Sun. Имена всех внутренних процедур имели осмысленные названия (например, doit или cracksome), что довольно сильно в дальнейшем облегчило дизассемблирование бинарников.

Червь внедрял свою копию на удаленные компьютеры и запускал ее. Каждый зараженный компьютер стремился заразить и все прочие связанные с ним машины. Червь был заточен для использования в BSD UNIX и SUN-3. Обнаружив, что такие машины подключены к зараженной, червь копировался на удаленный компьютер, запускался там, стремясь получить максимальный доступ к информации (используя ее только для продолжения взлома), и заражал соседние машины. Лавинообразно распространяясь по незащищенной сети червь множил свои копии в полном соответствии с теорией самовоспроизводящихся механизмов, основы которой заложил еще Джон фон Нейман.

Первое время никто ничего не понимал, но уже через несколько часов самые продвинутые админы начали действовать, кто как мог, кто-то отключал своих подопечных от сети и пытался их перезагружать в надежде снять перегрузку (что было совершенно напрасно, так как при перезапуске системы червь создавал еще несколько своих копий и загрузка системы только увеличивалась), кто-то бросался в панику отправляя в списки рассылки послания — «Нас атакуют!» (что тоже было напрасно, так как из-за действий червя списки не работали уже несколько часов), а кто-то искал причины мгновенного распространения червя.

В Беркли уже вечером того же дня понимают, что атака ведется через rsh и sendmail. В качестве меры предосторожности, начинается блокирование сетевых сервисов.

Через некоторое время, осознав масштаб возникшей проблемы Моррис сообщает своим друзьям о вышедшем из-под контроля эксперименте. Через некоторое время появился анонимный постинг в рассылку TCP-IP, вкратце описывающий, как остановить Червя. Автор постинга (Andy Sudduth) послал это сообщение после телефонного разговора с Моррисом, но, из-за перегрузки сетей и компьютеров, письмо не было отослано в течение примерно суток.

В скором времени независимо друг от друга разными людьми стали обнаруживаться векторы атаки червя.

Первым был выпотрошен демон sendmail. Кейт Бостик отправляет предупреждение о Черве и патчи к sendmail в список рассылки TCP-IP, новостную группу 4bsd-ucb-fixes и нескольким системным администраторам.

Червь использовал функцию «debug» демона sendmail, которая устанавливала отладочный режим для текущего сеанса связи. Дополнительная возможность отладочного режима заключается в том, чтобы посылать сообщения, снабженные программой-получателем, которая запускается на удаленной машине и осуществляет прием сообщения. Эта возможность, не предусмотренная протоколом SMTP, использовалась разработчиками для отладки программы и в рабочей версии была оставлена по ошибке.

Через sendmail червь заражал компьютеры двух типов — VAX и Sun, поэтому пересылались двоичные коды для каждой архитектуры, оба запускались, но исполняться мог только один. В компьютерах других архитектур программы не могли функционировать, хотя и поглощали системные ресурсы в момент компиляции.

Несколько часов спустя выяснилось, что заплатки sendmail не помогают, компьютеры заражаются каким-то другим способом. Из-за действий червя MILNET и ARPANET оказываются разъединены.

По прошествии еще нескольких часов разные люди в разных лабораториях независимо друг от друга обнаружили уязвимость и закончили патчи для демона fingerd.

Фрагмент кода fingerd:

{
char buf[512]:
...
gets(buf);
}

Налицо классическая ситуация переполнения буфера (тогда она, видимо, еще не была классикой). Червь передавал специально подготовленную строку из 536 байт, которая вызывала в конечном итоге функцию execve («/bin/sh», 0, 0). Указанным способом атаковались только машины VAX с операционной системой 4.3 BSD, на компьютерах Sun такие атаки терпели неудачу.

Но и это еще не все. В никсах как тогда, так и сейчас имеется набор сервисов для удаленного выполнения программ сегодня для подобных целей используется ssh, а тогда его место занимали так называемые r-программы. Наиболее уязвимым местом в них была идея «доверия» — пользователи компьютеров, бывшие в списках «доверенных узлов», имели право запускать свои программы на «доверяющей» машине без какой-либо дополнительной проверки. Кроме того, отношение доверия часто было обоюдным. Червь пытался использовать программу запуска удаленного интерпретатора rsh для атаки других машин с полученным именем и паролем текущего пользователя либо вообще без аутентификации, если атакуемая машина «доверяла» данной.

Итак, Червь проникал на соседние с зараженной машины, используя дыру в sendmail, дыру в fingerd или «доверие» и rsh. При проникновении на атакуемый компьютер забрасывался загрузчик, команда на компиляцию и выполнение загрузчика, и стирание всех временных файлов. Затем загрузчик втягивал все три файла и пытался запустить сначала одно, потом другое тело. Если ни одно из двух тел не запускалось, загрузчик просто стирал и их, и себя, и прекращал работу.

Запустившись, Червь всячески маскировался — стирал свой выполняемый файл, шифровал оба тела, читал их в память, а с диска тоже стирал, и, насколько это возможно, модифицировал информацию о себе в таблице процессов.

Затем, собиралась информация о сетевых интерфейсах зараженного компьютера и о соседних компьютерах, и часть соседей подвергалась попыткам заражения. Те, которых удалось заразить, помечались как зараженные; те, которые заразить не удалось — как «иммунные». Хотя здесь в коде червя специалисты склонны усматривать ошибку, так как участок кода отвечающий за предотвращение повторного заражения машин содержал много ошибок.

Это имело ключевое значение для жизнестойкости червя: многие машины заражались повторно, нагрузка на системы и сеть увеличивалась и становилась весьма ощутимой, часто приводящей к отказу в обслуживании, в результате чего червь собственно и был обнаружен и обезврежен намного быстрей, чем если бы повторных заражений не было, хотя многократно зараженные машины распространяли червь быстрее, вероятно, пропорционально числу копий червь на машине, что и повлияло на молниеносность распространения, а отказы в обслуживании привели к панике и выходу из строя некоторых ключевых узлов, в результате чего сеть на время развалилась на подсети.

Подбор паролей осуществлялся довольно простым, но, в то же время, эффективным способом: использовалось четыре вариации на тему login пользователя, а также, список из примерно 200-400 слов. По некоторых сведениям, на отдельных компьютерах больше половины паролей были вскрыты таким образом.

Уже к вечеру 5 ноября основная масса зараженных узлов была вылечена, заплатки наложены, а в Беркли спецы вовсю препарировали бездыханную тушку Червя.

К моменту, когда в ФБР поняли, кто виновен в произошедшем, Моррис уже шел сдаваться с повинной.

След в истории

Для компьютерного сообщества это был шок. Были пересмотрены фундаментальные основы компьютерной безопасности. Ущерб, принесенный Червем Морриса был оценён примерно в 100 миллионов долларов (к таким оценкам следует относиться весьма и весьма осторожно, поскольку каковы методы их оценки, какие параметры считают, а какие нет — неизвестно).

По некоторым данным, Червь это единственная в истории компьютерная программа, потеснившая на первых полосах материалы о президентских выборах в США. Многие институты и организации на несколько недель и даже месяцев отключились от Интернета. Администраторы, не представляя о реальных масштабах опасности, решили перестраховаться.

Наиболее разумной мерой противодействия взлому, спровоцированной Червем, явилось образование CERT.

P.S.

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

Вот системный администратор обязан быть бдителен, должен постоянно следить за безопасностью своих подопечных. Впрочем, увы, сплошь и рядом это не так и на должностях системных администраторов сидят эникейщики.

Хороший администратор — всегда параноик.

В тему:

→   Исходный код Червя Морриса
→  Английская вики-статья о Черве
→  Русская вики-статья о Черве
→  Подробный разбор устройства Червя