Уязвимость в GSSAPI-патче к OpenSSH, удалённо эксплуатируемая на стадии до аутентификации

В применяемом во многих дистрибутивах Linux патче gssapi.patch, добавляющем в OpenSSH поддержку обмена ключей на базе GSSAPI, выявлена уязвимость (CVE-2026-3497), приводящая к разыменованию указателя, повреждению памяти и обходу механизма разделения привилегий (Privsep). Уязвимость может быть эксплуатирована удалённо на стадии до осуществления аутентификации. Выявивший проблему исследователь продемонстрировал инициирование аварийного завершения процесса через отправку на SSH-сервер одного модифицированного сетевого пакета. Не исключается, что помимо отказа в обслуживании, существуют более опасные варианты эксплуатации уязвимости.

Примечательно, что в своё время разработчики OpenSSH отказались принимать в основной состав изменение для поддержки GSSAPI из-за сомнений в его безопасности. При этом многие дистрибутивы Linux включили данный патч в свои пакеты c OpenSSH. В обиходе встречается несколько версий GSSAPI-патча, но в большинстве из них имеется приводящая к уязвимости ошибка. Исправление пока доступно только в форме патча, изменения в котором сводятся к замене вызова функции sshpkt_disconnect() на ssh_packet_disconnect() в файле kexgsss.c.

В настоящее время наличие уязвимости подтверждено в Debian и Ubuntu. В остальных дистрибутивах применение проблемного патча и его подверженность уязвимости уточняется (SUSE/openSUSE, RHEL, Gentoo, Arch,
Fedora). Уязвимость проявляется только при включении в настройках опции «GSSAPIKeyExchange yes». На возможность эксплуатации также влияют опции компилятора с которыми в дистрибутивах собран пакет.

Причиной возникновение уязвимости является ошибка в функции sshpkt_disconnect(), из-за которой процесс не завершался после поступления disconnect-сообщения, что позволяло атакующему на стадии согласования ключей отправить не предусмотренный логикой работы сервера тип GSSAPI-сообщения. После поступления внепланового GSSAPI-сообщения, сервер помещает его в очередь и не прерывает выполнение программы, но при этом не инициализирует переменные, определяющие параметры соединения. В дальнейшем в цикле обработки событий выполняется код, который читает неинициализированную структуру recv_tok из стека (читаются данные, оставшиеся в стеке от прошлого вызова функции), отправляет её привилегированному процессу через IPC и затем передаёт в функцию gss_release_buffer(), которая может вызвать функцию free() и освободить память для некорректного указателя, ссылающегося на случайную область памяти.

Источник: http://www.opennet.ru/opennews/art.shtml?num=64983