Устраняем уязвимость механизма объявления маршрутизатора стека IPv6 в Windows

Устраняем уязвимость механизма объявления маршрутизатора стека IPv6 в Windows

Критическая уязвимость в стеке протокола IPv6 затрагивает широко используемые операционные системы Windows и потому является особо опасной. Изъян получил название «Плохой сосед», поскольку был найден в протоколе обнаружения соседей ICMPv6 и использует механизм объявления маршрутизатора. В базе общеизвестных уязвимостей информационной безопасности данная брешь получила идентификатор CVE-2020-16898.

 

 

 

 

 

  1. Введение
  2. Подробные сведения об уязвимости
  3. Фронт атаки
  4. Обнаружение
  5. Устранение
  6. Выводы

Введение

Компания Microsoft сообщила о критической уязвимости в стеке IPv6, с помощью которой системы могут быть скомпрометированы удалённо. Доказательство работоспособности (proof-of-concept), представленное участникам программы Microsoft Active Protection, является простым и надёжным. Данная уязвимость также позволяет вызвать отказ в обслуживании и «синий экран смерти» (BSoD). Кроме того, указывается на возможность её эксплуатации злоумышленником, сумевшим обойти средства защиты Windows 10 и Windows Server 2019. Успешное использование эксплойта приведёт к удалённому выполнению кода. Последствия будут обширными и чрезвычайно серьёзными, поскольку на основе бреши этого типа можно создать программу-червь. Мы назвали эту уязвимость «Плохой сосед» (Bad Neighbor), поскольку она находится в протоколе обнаружения соседей ICMPv6 и использует механизм объявления маршрутизатора (Router Advertisement).

Подробные сведения об уязвимости

Возможность удалённого выполнения кода возникает тогда, когда стек Windows TCP/IP неверно обрабатывает пакеты ICMPv6 типа «Router Advertisement» (RA) с опцией 25 (рекурсивный DNS-сервер, RDNSS) и чётным значением длины поля. В рамках данной опции длина подсчитывается с шагом в 8 байт. Другими словами, общая длина опции RDNSS с длиной 3 составит 24 байта. Опция включает в себя пять полей: тип (Type), длина (Length), зарезервировано / резерв (Reserved), срок службы (Lifetime) и адреса (Addresses) IPv6 рекурсивных DNS-серверов. Длина первых четырёх полей всегда составляет 8 байт, однако последнее поле может включать разное число адресов IPv6, на каждый из которых приходится по 16 байт. В результате длина поля всегда должна быть нечётной (минимальное значение — 3), согласно RFC 8106.

Принимая опции DNS (например, RDNSS и DNSSL) через сообщения типа «объявление маршрутизатора», хост IPv6 обрабатывает их следующим образом:

  • валидность опций DNS проверяется по длине поля;
  • длина поля в опции RDNSS должна быть больше или равна минимальному значению (3) и удовлетворять условию «(Длина − 1) % 2 == 0».

Если значение длины является чётным, стек Windows TCP/IP некорректно заполняет сетевой буфер значением, которое короче необходимого на 8 байт. Это происходит потому, что счёт внутри стека производится с шагом в 16 байт и случаи использования длины поля, не отвечающего стандарту RFC, не предусмотрены. Данное несоответствие приводит к тому, что стек интерпретирует последние 8 байт текущей опции как начало второй опции. Конечный результат — переполнение буфера и возможность удалённого выполнения кода.

Скорее всего, для создания полной цепи эксплуатирования этой уязвимости потребуется утечка памяти или ошибка раскрытия информации в ядре Windows. В то же время на сегодняшний день в интернете представлены рабочие эксплойты для данной бреши, что упрощает злоумышленникам их задачу.

Фронт атаки

Наибольшей опасности подвергнутся пользователи устройств на базе Windows 10, хотя благодаря службе обновлений Windows уровень угрозы, скорее всего, будет быстро снижен до минимума. По нашим оценкам, выполненным с использованием сервиса Shodan.io, число машин на базе Windows Server 2019 с адресами IPv6 исчисляется сотнями, однако всего их — не более 1 000. Возможная причина заключается в том, что большинство серверов защищены брандмауэрами или пользуются услугами провайдеров облачных вычислений (CSP), поэтому закрыты для прямого сканирования Shodan.

