OpenSSH 紧急修复关键漏洞,请禁用 SSH,切勿继续阅读
SSH,出了个漏洞。
不需要知道密码,只要对一个 “没设密码”的账户 ,塞过去一段 257 到 1024 字节的长密码,它就直接放你进去了。

漏洞编号 CVE-2026-123158 ,CVSS 评分 8.1 ,高危。

所以先别看了,先关了再来。

那么事情是这样的,11 月 5 号,OpenSSH 项目紧急发了 10.6p2 ,就为了补这个洞。OpenSSH 的核心开发者直接喊话,没升级的机器,立刻把 PasswordAuthentication 设成 no,或者直接关掉 SSH。
漏洞原理
SSH 校验密码,是把用户输的密码,用 crypt() 函数算一遍哈希,再拿去跟 /etc/shadow 里存的哈希比对。
问题出在 两层东西的配合 上。
第一层:sshd 的“借盐”行为
有些账户没设密码,它的存储字段里就一个星号 * ,意思是“这账户压根没密码,别想用密码登录”。
这种字段太短,连“盐”(哈希前面那串随机前缀)都没有。
于是 sshd 会去 借别的账户的盐 来算,好让“密码错误”的耗时看起来像那么回事,防止别人靠响应速度猜到账户存不存在。
这个“借盐”,是 2016 年修另一个漏洞时留下的。
第二层:musl 这个 C 库的脾气
musl 是 Alpine Linux 用的那个轻量 C 库,跟 Ubuntu、Debian 用的 glibc 不一样。
musl 的 crypt() 函数有个毛病:你给它一个 超过 256 字节的密码 ,它不给你算,直接返回一个星号 * ,意思是“出错了”。
「把这两层一叠,好戏来了」
攻击者对那个没密码的账户,输一段 300 字节的长密码。
sshd 借了别的账户的盐,拿去让 musl 算。
musl 一看密码太长,返回 * 。
这个 * ,恰好跟账户里存的那个 * ,一模一样。
等于说, * 等于 * ,比对通过,登录放行。
一个本来 “绝不能用密码登录” 的账户,被一段乱填的长密码,硬生生捅开了。
而且这攻击 一次连接就成 ,不用重试,不需要任何攻击代码。
你想想这画面,别人连个正经漏洞利用工具都不用写,就粘贴一长串 A 进去,门开了。

中招条件
也不是谁都中招,要中招得 满足好几个条件 。
系统用的是 musl 库,典型就是 Alpine Linux。
sshd 没开 PAM 认证。
开着密码登录。
系统里有一个“没设密码”的账户(字段是 *)。
系统里还得有至少一个“正常设了密码”的账户(用 $5$ 或 $6$ 那种哈希)。
值得注意的是Alpine Linux 的默认 openssh-server,必中前两个。
💡 而且 Alpine 那套官方云镜像,从 3.18.11 到 3.24.3,自带的 alpine 账户字段就是 * ,还配了免密 doas。
什么意思,就是攻击者绕过密码进了 alpine 这个低权限账户,再顺手 doas 一下,直接变 root 。
低权限的登录绕过,在暴露的机器上,能变成 整台机器的沦陷 。
最绝的是,这洞从 2016 年就埋在那了 。
整整十年,没人发现,或者说,没人往那个方向去捅。
ai立大功
安全研究员靠AI 助手,跑了大概 1.76 万次 认证测试,把不同的 OpenSSH 配置、各种畸形的密码哈希、超长密码,全试了一遍。
最后试出来这条缝。
受影响的不止 Alpine,OpenWrt、Buildroot、Yocto 这些用 musl 的嵌入式系统,都得排查。
不过 OpenWrt 默认用的是 Dropbear,不是 OpenSSH,所以默认没事,只有你自己另装了 OpenSSH 才中招。
glibc 那帮主流发行版,Ubuntu、Debian、红帽这些, 不受影响 。
怎么办
赶紧升级 ,OpenSSH 升到 10.6p2 ,或者 Alpine 直接 apk upgrade -U -a ,然后重启 sshd。
注意,光升级包没用,sshd 这进程得重启,补丁才生效。
升不了的话,就把 PasswordAuthentication 设成 no,改密钥登录,先堵上。
去查日志,找那种 “没密码的账户居然 Accepted password 登录成功” 的记录,比如 alpine、root 这种账户,明明不该有密码登录,结果日志里出现了。
有,就得按 “已经被入侵” 来对待,查 doas 记录、查有没有新用户、查文件改动、查授权密钥。
💡 目前还没有人真的拿这个洞搞事的报告,但公开的复现环境已经有了,等于说,攻击代码是现成的。
启示
说白了,就一句:越是“轻量、极简、没人盯着”的东西,越可能藏着没人看见的洞。
Alpine 号称全世界最流行的容器基础镜像,天天有海量的人在用它跑服务,可它底下的那点事, 十年没人翻 。
极简,意味着好用,也意味着盯着它的眼睛少。
