ZF

            Червь Уорхола: поражение Интернета за 15 минут!
                           Nicolas C. Weaver
                        nweaver@cs.berkeley.edu

************************* Перевод by DrMAD ****************************

    Нижеприведенные материалы - это анализ наихудшего  развития событий
при  инфицировании  компьютерным  червем  с использованием существующих
механизмов и  модифицированной  стратегии  заражения.  Черви,  подобные
"Червю Уорхола", могут инфицировать каждую уязвимую машину в течение 15
минут,  опередив любые человеческие защитные меры.  Необходимо осознать
возможную угрозу для того, чтобы разработать лучшие средства защиты.

           "В будущем каждый получит шанс на 15 минут славы"
                              Энди Уорхол

=======================================================================

    Недавняя вспышка  активного  червя  Red  Code  доказала,  насколько
уязвима  наша  сеть.  Но  червь  мог быть в тысячу раз ужасней.  Он мог
содержать злонамеренные фрагменты: перепрограммирование FLASH-BIOS, что
потенциально привело бы к разрушению машин. Он мог бы включать атаки на
различные сервера или на вторичную электронную почту,  чтобы  увеличить
распространение.
    Вирусу потребовалось 12 часов, чтобы достичь эпидемического порога,
и  за  это  время  было  организовано  сопротивление  ему.  Но  простым
изменением способа заражения червя  Уорхола  злонамеренный  программист
может  нанести  ущерб  всем  уязвимиым  машинам мира всего за 15 минут.
Ответная реакция человека потерпела бы неудачу перед таким напором. Это
важное свидетельство в пользу того, насколько мы уязвимы.
    Активный червь,  такой как Code Red или оригинальный червь Морриса,
использует  дыры  в  защите  серверов.  Он  сканирует Интернет в поиске
машин,  на которых запущен этот сервис. Затем он пытается взломать этот
сервис.  При успехе он инфицирует машину-жертву другой копией себя.  По
истечении периода в несколько часов он  следует  с  исходной  машины  в
Интернет  и  поражает  его.  Различие  между  активным  червем и червем
Уорхола заключается лишь в стратегии поиска целей инфицирования.
    Существует 4  миллиарда интернетовских адресов и,  допустим,  что 1
миллион машин уязвимы перед вирусом Уорхола.  Допустим, что вирус имеет
размер  примерно  100К  и  выполняется  в  виде нескольких параллельных
потоков,  что позволяет ему зондировать и атаковать одновременно многие
машины.  Далее  предположим,  что  атакуемые сервера имеют качественную
сетевую связь,  так что работающая копия червя зондирует  100  машин  в
секунду  и  инфицирует 10 машин в секунду,  и затрачивает 1 секунду для
того,  чтобы перенести червя к новой  цели.  Окончательно  примем,  что
автор  Уорхолова червя заранее спланировал и подготовил список из 50000
компьютеров с хорошей сетевой  связью  и  работающей  копией  уязвимого
серверного  софта,  так  что  хотя бы 25%  из них действительно были бы
подвержены заражению червем.
    Червь стартует  с  единственой машины,  имея в виду список из 50000
целей.  Червь  обходит  список  в  определенном  порядке,  зондирует  и
инфицирует  машины.  Когда он успешно заражает машину,  то делит список
пополам,  посылает половину на только что инфицированную машину,  а сам
работает  с  другой  половиной.  Это  разделение  труда позволяет червю
инфицировать каждую уязвимую машину из списка в течение минуты.
    Теперь ориентировочно  12000  машин  будут  инфицированы и начнется
вторая стадия.  Червь первоначально попытается инфицировать все хосты в
подсети перед началом поиска новых целей в Большом Интернете. Но вместо
выборки  случайных  машин  или  сканирования  сети  в  последовательном
порядке червь использует псевдослучайный порядок.
    Червь Уорхола содержит генератор для псевдослучайного перемешивания
всех  4  миллиардов  Интернетовских адресов.  Каждая новая копия червя,
порожденная во время фазы обхода  фиксированного  списка,  стартует  со
своего   адреса  и  просматривает  список  в  поиске  новых  целей  для
инфицирования,  в то время как каждая копия червя, порожденная во время
второй  фазы,  сразу  начинает  работу  со случайного адреса.  Если она
обнаруживает другую функционирующую копию себя,  то она выбирает  новый
случайный  адрес  и  продолжает  работу  с  него.  Это  приведет к двум
разновидностям червя:  одна зондирует сеть случайным образом (скачет по
сети),  другая  перебирает  адреса  последовательно (чем минимизируются
усилия и гарантируется,  что какой-нибудь конкретный адрес когда-нибудь
все равно будет затронут).  Даже если черви и не инфицируют новых машин
во  время  этой  фазы,  они  должны  затратить  50-100   часов,   чтобы
просканировать  весь  Интернет  со  скоростью  100  сканов за секунду с
определенной машины.  Если компьютеры включены в список целей  за  свое
быстродействие  и  хорошую  связь,  то это время может быть существенно
меньше.
    Но имея 1 миллион уязвимых машин, любой конкретный акт сканирования
