Введение

Атака на компьютерную систему посредством отправки пакетов ping
Пинг смерти — это тип атаки на компьютерную систему, заключающийся в отправке на компьютер некорректно сформированного или иным образом вредоносного пакета ping. В ходе этой атаки хост отправляет сотни запросов ping другому хосту с размером пакета, превышающим допустимый или имеющим большой размер, чтобы вывести его из строя или занять его обработкой ответов ICMP Echo. Правильно сформированный пакет ping обычно имеет размер 56 байт, или 64 байта с учетом заголовка протокола управления интернет-сообщениями (ICMP), и 84 байта, включая заголовок протокола интернет-версии 4 (IP). Однако любой пакет IPv4 (включая ping) может достигать 65 535 байт. Некоторые компьютерные системы не были изначально разработаны для корректной обработки пакета ping, превышающего максимальный размер пакета, поскольку это нарушает протокол интернет. Как и другие большие, но правильно сформированные пакеты, пинг смерти фрагментируется на группы по 8 октетов перед передачей. Однако при восстановлении целевым компьютером некорректно сформированного пакета может произойти переполнение буфера, вызывающее сбой системы и потенциально позволяющее внедрить вредоносный код. Чрезмерный размер пакета препятствует эффективной обработке данных машиной, оказывая влияние на облачную среду и вызывая сбои в процессах операционной системы, приводящие к перезагрузкам или аварийному завершению работы. В ранних реализациях TCP/IP эту уязвимость было легко эксплуатировать, и она могла затронуть широкий спектр систем, включая Unix, Linux, Mac, Windows и периферийные устройства. По мере того как системы начали фильтровать пинги смерти с помощью межсетевых экранов и других методов обнаружения, появился другой вид атаки ping, известный как ping flood (наводнение ping), который перегружает жертву таким количеством запросов ping, что нормальный трафик не может достичь системы (базовая атака типа «отказ в обслуживании»). Угроза атаки пинг смерти была в значительной степени нейтрализована благодаря развитию технологий. Устройства, выпущенные после 1998 года, включают защиту от подобных атак, что делает их устойчивыми к этой конкретной угрозе. Однако, в ходе дальнейших исследований был выявлен вариант, нацеленный на пакеты IPv6 в системах Windows, что побудило Microsoft выпустить исправление в середине 2013 года.

Подробная информация

Максимальная длина пакета IPv4, включая заголовок IP, составляет 65 535 (2¹⁶ − 1) байт. Это ограничение обусловлено использованием 16-битового поля в заголовке IP, описывающего общую длину пакета. Уровень канала передачи данных практически всегда накладывает ограничения на максимальный размер кадра (см. MTU). В Ethernet это обычно 1500 байт. В таком случае большой IP-пакет разбивается на несколько IP-фрагментов, чтобы каждый из них соответствовал установленному пределу. Приемник IP-фрагментов собирает их в исходный IP-пакет и продолжает его обработку как обычно. При фрагментации каждый IP-фрагмент должен содержать информацию о том, какую часть исходного IP-пакета он представляет. Эта информация хранится в поле "Fragment Offset" в заголовке IP. Поле длиной 13 бит содержит смещение данных в текущем IP-фрагменте относительно начала исходного IP-пакета. Смещение указывается в единицах 8 байт. Это позволяет получить максимальное смещение в размере 65 528 ((2¹³ − 1) * 8). При добавлении 20 байт заголовка IP максимальное значение составит 65 548 байт, что превышает максимальный размер кадра. Следовательно, IP-фрагмент с максимальным смещением должен содержать не более 7 байт данных, иначе он превысит предел максимальной длины пакета. Злоумышленник может отправить IP-фрагмент с максимальным смещением и объемом данных, значительно превышающим 8 байт (в пределах, допустимых физическим уровнем). Когда приемник собирает все IP-фрагменты, он может получить IP-пакет размером более 65 535 байт. Это может привести к переполнению буферов памяти, выделенных приемником для пакета, и вызвать различные проблемы. Как видно из описания, проблема не связана с ICMP, который используется только в качестве полезной нагрузки, достаточной для эксплуатации уязвимости. Проблема заключается в процессе сборки IP-фрагментов, которые могут содержать данные любого протокола (TCP, UDP, IGMP и т. д.). Решение проблемы заключается в добавлении проверок в процесс сборки. Проверка каждого входящего IP-фрагмента должна гарантировать, что сумма значений полей "Fragment Offset" и "Total length" в заголовке IP каждого фрагмента не превышает 65 535. Если сумма больше, пакет считается недействительным, и IP-фрагмент игнорируется. Некоторые межсетевые экраны выполняют эту проверку для защиты хостов, в которых не устранена данная уязвимость. Другое решение – использование буфера памяти размером более 65 535 байт для сборки пакета. (По сути, это нарушение спецификации, поскольку добавляется поддержка пакетов, превышающих допустимый размер.)

Пинг смерти в IPv6

В 2013 году в Microsoft Windows была обнаружена IPv6-версия уязвимости "пинг смерти". Стек TCP/IP в Windows некорректно обрабатывал выделение памяти при обработке входящих некорректно сформированных пакетов ICMPv6, что могло привести к удаленному отказу в обслуживании. Эта уязвимость была устранена в MS13-065 в августе 2013 года. Идентификатор CVE для этой уязвимости: В 2020 году была обнаружена еще одна ошибка в ICMPv6, связанная с объявлениями маршрутизатора, которая могла даже привести к удаленному выполнению кода.