В патче gssapi.patch, который добавляет поддержку обмена ключей на базе GSSAPI в OpenSSH и широко применяется во многих дистрибутивах Linux, выявлена уязвимость (CVE-2026-3497). Уязвимость приводит к разыменованию указателя, повреждению памяти и обходу механизма разделения привилегий (Privsep).
Уязвимость может быть эксплуатирована удалённо на стадии до аутентификации. Исследователь, выявивший проблему, продемонстрировал, что отправка одного модифицированного сетевого пакета на SSH-сервер инициирует аварийное завершение процесса. Не исключается, что помимо отказа в обслуживании существуют более опасные варианты эксплуатации.
Примечательно, что разработчики OpenSSH изначально отказались принимать изменение для поддержки GSSAPI в основной кодовой базе из-за сомнений в его безопасности. Тем не менее, многие дистрибутивы Linux включили этот патч в свои пакеты. В обиходе существуют различные версии GSSAPI-патча, большинство из которых подвержены выявленной уязвимости.
Исправление пока доступно только в форме патча, в котором замена вызова функции sshpkt_disconnect() на ssh_packet_disconnect() в файле kexgsss.c решает проблему. Наличие уязвимости подтверждено в Debian и Ubuntu. В остальных дистрибутивах (SUSE/openSUSE, RHEL, Gentoo, Arch, Fedora) проверка на наличие проблемного патча продолжается.
Уязвимость проявляется только при включении опции "GSSAPIKeyExchange yes" в настройках. Возможность эксплуатации также зависит от опций компилятора, с которыми был собран пакет в дистрибутиве.
Причиной уязвимости является ошибка в функции sshpkt_disconnect(). При поступлении disconnect-сообщения процесс не завершается, что позволяет атакующему отправить на стадии согласования ключей не предусмотренный логикой работы сервера тип GSSAPI-сообщения. Сервер помещает это сообщение в очередь и продолжает выполнение программы, но при этом не инициализирует переменные, определяющие параметры соединения.
В дальнейшем в цикле обработки событий выполняется код, который читает неинициализированную структуру recv_tok из стека (на практике это значит, что читаются данные, оставшиеся в стеке от предыдущего вызова функции), отправляет её привилегированному процессу через IPC и затем передаёт в функцию gss_release_buffer(), которая может вызвать free() и освободить память для некорректного указателя, ссылающегося на случайную область памяти.