Суета вокруг Роберта - [12]
Теперь будет понятен первый механизм распространения вируса Морриса: обосновавшись на инфицированном узле, вирус рассылал с помощью Sendmail по обнаруженным в пораженной системе адресам соседних узлов "невинное" сообщение, состоящее из 99 строк текста на языке C. Переданное сообщение - текст программы - компилировалось на узле-получателе и полученный модуль начинал работать, избежав выполнения требуемой процедуры входа в систему. Работа этого модуля заключалась в установлении контакта с сервером червя (т.е. атакующей программой-червем, работающей на уже инфицированном узле) и копировании с атакующего узла трех файлов: двух файлов объектного кода (отдельно для VAX и для Sun) и файла с упоминавшимся 99-строчным исходным текстом.
Уже упоминавшийся пользователь из университета Делавэр описал это следующим образом:
"Червь проник через Sendmail. Предполагая получение
обычного сообщения, Дэви открыл порт электронной почты и
позволил разместиться в нем сообщению, являвшемуся на самом деле
первым сегментом червя. Этот сегмент затребовал у Дэви запуска
программы (так называемой оболочки) в отладочном режиме, как
если бы законный пользователь отлаживал обычную программу."
При этом, во-первых, копирование выполнялось только в случае передачи серверу случайного числа, которое было ранее послано этим же
______________________________
[D5] Впоследствии он сказал, что создал этот "черный ход" с целью облегчения работы в системе, доступ к которой закрывал ему чрезмерно усердный администратор.
стр. 23
сервером в ходе попытки заражения. Если сервер не получал такого числа, он отсоединялся от модуля захвата, а сам модуль захвата самоуничтожался. Это должно было предотвратить "поимку" кем-либо файлов червя.
Во-вторых, если копирование в результате чего-либо было неудачным, то сервер также отсоединялся, а модуль захвата уничтожал все уже переданные файлы и самого себя.
И, наконец, в-третьих, модуль захвата в случае удачного копирования поочередно пытался запустить полученные файлы. Если ни один из файлов запустить не удавалось, сервер отсоединялся, а все файлы и сам модуль захвата уничтожались; если же какой-либо файл начинал работать (т.е. попытка заражения увенчалась успехом!), уже эта копия червя разрывала связь с сервером и уничтожала все следы атаки (т.е. все созданные файлы) на диске.
Немалые подозрения вызвал тот факт, что в теле программы были обнаружены структуры данных, обеспечивающие передачу 20 файлов, тогда как на самом деле передавались лишь три. Это послужило источником утверждений, что Моррис задумывал распространять таким образом некоторые опасные для систем подпрограммы. Однако доказать эти намерения не удалось, впрочем, как не удалось выяснить и истинное предназначение обнаруженных структур.
Другим - вторым! - недостатком, использованным вирусом Морриса для собственного распространения, была непродуманность работы другой утилиты, также входящей в состав атакуемых систем - Finger.
Программа Finger также работала в режиме фонового процесса демона - и предоставляла пользователям возможность опрашивать удаленный узел о текущем состоянии системы или активности конкретного пользователя. В случае обнаружения попытки установить связь со стороны удаленного демона, демон Finger данного узла устанавливал связь, считывал одну строку запроса и посылал в ответ информацию, определяемую полученным запросом. Вся беда заключалась в том, что для считывания строки ввода в свой внутренний буфер программа Finger использовала программу gets языка C, а эта программа - как, впрочем, и целый ряд других программ ввода/вывода в C - в процессе размещения информации не проверяла границы буфера ввода, что делало возможным переполнение буфера и, соответственно, затирание данных, размещенных следом за буфером.
Червь передавал демону Finger точно расчитанную строку ввода длиной 536 байтов, которая переполняла буфер ввода и затирала верхний кадр системного стэка таким образом, что в этом кадре оказывались команды, осуществлявшие установление связи с атакующим сервером червя через порт TCP. После установления связи происходила передача на атакуемый узел и запуск программы захвата и происходил процесс, описанный несколько выше.
В данном случае интересно то, что этот метод срабатывал только для систем, работающих на машинах VAX, хотя, как утверждают специалисты, разработать необходимую строку ввода для машин Sun было делом одного часа.
Работающий вирус открывал связь TCP и в директории /tmp создавал файл с именем $$,11.c, где $$ заменялось идентификатором текущего процесса, куда копировался код для расширения программы listener либо helper. По завершению работы Finger вирусная программа, содержащаяся в переданных данных (все тот же первый сегмент червя), поступала на выполнение.
стр. 24
Более понятно об этой лазейке расскажет очевидец событий:
"Второй червь UNIX, принадлежащий тому же автору, также
поступил через электронную почту, но использовал другую схему
атаки. В большинстве систем электронной почты UNIX есть утилита
Finger, которая позволяет получить информацию о пользователях