Атака на Internet (Медведовский, Леонов) - страница 92

Наши эксперименты показали, что такой уязвимости подвержены все версии ОС Windows NT/95. Причем Service Pack 4.0 в этом случае почти не помогает. После приема одного Land-запроса на некоторое время (45 секунд при установленном Service Pack 3) загрузка системы увеличивается до 100 % и доступ в систему становится невозможным (Windows 95 обычно показывает синий экран). Мы недаром выделили слово «одного». Ведь ничто не мешает атакующему организовать шторм или мини-шторм Land-запросов, а это сделает работу Windows-системы практически невозможной. Например, при тестировании направленным штормом Land-запросов Windows NT 4.0 на платформе Pentium 200 с установленным Service Pack 4 (где серьезно улучшена реакция NT на атаку Land) порог «нормальной» работы был в случае шторма не более 3 500 зап./с. При шторме Land-запросов свыше указанного порогового значения система «замирала» и доступ к ней становился невозможным.

Атаки teardrop и bonk

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

Разработчики ввели проверку на слишком большой объем копируемой информации (чтобы ядро не переносило такой объем данных), но не предусмотрели проверку на копирование слишком маленького фрагмента (фрагмента отрицательной длины). Рассмотрим, к чему приводит отсутствие такой проверки.

Когда фрагмент сообщения помещается в очередь сборки, выполняется поиск его положения в очереди:

end = (offset + total_len) – ihl;

Соответственно, если фрагменты перекрываются, то нужно выровнять их таким образом, чтобы устранить наложение:

if (prev!=NULL && offsetend)

{

i=prev->end-offset;

offset += i;

ptr += i;

}

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

fp->offset = offset

fp->end = end

fp->len = end-offset ( Отрицательная )

Заключенная в цикл инструкция по сборке фрагментов выглядит следующим образом: