一个星号就能进门:musl 版 sshd 的密码校验旁路
来源:sshhole.com — 2026-11
📋 概述
研究者用约 1.76 万次构造登录,把 OpenSSH 在各种 libc、PAM、shadow 组合下跑了一遍,只有「musl 且无 PAM」这一组放了不该放的人进门。根因是两条相隔二十天的老提交:musl 为了让 crypt() 不再返回 NULL,把失败结果改成单个星号;接着又给 sha512crypt 加了 256 字节上限,超长口令于是「失败并返回星号」,恰好等于 shadow 里表示账号被锁定的那个字段。结果是一个星号账号会接受 257 到 1024 字符之间的任意密码,而 Alpine 官方云镜像里的默认用户正是这种状态,并且可以免密 doas 到 root。
🔑 核心要点
- musl 在 2012 年把 crypt() 的失败返回值从 NULL 改成单个星号,理由是不让程序崩在空指针上。
- 二十天后 musl 给 sha512crypt 加了 256 字节上限,超长口令于是失败,于是返回那个星号。
- shadow 里的星号表示「这个账号不许登录」,两者一撞,锁死的账号反而认了任意长密码。
- 开源世界三次擦肩:2013 年 Debian 请求照抄,libxcrypt 后来选了星号加 0,2024 年 busybox 线索只差一个词。
- 默认中招面是 Alpine 官方云镜像里的默认用户,密码免问就能 doas 到 root。
- 修复在 OpenSSH 10.6p2;升不动就关掉密码登录。
💡 金句
于是那个星号账号会接受 257 到 1024 个字符之间的任意密码。
👍 0
👎 0
← 返回 Lobsters 首页