Атака из Internet

         

Математическое предсказание начального


Первый вопрос, который возникает в данном случае: как сетевая операционная система формирует начальное значение ISSa (так называемый ISN - Initial Sequence Number)? Очевидно, что наилучшим решением с точки зрения безопасности будет генерация этого значения ISN по случайному закону с использованием программного (а лучше аппаратного) генератора псевдослучайных чисел с достаточно большим периодом. В этом случае каждое новое значение ISN не будет зависеть от его предыдущего значения, а, следовательно, у атакующего не будет даже теоретической возможности нахождения функционального закона получения ISN.

Однако оказывается, что подобные очевидные правила случайной генерации ISN как для составителей самого описания протокола TCP (RFC 793), так и для разработчиков сетевого ядра различных операционных систем являются далеко не очевидными. Об этом говорят следующие факты. В описании протокола TCP в RFC 793 рекомендуется увеличивать значение этого 32-битного счетчика на 1 каждые 4 микросекунды (?!).

А как дело обстоит на практике? Поверьте, плохо!

Например, в ранних Berkeley-совместимых ядрах ОС UNIX значение этого счетчика увеличивалось на 128 каждую секунду и на 64 для каждого нового соединения. Анализ исходных текстов ядра ОС Linux 1.2.8 показал, что значение ISN вычисляется данной ОС в зависимости от текущего времени по следующему, отнюдь не случайному закону:

  • ISN = mcsec + 1000000 sec, где
    mcsec - время в микросекундах;
    sec - текущее время в секундах, причем отсчет его идет от 1970 года.
  • Вы думаете, что в других сетевых ОС лучше? Ошибаетесь! В ОС Windows NT 4.0 значение ISN увеличивается на 10 примерно каждую миллисекунду, то есть для Windows NT справедлива следующая формула:

  • ISN " 10 msec, где
    msec - текущее время в миллисекундах.
  • Однако больше всего нас удивил защищенный по классу B1 UNIX, установленный на многопроцессорной мини-ЭВМ - полнофункциональном файрволе. Эта наиболее защищенная из всех, что встречалась авторам, сетевая ОС имеет также простой времязависимый алгоритм генерации начального значения идентификатора TCP-соединения. Как говорится, комментарии здесь излишни. Мало того, что в единственном базовом "защищенном" (?!) протоколе Internet - протоколе TCP - применяется простейший способ идентификации соединения, который в принципе не позволяет гарантировать надежную защиту от подмены одного из абонентов при нахождении атакующего в том же сегменте, так еще и сами разработчики сетевых ОС разрушают и без того хрупкую безопасность этого протокола, используя простые времязависимые алгоритмы генерации ISN!




    Итак, в том случае, если в сетевой операционной системе используется времязависимый алгоритм генерации начального значения идентификатора TCP-соединения, то атакующий получает принципиальную возможность определить с той или иной степенью точности вид функции, описывающей закон получения ISN. Исходя из практических исследований сетевых ОС, а также из общих теоретических соображений, можно предложить следующий обобщенный вид функции, описывающий времязависимый закон получения ISN:

  • ISN = F (mсsec, msec, sec),


  • где mcsec - время в микросекундах (обычно, в зависимости от аппаратного обеспечения компьютера, минимальной единицей измерения машинного времени является микросекунда, в обычных IBM это так). Этот параметр циклически изменяется за секунду от 0 до 106- 1;



    msec - время в миллисекундах. Циклически изменяется за секунду от 0 до 999;

    sec - текущее время в секундах. Постоянно увеличивается каждую секунду.

    Рассматривая функцию (3) на малом промежутке времени (меньшем 1 секунды), для удобства аппроксимации можно считать, что

  • ISN = F (mсsec).


  • Итак, мы будем считать, что значение ISN зависит только от микросекунд. Данная функция (4) в силу особенностей изменения своих аргументов обычно в сетевых ОС является или кусочнолинейной или ступенчатой. Например, зависимость (1), описывающая закон получения ISN в ОС Linux, в случае приведения ее к виду (4) является кусочнолинейной, а функциональная зависимость (2), справедливая для Windows NT, - ступенчатой.

    На данном этапе мы вплотную подошли к проблеме определения вида функциональной зависимости ISN от параметра mcsec для конкретной сетевой ОС. Первый способ получения этой зависимости - анализ исходных текстов ядра операционной системы. Использование данного способа на практике обычно оказывается невозможным из-за отсутствия исходных текстов большинства ОС. Исключение составляют ОС Linux и FreeBSD, поставляемые с исходными текстами ядра.

    В связи с этим предлагается другой метод получения закона изменения ISN от параметра mсsec. В этом случае сетевая ОС рассматривается исследователем как "черный ящик" , к которому применяется метод тестирования "запрос - ответ" : на исследуемую сетевую ОС передается серия обычных запросов на создание TCP-соединения и принимается соответствующее количество ответов с текущими значениями ISN операционной системы в каждый момент времени. При этом замеряются временные интервалы (в микросекундах) между запросом и ответом на него и время, прошедшее между запросами. В результате исследователем будет получена следующая таблица дискретных отсчетов ISN и соответствующих им моментов времени в mcsec:



    ISN0 ISN1 ... ISNn
    t0 t1 ... tn
    где ISNn - значение ISN, полученное за время tn от начала эксперимента (время начала эксперимента принимается за 0).

    Аппроксимируя данную таблицу дискретных значений непрерывной функцией одним из известных математических методов (наименьших квадратов, например), получим непрерывную функцию, приближенно описывающую изменение ISN на данном временном промежутке (от 0 до tn), при этом чем выше точность исходных данных, тем точнее приближение:

  • ISN(t) = F(t);


  • Эта формула в общем случае позволяет нам по предыдущему значению ISN, зная функцию изменения ISN от времени, экстраполировать следующее значение ISN. Теперь атакующий может, получив в ответ на TCP-запрос текущее значение ISN для ОС в данный момент времени, математически предсказать следующее возможное значение ISN через некоторый промежуток времени.

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

    Заметим, что атакующему вовсе не обязательно проводить подобные исследования с интересующим его удаленным хостом. Достаточно только узнать тип операционной системы на предполагаемой цели атаки и получить в свое распоряжение подобную систему для определения формулы изменения ISN в данной ОС.

    Что касается практических результатов, то применение описанной выше методики получения формулы ISN(t) на примере ОС Linux 1.2.8 и Windows NT 4.0 в случае нахождения в одном сегменте с данными ОС позволило определить это 32-битное значение (от 0 до 232- 1) по его предыдущему значению для ОС Windows NT с точностью до 10, а для ОС Linux 1.2.8 - с точностью примерно до 100. В следующей таблице приведены снятые в процессе эксперимента с ОС Linux 1.2.8 значения изменения ISN (а не абсолютные значения) за соответствующие промежутки времени:



    Таблица изменения значения ISN для ОС Linux 1.2.8

    t, мкс 2759 5685 8560 11462 14303
    D ISN 65135 134234 202324 270948 338028
    Следующий график, построенный по значениям из данной таблицы и справедливый для ОС Linux 1.2.8, наглядно показывает линейный характер изменения значения начального идентификатора TCP-соединения ISN на данном временном промежутке (на самом деле зависимость изменения ISN для ОС Linux 1.2.8 носит кусочнолинейный характер):



    Зависимость изменения ISN от времени для Linux 1.2.8

    В общем случае, определив вид функций для вычисления ISN в операционных системах на сервере и предполагаемом клиенте, атакующий начинает следить за ОС сервера, ожидая подключения предполагаемого клиента. В тот момент времени, когда подключение произошло, атакующий может подсчитать возможный диапазон значений ISN, которыми обменялись при создании TCP-канала данные хосты. Так как атакующий может вычислить значения ISN только приближенно, то ему не избежать подбора. Однако, если не проводить описанный выше анализ, то для перебора всех возможных значений ISSa и ISSb понадобилось бы послать 264 пакетов, что нереально. В случае использования описанного выше анализа в зависимости от полученной степени точности и удаления атакующего от хостов потребуется послать значительно меньшее число пакетов. Например, если удалось вычислить значения ISN на операционных системах с точностью до 100, то атакующему для подмены одного из абонентов TCP-соединения достаточно послать всего 10000 пакетов.

    Далее мы рассмотрим ставшую уже классической удаленную атаку на r-службу, осуществление которой связано с описанными выше особенностями идентификации TCP-пакетов.


    Содержание раздела