дает  0.25%  вероятности  заражения.  Поэтому,  выполняя  1.2  миллиона
попыток в секунду, исходная копия червя реально поразит за одну попытку
не более 300 целей.  Ко второй минуте после запуска червь заразит около
30000  машин.  К  третьей  минуте  будет  около 70000 зараженных машин.
Понятно,  что полное инфицирование сети будет завершено в  пределах  15
минут.
    В нормальных   условиях   червь,   который   использует   случайное
зондирование,  инфицирует  около половины доступных хостов,  после чего
количество  новых  заражений  начнет   заметно   снижаться.   Полностью
сбалансированный   червь,   который  в  совершенстве  разделяет  задачи
сканирования   Интернета,   будет   замедляться   при   каждом    новом
инфицировании.   Псевдослучайная   или  случайная  комбинация  является
компромиссом,  позволяющим червю всесторонне сканировать  Интернет  без
потерь  на  передачу  информации  между  копиями,  кроме  необходимости
проверить, действительно ли потенциальная цель уже инфицирована.
    Интернет будет  притормаживать  во время этого процесса,  но не так
сильно,  как можно было бы ожидать.  Используя только несколько  байтов
при   сканировании   цели  для  обнаружения,  действительно  ли  сервер
работает,  приблизительно 5К для инфицирования и 100К для передачи  при
успешном    инфицировании,   общее   количество   передаваемых   данных
оказывается неожиданно маленьким:  даже на  пике  инфицирования,  когда
заражено миллион машин,  происходит только сто миллионов сканирований в
секунду по всему миру,  что для сети лишь  чуть-чуть  больше,  чем  это
имело место при Code Red.
    В настоящее время не существует защиты против  злонамеренного червя
Уорхола.  Автор  такого  червя  должен  легко  вызвать сотни миллиардов
реальных разрушений,  включая разрушенные данные, уничтоженные машины и
потерянное время.  К тому времени,  когда мир осознает,  что случилось,
все разрушения уже будут завершены.

    Приложение 1. Обоснование предположений

    Размер червя 100К.  100 Кб данных - это обоснованная  длина  червя.
Этого  достаточно  для  инфицирующего  и  компактного,  но эффективного
злонамеренного кода.  С некоторой осторожностью этот размер может  быть
снижен до 50К и менее.

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

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

    1 секунда  для  инфицирования машины.  Обзор и инфицирование машины
требует, чтобы зондирование было успешным как при передаче червя, так и
в момент старта.  Поскльку червь имеет размер только 100К,  то он легко
выполнится в течение  секунды  для  машин,  связанных  непосредственно.
Обратите   внимание,   что   период  спячки  в  несколько  секунд  лишь
незначительно уменьшает распространение в фазе случайного сканирования,
но зметен лишь в фазе прохода по списку.

    1 миллион уязвимых хостов.  Code Red I и II,  вроде бы инфицировали
от 500000 до 1000000 машин в  сети.  Меньшее  количество  потенциальных
хостов должно незначительно замедлить скорость инфицирования, но даже с
500000 уязвимых машин время распространения должно  составлять  порядка
15 минут. Она должна увеличиваться каждые 2 минуты вместо каждой минуты
пока все уязвимые машины не будут инфицированы.

    Начальный список  сканирования.  Сканирование  по   первоначальному
списку  -  это  медленное  сканирование,  которое  может быть выполнено
только на основе заранее подготовленного списка  потенциально  уязвимых
машин.  В  случае,  если  веб-сервер  еле  ползает,  надо  использовать
какую-то другую  форму  сканирования.  Собрать  такой  список  можно  в
течении  нескольких  недель,  даже  если  сканировать сервера только на
работоспособность,  без учета уязвимости.  Много иформации  доступно  в
опубликованном виде.

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

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

    Псевдослучайное сканирование.  Псевдослучайное перемешивание  очень
легко  делается.  Достаточно  иметь  32-битовый  блочный шифр и выбрать
ключ.  Для генерации N-го шага перемешивания достаточно зашифровать  N.
Для  получения индекса определенной машины K достаточно расшифровать K.

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

    Обычно червь типа Code Red стартует довольно медленно,  и  пока  не
