
CVE-2020-16898 (Bad Neighbor) Microsoft Windows TCP/IP: логика и правило обнаружения уязвимости
13 октября Microsoft объявила о чрезвычайно критической уязвимости в стеке IPv6 Windows, которая позволяет злоумышленнику отправлять специально созданные пакеты для потенциального выполнения произвольного кода на удаленной системе. Доказательство концепции, переданное участникам MAPP, является одновременно чрезвычайно простым и абсолютно надежным. Оно приводит к немедленному BSOD (синему экрану смерти), но, более того, указывает на вероятность эксплуатации для тех, кто сможет обойти меры защиты Windows 10 и Windows Server 2019. Последствия эксплойта, который позволяет удаленно выполнять код, будут широкими и серьезными, так как это тип ошибки, которая может стать червеобразной. Для удобства мы назвали уязвимость «Плохой сосед», поскольку она находится в протоколе обнаружения соседей ICMPv6, использующем тип объявления маршрутизатора.
Этот документ подготовлен подразделением McAfee Advanced Threat Research. Он предназначен для предоставления ценной информации сетевым администраторам и сотрудникам службы безопасности, стремящимся глубже понять эту уязвимость и защититься от эксплуатации. Представленная здесь сигнатура должна быть тщательно рассмотрена и проверена в тестовых средах перед использованием в производственной среде и может потребовать специальной настройки для целевого развертывания.
Предоставленная информация может быть изменена без уведомления и предоставляется «AS IS», со всеми возможными недостатками, без каких-либо гарантий относительно точности или применимости информации к какой-либо конкретной ситуации или обстоятельствам, и используется на ваш собственный риск. Кроме того, мы не можем гарантировать какую-либо производительность или эффективность для любых сигнатур.
Сигнатура Suricata для этой уязвимости находится в файле cve-2020-16898.rules и содержит следующую логику:
alert icmp any any -> any any (msg:"Potential CVE-2020-16898 Exploit"; lua:cve-2020-16898.lua; sid:202016898; rev:1;)
Соответствующий сценарий Lua можно найти в cve-2020-16898.lua. Он содержит логику, необходимую для правильного анализа уровня ICMPv6 и выявления возможной эксплуатации уязвимости «Плохой сосед», как описано ниже:
Как только мы определили начало уровня ICMPv6, мы проверяем первый байт уровня, чтобы убедиться, что это пакет объявления маршрутизатора ICMPv6 (Type = 134) — если нет, мы выходим.
Поскольку примитивы Suricata не были обновлены для анализа параметров ICMPv6, мы просто переходим к 17-му байту уровня ICMPv6, так как именно там должны начинаться параметры, если они присутствуют (первые 16 байт — это поля фиксированной длины, в соответствии с RFC 4443). Оттуда мы перебираем все параметры, пока не закончатся байты в пакете. Для каждого параметра нас интересуют только первые два байта: поле типа и длины соответственно. Пока мы игнорируем все параметры, не являющиеся RDNSS, для параметра Type = 25 (RDNSS) мы проверяем, является ли Length (второй байт параметра) четным числом. Если да, мы помечаем это. Если нет, продолжаем. Поскольку длина измеряется с шагом 8 байт, мы умножаем Length на 8 и переходим вперед на это количество байт, чтобы добраться до начала следующего параметра (вычитая 1, чтобы учесть байт длины, который мы уже использовали).
С помощью этого правила мы также проверяем, что Length равен как минимум 3, как того требует RFC 8106, но в конечном итоге эта проверка может быть излишней, поскольку нас интересует только четность Length.