十年没人报这个洞,可能只是没人往密码框里粘东西

导语:一段 14 秒的终端录屏,300 个 A,root shell。视频在网上传开,401 个赞、52 次转发,评论区吵成一锅粥。可最让人后背发凉的不是这洞怎么进,而是它躺了十年,愣是没人报过。


CVE-2026-123158 复现演示

14 秒,逐帧拆开

视频来自 X 上 @0x0SojalSec 的帖子,我抽帧数了一遍:

第一帧,ssh root@alpine-cloud,密码敲 wrong,回一句 Permission denied, please try again.。正常人的正常失败。

第二帧,密码框里塞进一长串 A,刷过八行,屏幕回一句 Welcome to Alpine!,提示符变成 alpine-cloud:~#。第三帧,id,uid=0(root)。

第一次尝试:普通口令被拒
300 个 A 铺满屏幕,换来一个 root 提示符
id 一敲,uid=0

截图来源:X @0x0SojalSec 演示视频

顺手做了一件没人做的事:把视频里的 A 一个一个数出来。终端宽 47 列,第一行扣掉 root@alpine-cloud's password: 这 30 个字符,剩 17 个 A;接着 6 行整行 47 个;最后一行 1 个。17 + 47×6 + 1 = 300 个 A,不是评论区念叨的 257。

257 是下限——musl 的 sha512crypt 超过 256 字节直接失败,往上到 1024 都有效。而发现者 Özgün Kültekin 主页 sshhole.com 的在线演示,按钮就叫「300 × A」,这视频八成就是拿那个 demo 录的。

十年,它一直躺在那儿

这洞的技术细节不复杂,但存在时间长得很离谱。它长得也不像漏洞:Unix 用 表示「此账号无密码」是老约定,musl 2012 年把 crypt() 的失败返回值改成 ,OpenSSH 2016 年又让「无哈希账号也借盐算一遍」——三个团队、三个时间点,谁都不知道另外两家的写法,像三块石头垒成了洞。

更吓人的是它不需要任何异常操作:crypt() 在口令超长时不报错,返回单个字符 ;sshd 拿它和 /etc/shadow 里的 做字符串比较,相等,放行。没有内存越界,没有暴力破解,就是一次普通登录。

那为什么十年没人报?发现者在复盘里写过一句话,比 CVE 解释更狠:

也许有人发现过。也许有人把错误的东西粘进了密码提示框——半条 Slack 消息,或者一整串 SSH 私钥——然后它就放他进去了。你从来没往密码框里粘错过东西吗?

密码框不回显,没有长度上限提示,粘错了和粘对了在屏幕上长得一模一样。一个管理员手滑把半条命令粘进密码提示符,系统就把他放进去了。他多半以为键盘有毛病,不知自己刚拿到 root。

于是「十年零报告」可能不是「十年没人遇到」,而是十年里没人把「粘错了」和「被入侵」联系起来。测试也抓不到:OpenSSH 在 OpenBSD 和 glibc 上测,musl 这边不测 sshd;大多数发行版走 PAM,PAM 对 * 账号压根不调 crypt。257 这个长度在日志里几乎不出现——没人会统计一个失败的口令有多长。

评论区最热的三个说法,全错

「这不就是经典的缓冲区溢出,撑爆了长度检查」——不是。整条链路上没有任何内存越界、没有越界写、没有内存破坏,全是字符串比较。

「这就是后门,去查查当初是谁提交的」——也不是。后门得有人故意留,这里是石头自己垒成的。

「AI 挖出来的,功劳不能算研究者的」——这条最接近事实,但方向反了。OpenSSH 自己在 10.6 发布说明里写得很清楚:最近收到的大量安全报告,很多来自 AI 模型或 AI 辅助;已看到多个「AI 工具发现的 bug 随后被另一位研究者独立复现」的案例,因此决定更频繁地发版。

研究者本人也不含糊:「哦等等我刚才说『我』?抱歉,我有一大群 agent swarm。」17600 次畸形登录是对着六种编译组合扔的。人没被取代,但探测半径变了。

别照抄视频:你的 Alpine 上大概率不是这个画面

视频里直接 ssh root@alpine-cloud 就进去了。但 Alpine 官方公告写得很清楚:root 从 3.16 前后起在基础镜像里就是 root:*,而 OpenSSH 默认的 PermitRootLogin prohibit-password 把 root 的密码登录挡在门外——只有显式设了 PermitRootLogin yes 才能直接登。那台 alpine-cloud 是研究者的实验机,配置被他动过,照着视频在生产 Alpine 上敲一遍,连密码提示符都看不到。

真实世界里最容易被打的,恰恰是不用改任何配置的那种:Alpine 官方云镜像(AWS/Azure 的 tiny-cloud,3.18.11 到 3.24.3)里那个 alpine 用户,密码位是 *,还带免密 doas。进去是 alpine,出手就是 root。

四个前提条件要同时成立:musl 系统、不走 PAM、PasswordAuthentication yes(默认值)、机器上同时有一个 * 账号和一个 $5$/$6$ 哈希账号。最后一条最反直觉——一个带正常密码的账号就能让所有没密码的账号沦陷,它只提供一把盐。

时间线,和今天该干什么

  • 10 月 30 日:OpenSSH 修 pick_salt(),这洞就在那段代码下面四行
  • 11 月 3 日前后:研究者找到它
  • 11 月 5 日:OpenSSH 10.6p2 发布,Alpine 同步发包
  • 11 月 6 日:视频传开

现在要做的:

apk upgrade openssh
rc-service sshd restart     # 升级不会自动重启 sshd,漏了这步等于没修

来不及打补丁,PasswordAuthentication no 能立刻止血。改完先确认密钥登录还能用,别把会话断手里。

顺手查一遍有没有被登过:

grep "Accepted password" /var/log/messages
grep '^alpine:' /etc/shadow

shadow 里密码位是 *,日志里却有它的密码登录成功记录,那就该查了。

收尾

CVE-2026-123158,CVSS 8.1,OpenSSH 10.6p2 修了,暂没没有野外利用报告。但别当成安全保证:这洞不需要爆破、不需要撞库、一次连接直接进门,而 Alpine 是容器和云镜像的顶流底座。

更要紧的是那十年留下的账还没算清——那些粘错过东西的人可能还坐在工位上当管理员,不知自己那次「手抖」是什么。

所以该补的不只是下一个补丁,还有这条日志规则:*当密码位为 的账号出现 Accepted password 记录时,按入侵告警处理,别当配置错误。** 教训不在洞,在没人看的那行日志。


资料来源

  • X 平台 @0x0SojalSec 演示视频(2026-11-06)
  • sshhole.com:发现者 Özgün Kültekin 的技术复盘
  • OpenSSH 10.6p2 官方发布说明与安全公告
  • Alpine Linux 官方安全公告(2026-11-05)

版权声明:本文由华盟网原创发布,保留所有权利。漏洞利用仅用于授权测试与防御研究。

© 版权声明
THE END
喜欢就支持一下吧
点赞9 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容