достигнут  определенный  уровень,  случайное зондирование неэффективно.
Поскольку наш червь комбинирует эффекты случайного и детерминированного
зондирования, скорость должна увеличиваться.

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

    Приложение 2. Возможные меры защиты.

    К сожалению,   черви   Уорхола    настолько   быстры,   что   любое
человеческое  вмешательство  в защиту неминуемо провалится.  Переход на
IPv6 должен  работать  чудесно,  поскльку  это  предотвратит  случайное
сканирование   как   жизнеспособное   средство   поиска  новых  хостов.
Существует  множество  таких  вариаций  в  приложениях,  что  отдельные
особенности    могут    помочь    отдельным    машинам   сопротивляться
распространению таких червей.

    Использование программистами  для  написания  серверов   языков   с
проверкой   переполнения  границ  буферов  должно  примерно  наполовину
повысить безопасность.  Но  это  не  панацея,  т.к.  чевь   Уорхола  не
обязательно использует переполнение буферов.

    Один фактор,   который   может  уменьшить  распространение,  -  это
способность роутеров обрабатывать ARP-запросы.  Это приведет к  тесноте
для  червя,  что  замедлит  его распространение.  У меня нет конкретных
оценок, насколько это повлияет.


    ----------------------------------------------------------

    Спасибо Майклу   Константу   (Michael   Constant)   за  помощь  при
разработке стратегий, использованных этим червем.

    ----------------------------------------------------------

    В настоящее время я  пишу  абстактный  эмулятор  для  моделирования
заразности  абстрактного червя Уорхола с различными параметрами.  Я НЕ
ПИШУ САМОГО ЭТОГО ЧЕРВЯ И  НЕ  СОБИРАЮСЬ  ЭТОГО  ДЕЛАТЬ!  "У  меня  нет
необходимости уничтожать мир, чтобы доказать свою точку зрения".

    Моя математика достаточно приблизительна, но позволяет оценить, что
червь  распространяется  по  геометрическому   закону.   Но   симулятор
подтвердил  это.  Я  допишу  первоначальный  код  симулятора  в течение
нескольких дней,  но предварительные  данные  говорят,  что  достаточно
примерно  12  минут  45  секунд  для 1М уязвимых хостов и до 7 минут 30
секунд если потенциальных хостов только 500К.

    ----------------------------------------------------------

    Почему я поддерживаю эту страницу.

    К сожалению,  результаты слишком просты.  Любой  более-менее  умный
программист, кто думает над этой проблемой, придумает протейшее решение
для скоординированного червя,  который разделяет рабочее  пространство.
Скоординированный  червь  очень  быстр,  но требует связи между разными
червями.  Вот почему скоординированный червь НЕ ИМЕЕТ  всего,  что  ему
необходимо для легкого быстрого распространения.

    Во-вторых, даже  существующие  черви,  использующие  от 12 часов до
суток,  все равно слишком  быстры  для  большинства  человеческих  мер.
Посмотрите  на продолжающееся  распространение вариантов Code Red через
примерно 3 недели после активации.  Изменение  этого  времени  до  часа
должно сильно ухудшить ситуацию.

    Наконец, лично  я  являюсь  сторонником  доктрины полной открытости
информации,  особенно когда "плохие  парни"  (продвинутые  криминальные
программисты)  могут  легко получить те же результаты без документации.
Это важно для нас,  чтобы мы могли увидеть и оценить  реальную  угрозу.
Умолчание никому не поможет.

    Мы всегда  знали  после червя Морриса,  что связанные между собой в
гомогенную   сеть   компьютеры   потенциально   уязвимы   для    быстро
перемещающихся  активных  червей.  Это важный результат,  потому что он
напоминает нам,  НАСКОЛЬКО мы сами уязвимы.  Защита с участием человека
не может остановить быстрого активного червя.

    Я не удалю эту страницу.

    ----------------------------------------------------------

    Все права   на   данный   текст   принадлежат  Николасу  Ц.  Уиверу
(nweaver@cs.berkeley.edu). Он может быть воспроизведен только полностью
и с согласия автора.
    Термин "Червь Вархоула"  -  это  оригинальный  термин,  придуманный
автором.
    Если вы скопируете куда-то эту статью, сообщите мне, чтобы я знал -
куда. Мне интересно знать, как моя статья распространяется.

************ Перевод выполнен с любезного разрешения автора ***********


(C) NF, 1998-2004