Обнаружение

Мы считаем, что уязвимость можно обнаружить с помощью простого эвристического алгоритма, который будет анализировать поступающий трафик ICMPv6, выявляя поле типа 134 (указывает на объявление маршрутизатора) или поле опции 25 (указывает на рекурсивный DNS-сервер или RDNSS). Если у этой опции RDNSS также будет чётная длина поля, эвристический алгоритм сбросит пакет данных или выдаст предупреждение о возможной попытке эксплуатации уязвимости «Плохой сосед».

Устранение

Первой и самой эффективной мерой защиты является установка патча. Если это невозможно, лучшим решением будет отключить IPv6: либо на сетевой карте, либо по периметру сети, сбросив трафик IPv6, если он не является существенным. Кроме того, на сетевом периметре может быть заблокирован или сброшен вредоносный пакет ICMPv6 Router Advertisement. Запущенные службы «Защитник Windows» (Windows Defender) и «Брандмауэр Windows» (Windows Firewall) оказались неспособными заблокировать действия, которые проводились для демонстрации изъяна. В настоящее время неизвестно, можно ли осуществить данную атаку путём направления трафика ICMPv6 по протоколу IPv4 с помощью технологий сужения 6to4 или Teredo. Наши попытки эксплуатации уязвимости этим способом пока не увенчались успехом.

McAfee предложила своим пользователям, которые не могут внедрить патч Windows, использовать названные ниже сигнатуры для платформ сетевой защиты (Network Security Platform, NSP). Они выполняют функцию виртуального патча, защищающего от попытки эксплуатации данной уязвимости и ещё одной бреши, похожей на неё (CVE-2020-16899). В отличие от «Плохого соседа», последствия CVE-2020-16899 — ошибка типа «отказ в обслуживании» в виде BSoD.

NSP Attack ID: 0x40103a00 — ICMP: Windows IPv6 Stack Elevation of Privilege Vulnerability (CVE-2020-16898)

NSP Attack ID: 0x40103b00 — ICMP: Windows Function Discovery SSDP Provider Elevation of Privilege Vulnerability (CVE-2020-16899)

Кроме того, мы опубликовали правила Suricata, которые помогут обнаружить возможные случаи эксплуатации данных уязвимостей в будущем. Из-за ограничений инструментов с открытым кодом, таких как Snort и Suricata, для применения описанного выше логического алгоритма обнаружения необходимо использовать правила Suricata в сочетании со встроенным парсером сценариев Lua. Мы разместили правила и сценарии Lua в нашем публичном репозитории GitHub под заголовками «CVE-2020-16898» и «CVE-2020-16899». Перед внедрением советуем протестировать их в своей среде во избежание рисков ложных срабатываний.

Выводы

Каждый день данные пользователей находятся под воздействием различных атак. Уязвимость «Плохой сосед» особенно опасна. Гигант Microsoft столкнулся с данной критической уязвимостью в стеке IPv6, с помощью которой можно удалённо скомпрометировать системы или вызвать отказ в обслуживании и «синий экран смерти» (BSoD). Хотя для полноценной эксплуатации уязвимости «Плохой сосед» требуется утечка памяти или ошибка раскрытия информации в ядре Windows, в сети «Интернет» уже представлены рабочие эксплойты, что упрощает задачу злоумышленников.

Пользователи устройств на базе Windows 10 могут подвергаться наибольшей опасности, хотя служба Windows Update минимизирует уровень угрозы. Попытки атак в этом случае можно обнаружить с помощью простого эвристического алгоритма, который будет анализировать поступающий трафик ICMPv6, а защититься от уязвимости «Плохой сосед» позволит установка патча. Если это невозможно, лучшее решение — отключить IPv6 на сетевой карте либо сбросить трафик IPv6 (если он незначителен) на периметре сети. Вместе с тем для помощи пользователям компания McAfee опубликовала правила и сценарии в публичном репозитории GitHub под заголовками «CVE-2020-16898» и «CVE-2020-16899».

Полезные ссылки: 
Anti-Malware Яндекс ДзенПодписывайтесь на канал "Anti-Malware" в Telegram, чтобы первыми узнавать о новостях и наших эксклюзивных материалах по информационной безопасности.

RSS: Новые статьи на Anti-Malware.ru