openssh 输入验证错误漏洞

OpenSSH 又出漏洞了。入验这次是证错输入验证错误,编号 CVE-2024-6387,误漏外号 "regreSSHion"。入验听起来像某种复古病毒,证错实际上它确实是误漏个回归漏洞——2006 年修过的问题,2020 年某次代码重构时又被带回来了。入验这种事在开源项目里不算罕见,证错但发生在 OpenSSH 身上,误漏性质就不一样了。入验

OpenSSH 是证错什么?你每次用 ssh 命令连服务器,背后跑的误漏就是它。全球超过 1500 万台服务器在跑 OpenSSH,入验从树莓派到银行核心系统。证错它几乎是误漏互联网基础设施的一部分。所以当 Qualys 的研究团队发现这个漏洞时,整个运维圈都紧张了一下。

漏洞到底怎么回事

问题出在 sshd 的信号处理逻辑上。当客户端连接后没有在规定时间内完成认证,sshd 会触发一个 SIGALRM 信号。处理这个信号的函数调用了非异步信号安全的代码——具体来说,是 syslog() 函数。攻击者可以反复触发这个路径,利用竞态条件在内存里搞事情,最终实现远程代码执行。

听起来很绕?换个说法:你不需要任何凭据,只要能连上目标机器的 22 端口,就能尝试攻击。成功率不是 100%,需要在特定时间窗口内精确命中。但攻击者可以反复试,几千次、几万次,总有撞上的时候。Qualys 的测试数据显示,在 32 位系统上大约 10000 次尝试能成功一次,64 位系统上这个数字会大很多,但并非不可能。

哪些版本受影响

OpenSSH 8.5p1 到 9.7p1 之间的版本都有问题。8.5 之前的版本反而安全——因为 2006 年那个补丁还在。9.8p1 已经修复了。如果你跑的是 Ubuntu 22.04、Debian 12、RHEL 9 这些主流发行版,大概率在受影响范围内。OpenBSD 系统本身不受影响,因为它的信号处理机制不一样。

我查了一下手头的几台机器,一台 Debian 12 跑的是 OpenSSH 9.2p1,中招。另一台老 CentOS 7 跑的是 7.4p1,反而没事。这种"新版本不安全、老版本安全"的倒挂现象,在安全圈里挺讽刺的。

怎么处理

最直接的办法是升级。各大发行版已经推送了补丁包,apt update && apt upgrade 或者 yum update 就能搞定。如果没法立刻升级,有个临时缓解措施:把 sshd_config 里的 LoginGraceTime 设为 0。这会让 sshd 不再触发那个有问题的信号处理路径。代价是连接不再有认证超时限制,可能被慢速连接耗尽资源。属于两害相权取其轻。

还有个思路是限制访问来源。用防火墙或者 TCP Wrapper 只允许可信 IP 连 22 端口。这不能根治漏洞,但能大幅缩小攻击面。很多公司的运维团队就是这么干的——先加规则,再排期升级。

一些个人观察

这个漏洞让我想起 2018 年的 CVE-2018-15473,也是 OpenSSH 的用户枚举问题。每次 OpenSSH 出漏洞,运维群里都是一片"又来了"的哀嚎。但说实话,OpenSSH 的代码质量在开源项目里算高的,只是它太关键了,任何小问题都会被放大。

另外,这次漏洞的发现过程值得关注。Qualys 团队用了大约两周时间做定向 fuzzing,才找到这个竞态条件。他们没靠什么高级 AI 工具,就是老老实实读代码、写测试用例、反复跑。这说明在安全研究领域,耐心和细致仍然比花哨的工具更重要。

最后提醒一句:别只盯着 OpenSSH。这次漏洞的根源是信号处理中的异步安全问题,类似模式在其他网络服务里也可能存在。如果你负责基础设施安全,值得花时间审计一下自己系统里所有处理信号的代码路径。