大量Linux发行版在基于其OpenSSH软件包应用GSSAPI密钥交换补丁时引入了一个重要漏洞。
该漏洞被追踪为CVE-2026-3497,由安全研究员Jeremy Brown发现。攻击者只需发送一个精心构造的网络数据包,即可可靠地导致SSH子进程崩溃,并可能突破权限分离边界。
漏洞根源在于服务器端GSSAPI密钥交换处理程序kexgsss.c中的一行代码缺陷。在预期应使用终止进程的ssh_packet_disconnect()的默认错误处理情形中,错误地使用了非终止函数sshpkt_disconnect()。
由于sshpkt_disconnect()仅将断开连接消息加入队列后即返回,并未停止执行,导致错误处理程序继续执行,读取了一个名为recv_tok的未初始化栈变量。
OpenSSH GSSAPI漏洞
随后,该变量的内容通过进程间通信被发送给高权限的监控进程,并传递给gss_release_buffer(),后者可能会在垃圾指针上调用free(),从而导致确认的堆损坏。
Brown的分析将漏洞归类为CWE-824(访问未初始化指针)和CWE-908(使用未初始化资源)。主要影响细节包括:
- 单个精心构造的、约300字节的SSH数据包即可触发该漏洞——无需任何凭证
- 在x86_64系统上,成功利用会产生SIGABRT(信号6)或SIGSEGV(信号11),并导致SSH锁定90秒
- 在测试配置中,子进程崩溃的可靠性达到100%
- 通过权限分离IPC通道,最多可将127KB的堆数据发送到根级别的监控进程,这意味着严重的权限分离边界被突破
由于不同发行版的编译器选项和优化标志存在差异,该漏洞的严重程度差别很大。使用-O0编译的Clang会留下一个值为0xfffbe600、长度为4字节的指针,而使用-O2 -fno-stack-protector编译的GCC会留下一个有效的堆地址,长度达127,344字节。
一个包含八种构建的测试矩阵证实,recv_tok.value的取值范围可能涵盖NULL、栈地址、堆地址,甚至是完全未映射的内存区域。
运行Ubuntu和Debian OpenSSH服务器且启用了GSSAPIKeyExchange的系统已被确认可能受影响。由于Linux生态系统中流传着多个不同版本的GSSAPI KEX补丁,影响范围可能超出这两个发行版。
修复方法很直接:将kexgsss.c中服务器端调用点的所有三处sshpkt_disconnect()替换为ssh_packet_disconnect()。Ubuntu已准备了一个解决该问题的补丁。
运行启用了GSSAPI密钥交换的OpenSSH的管理员应立即应用可用的发行版更新,或临时禁用GSSAPIKeyExchange作为缓解措施。



