脸
DISCOVER SOMETHING GOOD

脸滚键盘就能拿 Root?Alpine Linux 爆离奇“免密”漏洞,Docker/K8s 玩家速查!

想象一下这个魔幻的场景:

你走到一台 Linux 服务器前,打开 SSH 客户端,在密码提示符下,你闭上眼睛脸滚键盘,随便敲了 300 个乱码字符,然后按下回车……

结果,门开了,你不仅登进去了,还顺理成章地拿到了 Root 权限。

这不是好莱坞黑客电影里的桥段,而是最近真实爆发的一个极其离谱的安全漏洞。安全研究员 Ozgun Kultekin 发现了一个被称为 “sshole” 的组合漏洞,它让数百万台运行 Alpine Linux、OpenWRT 等系统的服务器和容器,瞬间变成了“公共厕所”。

脸滚键盘就能拿 Root?Alpine Linux 爆离奇“免密”漏洞,Docker/K8s 玩家速查!插图

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

脸滚键盘就能拿 Root?Alpine Linux 爆离奇“免密”漏洞,Docker/K8s 玩家速查!插图1

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 个字符,把你的服务器变成了他的“肉鸡”。

GOOD TOOLS ARE BETTER TOGETHER

分享到社交平台

微微博QQQ 好友☆QQ 空间XX↗Telegram

复制链接后,也可以粘贴到微信或其他社交平台。