想象一下这个魔幻的场景:
你走到一台 Linux 服务器前,打开 SSH 客户端,在密码提示符下,你闭上眼睛脸滚键盘,随便敲了 300 个乱码字符,然后按下回车……
结果,门开了,你不仅登进去了,还顺理成章地拿到了 Root 权限。
这不是好莱坞黑客电影里的桥段,而是最近真实爆发的一个极其离谱的安全漏洞。安全研究员 Ozgun Kultekin 发现了一个被称为 “sshole” 的组合漏洞,它让数百万台运行 Alpine Linux、OpenWRT 等系统的服务器和容器,瞬间变成了“公共厕所”。

今天,咱们就来扒一扒这个“敲键盘就能提权”的奇葩漏洞,看看 OpenSSH 和 musl 是怎么联手搞出这场乌龙,以及开发者们又是如何互相甩锅的。

1. 案发现场:一个“星号”引发的血案
要理解这个漏洞有多离谱,得先看看 Linux 是怎么处理“禁用密码登录”的。
在 Linux 的 /etc/shadow 文件里,如果你想让一个账户绝对不能通过密码登录,通常会把它的密码哈希字段设置成一个星号 *。因为 * 不是合法的哈希值,所以无论你输入什么密码,系统比对时都会失败,从而拒绝访问。
但这一次,OpenSSH 和 musl C 库打出了一个极其致命的“配合”:
- OpenSSH 的“好心办坏事”:2016 年,为了防止黑客通过“响应时间差”来枚举系统里有哪些用户名(CVE-2016-6210),OpenSSH 打了个补丁:即使账户没有密码哈希(比如字段是
*),它也会假模假样地去执行一次密码哈希计算,以此来拖延时间。 - musl 的“不按套路出牌”:musl 是一个轻量级的 C 标准库(Alpine Linux 的底层基石)。它的
crypt()函数有一个 256 字节的输入限制。当输入的密码超过 256 个字符时,musl 会直接报错,并返回一个星号*。
高潮来了:
当黑客输入 300 个字符的密码时,musl 返回了 *。而 OpenSSH 拿着这个 *,去和 /etc/shadow 里存储的 * 进行比对。
* == *,比对成功!大门敞开!
(注:如果你用的是 Ubuntu/Debian 等基于 glibc 的系统,glibc 在遇到超长密码时会返回 NULL,所以这个漏洞对它们无效。)
2. 为什么 Alpine Linux 是“重灾区”?
这个漏洞主要影响使用 musl 库的发行版,包括 Alpine Linux、OpenWrt、Buildroot、Yocto 和 Void Linux。其中,Alpine Linux 受伤最深。
为什么?因为 Alpine 凭借极小的体积,几乎成了 Docker、Kubernetes、Proxmox 容器以及各类云 VM 的默认操作系统。
更致命的是,Alpine 的官方 AWS 和 Azure 云镜像中,默认存在一个名为 alpine 的账户。这个账户的密码字段正是 *(禁用密码),但它却默认配置了无密码的 doas(类似于 sudo)权限。
这意味着,攻击者只要通过“脸滚键盘”登录了 alpine 账户,只需敲一句 doas su,就能瞬间提权到 Root,彻底接管你的容器或云服务器。
3. 甩锅大戏:到底是谁的错?
漏洞曝光后,OpenSSH 和 musl 的维护者立刻开启了一场“烫手山芋”般的甩锅大战:
- OpenSSH 委屈地说:“按照 UNIX 的惯例,
crypt()函数出错时应该返回 NULL(空值)。musl 你凭什么返回个*出来?你这不是坑人吗!” - musl 作者 Rich Felker 反击:“我的函数在遇到非法输入时返回
*是有历史原因的。你 OpenSSH 作为一个安全软件,为什么要拿一个报错的返回值去和真实的密码哈希做比对? 你的逻辑本身就有问题!”
从旁观者的角度看,这其实是一个典型的“防御性编程不足”导致的组合漏洞。双方都在特定的边界条件下做出了假设,而当这两个假设碰撞在一起时,灾难就发生了。
4. AI 立大功:1.7 万次测试揪出 8 年老 Bug
值得一提的是,这个潜伏了 8 年(自 2016 年 OpenSSH 打补丁起)的漏洞,是被 AI 智能体 揪出来的。
研究员 Kultekin 并没有靠人肉去翻代码,而是让 AI 智能体自动生成了各种畸形的密码哈希、超长密码和不同的 OpenSSH 配置,疯狂跑了约 17,600 次身份验证测试,最终敏锐地捕捉到了这个“超长密码导致认证通过”的异常行为。
不得不说,在模糊测试(Fuzzing)和边界条件挖掘上,AI 确实已经成了安全研究员的“最强外脑”。
5. 如何修复与自查?
如果你正在使用 Alpine Linux 或其他基于 musl 的系统,请立刻放下手中的奶茶,开始排查!
🛡️ 终极修复方案:
立刻更新 OpenSSH 到 10.6p2 或更高版本。
在 Alpine 中执行:apk upgrade openssh
🩹 临时缓解方案(如果无法立刻更新):
修改 SSH 配置文件(通常是 /etc/ssh/sshd_config),明确关闭密码认证,强制使用密钥登录:
PasswordAuthentication no
然后重启 SSH 服务:rc-service sshd restart
🔍 如何自查是否已经被黑?
攻击者利用此漏洞时,会在日志中留下“密码登录成功”的痕迹。在 Alpine 中执行以下命令:
grep "Accepted password" /var/log/messages
如果你看到某个本该禁用密码登录的账户(比如 alpine 或 root)居然有“Accepted password”的记录,别犹豫,你的服务器大概率已经被入侵了,请立刻断网、备份数据并重装系统。
在这个万物皆容器、万物皆云原生的时代,底层基础镜像的一个微小瑕疵,都可能引发百万级的海啸。赶紧去查查你的 Docker 镜像和云服务器吧,别让黑客用 256 个字符,把你的服务器变成了他的“肉鸡”。

