Уязвимость аутентификации PAP в OpenBSD позволяет обойти проверку пароля и получить доступ к сети

OpenBSD

В стеке PPP операционной системы OpenBSD обнаружена критическая уязвимость аутентификации, затрагивающая протокол PAP (Password Authentication Protocol). Проблема позволяет удалённому злоумышленнику обойти проверку учётных данных и установить сетевое соединение без предъявления действительных имени пользователя и пароля. Уязвимость получила исправление в июне 2026 года, однако её корни уходят в код 1999 года, что делает её одной из самых долгоживущих проблем такого рода в современных операционных системах.

Детали уязвимости

Суть уязвимости заключается в некорректной обработке длины полей входящих PAP-пакетов в функции "sppp_pap_input()" подсистемы "sppp(4)", отвечающей за синхронные PPP- и PPPoE-соединения (Point-to-Point Protocol over Ethernet - протокол двухточечного соединения поверх Ethernet). При аутентификации PAP OpenBSD использует функцию "bcmp()" для сравнения предоставленных учётных данных с хранящимися значениями. Однако реализация полагается на значения длины, извлекаемые непосредственно из входящего кадра PAP, и не проверяет их на минимальную допустимую величину.

Злоумышленник может установить оба поля - "name_len" и "passwd_len" - равными нулю. В этом случае "bcmp()" вызывается с нулевой длиной и, согласно своей спецификации, возвращает 0, что интерпретируется как успешное совпадение. Таким образом, система принимает аутентификацию без фактической проверки каких-либо учётных данных. Это приводит к полному обходу механизма PAP.

Помимо обхода аутентификации, уязвимость создаёт проблему безопасности памяти ядра. Поскольку буферы для учётных данных выделяются динамически через "malloc(strlen(…) + 1)", передача длины, превышающей реальный размер буфера, вынуждает "bcmp()" считывать данные за пределами выделенной области. Это вызывает состояние heap over-read (чтение за границами динамической памяти), потенциально раскрывающее чувствительные данные ядра.

Эксплуатация уязвимости возможна удалённо через канал данных PPPoE. Последовательность вызовов выглядит следующим образом: "pppoe_data_input → pppoeintr → sppp_input → sppp_pap_input". Атакующему не требуются действительные учётные данные или предварительный доступ. Вредоносный PPPoE-сервер, находящийся в том же широковещательном сегменте сети, может выдать себя за легитимный концентратор доступа, завершить PPP-рукопожатие и установить полнофункциональный сеанс. Такой сценарий позволяет перехватывать или перенаправлять сетевой трафик, фактически реализуя атаку "человек посередине" (man-in-the-middle).

Исследователи из Argus Blog продемонстрировали успешную эксплуатацию уязвимости на OpenBSD 7.6. В ходе доказательства концепции вредоносный PPPoE-сервер отправлял PAP-запрос с нулевой длиной учётных данных и получал в ответ "PAP_ACK" (подтверждение аутентификации). Соединение переходило к этапу IPCP (Internet Protocol Control Protocol - протокол управления IP-параметрами) и в итоге устанавливало полную IP-связность без какой-либо аутентификации.

Уязвимость возникла из кода, импортированного из FreeBSD в июле 1999 года, который сам был основан на более ранних реализациях середины 1990-х. Примечательно, что обработчик аутентификации CHAP (Challenge-Handshake Authentication Protocol) в OpenBSD корректно проверяет длины учётных данных перед сравнением, тогда как PAP-обработчик не имел аналогичных проверок более двадцати лет. Обновление 2009 года, внёсшее динамическое выделение памяти, дополнительно усугубило проблему чтения за границами кучи.

В исправленной версии реализована строгая проверка длины: теперь перед вызовом "bcmp()" код удостоверяется, что длина предоставленных имени и пароля точно соответствует длине хранящихся значений. Если длины не совпадают, аутентификация отклоняется. Это устраняет как обход аутентификации, так и уязвимость чтения памяти.

Организациям, использующим OpenBSD в средах PPPoE, следует незамедлительно установить обновление и ограничить доступ к ненадёжным сетевым сегментам, чтобы снизить возможные риски эксплуатации. Неприменение патча оставляет системы открытыми для удалённого обхода аутентификации и потенциального раскрытия данных памяти ядра.

Ссылки

Комментарии: 0