Найденный в том же многострадальном 97-м году метод атаки TEARDROP основан на ошибках в реализации TCP/IP-стека. Подверженными такой атаке оказались WINDOWS-системы, а также компьютеры с установленным LINUX. "Заплатка" MICROSOFT для WINDOWS NT, появившаяся достаточно быстро, - ftp://ftp.microsoft.com/bussys..... Строго говоря, эта "заплатка" предназначалась для защиты от другого типа атак. Метод заключался в посылке большого количества udp-пакетов с искаженным адресом отправителя на 19-й порт, что приводило к повышению udp-трафика. Фурора, подобного появлению winnuke, произведено не было, возможно потому, что общественное мнение свыклось с регулярным возникновением новых dos-атак. Тем не менее teardrop отличается тем, что стал первым в семействе себе подобных клонов (об этом будет рассказано ниже). Также teardrop является прекрасной демонстрацией того, что любые программы, даже состоящие из нескольких строчек, содержат ошибки. Совершим небольшой экскурс в тайны реализации tcp/ip-стека.
Поскольку передача данных в IP-сетях производится не в идеальной среде, а по вполне реальным каналам различного качества, то естественно, что в стандарт заложили возможность передачи больших пакетов фрагментами, которые на принимающей стороне преобразуются в исходный пакет. Речь идет о том, что некий единый пакет на уровне TCP- или UDP-протоколов может быть фрагментирован на уровне IP - протокола более низкого уровня. При этом каждый фрагмент будет характеризоваться смещением от начала исходного пакета и своей длиной. Драйвер TCP/IP-стека собирает все фрагменты на принимающей стороне до тех пор, пока не получит их все (или, во всяком случае, пока не решит, что принял их все). Безусловно, при передаче возможны различные ситуации, которые "умная" реализация TCP/IP должна понимать. В частности, может оказаться, что несколько полученных фрагментов будут пересекаться. Нас интересует ситуация, когда очередной фрагмент имеет смещение, лежащее внутри уже полученного фрагмента. Что же происходит в этом случае? Прежде всего вычисляется размер пересечения. А затем в буфер копируется только та часть нового фрагмента, которая "выступает за границу" старого фрагмента. Все просто и очевидно, за исключением того, что возможна еще одна нестандартная ситуация. А именно - когда новый фрагмент не только начинается внутри старого, но и оканчивается в нем же. По идее, такой фрагмент должен быть просто пропущен, но как раз такую возможность программисты, писавшие WINDOWS NT и LINUX, и не предусмотрели. Что же происходит в результате? Пусть у нас есть уже полученный фрагмент A, начинающийся с A_OFFS и имеющий длину A_LEN. Затем пришел новый фрагмент B, начинающийся с B_OFFS и с длиной B_LEN. Причем A_OFFS (A_OFFS + A_LEN), то есть фрагмент B лежит внутри фрагмента A. проследим действия принимающей стороны по шагам. начало нового фрагмента лежит внутри имеющегося. хорошо! пересекающаяся часть: ((A_OFFS + A_LEN) - B_OFFS). а тот кусочек, что нужно добавить в буфер, начинается с (A_OFFS + A_LEN) и имеет длину ((B_OFFS + B_LEN) - (A_OFFS + A_LEN)). о-ля-ля! длина-то меньше нуля! если вспомнить о машинной зацикленной арифметике, легко понять, что в результате будет скопирован очень большой блок памяти. при этом будет уничтожено все попадавшееся на пути (обычно на пути попадается операционная система). собственно, вышеописанное и есть TEARDROP ("слезинка", англ.). объяснение, приведенное выше, абсолютно верно для LINUX, поскольку его исходный код открыт. но, вероятно, аналогичный механизм делает и WINDOWS NT потенциальной жертвой для TEARDROP-атаки.
Позже возникло несколько модификаций TEARDROP, которые были способны пробивать WINDOWS NT с установленной против обычного TEARDROP "заплаткой". Известность получили BONK (BOINK), NEWTEAR, SYNDROP. Все эти атаки закрываются одной "заплаткой": ftp://ftp.microsoft.com/bussys..... Наиболее оригинальным оказался метод syndrop. По сути, он представляет собой оригинальный teardrop, с тем отличием, что в посылаемых фрагментах устанавливается syn-флаг (снова этот излюбленный флаг).