Найденная в systemd уязвимость приводит к отказу в обслуживании Linux

Множество дистрибутивов Linux находятся в зоне риска из-за найденной уязвимости в systemd. Проблема заключается в DNS-преобразователе и может привести к атаке отказа в обслуживании.
systemd

Дыра в DNS-преобразователе (DNS Resolver) может привести к атаке типа «отказ в обслуживании» (denial-of-service) на уязвимые системы.

Уязвимость DNS Resolver

По заявлениям исследователей, нашедших брешь, она может быть использована следующим образом. Уязвимую систему заставляют отправлять DNS-запрос на DNS-сервер злоумышленников. Он в свою очередь возвращает специально обработанный запрос, заставляющий systemd запустить бесконечный цикл, который и загрузит ЦП системы до 100%. Найденная уязвимость получила идентификатор CVE-2017-15908.

Существует множество способов заставить машину пользователя отправить запрос на контролируемый DNS-сервер. Самый лёгкий из них — заманить пользователя на скомпрометированную веб-страницу. Этого можно добиться при помощи зловреда или социальной инженерии.

Ключ к безопасности

По словам Уильяма Гамазо Санчеза, исследователя уязвимостей компьютерных систем, самым эффективным способом борьбы с найденной брешью является, как ни странно, патч systemd.

Мы обнаружили эту уязвимость ещё в июле 2017 года и сразу же сообщили соответствующим вендорам через программу Zero Day Initiative (ZDI). Их своевременная реакция на нашу находку смогла предотвратить широкое распространение атаки. Многие дистрибутивы Linux получили патчи, в том числе и Ubuntu.

Анализ уязвимости

За время существования DNS в неё было добавлено много функций, повышающих безопасность. Одним из новых типов записей ресурсов, добавленных в DNS Security Extensions (DNSSEC), как определено в документе RFC 4034, был NSEC (Next Secure).

Уязвимость заключалась в обработке битов, представляющих псевдотипы в битовой карте NSEC. На рисунке ниже изображены раздел кода и стековый кадр, где выделенная строка continue показывает, где именно while переходит в бесконечный цикл. Реализация dns_packet_read_type_window() находится в файле resolve-dns-packet.c.

Обратите внимание, что указанная выше функция dns_packet_read_type_window() вызывается из dns_packet_read_rr(), когда типом записи является DNS_TYPE_NSEC. На приведённом ниже рисунке показан раздел кода dns_packet_read_rr() в файле resolved-dns-packet.c.

Proof-of-concept

Чтобы протестировать эту уязвимость, был создан специальный DNS-сервер, отправляющий злонамеренно сформированные ответы. Каждый из них содержал запись NSEC, предназначенную для запуска уязвимости:

Как только система, использующая systemd для преобразования DNS, получит этот специально созданный пакет, загрузка ЦП достигнет 100%:

Поскольку некоторые крупные дистрибутивы выпустили исправления, пользователям рекомендуется установить их как можно скорее. Системные администраторы также могут заблокировать потенциально вредоносные пакеты вручную. Стоит также проверить ответы входящих DNS на наличие специфических записей, указанных в разделе 4 документа RFC 4034.

Источник: блог TrendLabs Security Intelligence