Введение
Атака на компьютерную систему посредством отправки пакетов 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 года.
A ping of death is a type of attack on a computer system that involves sending a malformed or otherwise malicious ping to a computer. In this attack, a host sends hundreds of ping requests with a packet size that is large or illegal to another host to try to take it offline or to keep it preoccupied responding with ICMP Echo replies. A correctly formed ping packet is typically 56 bytes in size, or 64 bytes when the Internet Control Message Protocol (ICMP) header is considered, and 84 bytes including Internet Protocol (IP) version 4 header. However, any IPv4 packet (including pings) may be as large as 65,535 bytes. Some computer systems were never designed to properly handle a ping packet larger than the maximum packet size because it violates the Internet Protocol. Like other large but well formed packets, a ping of death is fragmented into groups of 8 octets before transmission. However, when the target computer reassembles the malformed packet, a buffer overflow can occur, causing a system crash and potentially allowing the injection of malicious code. The excessive byte size prevents the machine from processing it effectively, impacting the cloud environment and causing disruptions in the operating system processes leading to reboots or crashes. In early implementations of TCP/IP, this bug is easy to exploit and can affect a wide variety of systems including Unix, Linux, Mac, Windows, and peripheral devices. As systems began filtering out pings of death through firewalls and other detection methods, a different kind of ping attack known as ping flooding later appeared, which floods the victim with so many ping requests that normal traffic fails to reach the system (a basic denial of service attack). The ping of death attack has been largely neutralized by advancements in technology. Devices produced after 1998 include defenses against such attacks, rendering them resilient to this specific threat. However, in a notable development, a variant targeting IPv6 packets on Windows systems was identified, leading Microsoft to release a patch in mid 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, связанная с объявлениями маршрутизатора, которая могла даже привести к удаленному выполнению кода.