Officer's Notes|2026年11月08日 03:24
一个酝酿了 46 年的 OpenSSH 漏洞!
1980 年
UNIX 在系统账户的密码字段中放入了星号 (*)。其思路很简单:它不是真正的哈希值,因此无法被暴力破解,用户也无法使用密码登录。
2012 年
musl libc 的开发者认为,crypt() 函数在失败时返回 NULL 值很危险——程序经常忘记检查 NULL 值,导致程序崩溃并出现段错误。因此,他们改为返回一个错误字符串。
猜猜是哪个?
还是那个星号:*。
三周后,他们添加了长度限制:超过 256 字节的密码会占用大量 CPU 资源。任何更长的密码都会被拒绝。由于这是一个错误,crypt() 函数会返回 *。
2016 年
OpenSSH 修复了一个时序攻击漏洞 (CVE-2016-6210)。如果用户不存在,服务器仍然会使用伪造/借用的盐值对密码进行哈希处理,这样攻击者就无法通过响应时间来判断有效的用户名。
2022 年
Alpine Linux 将 /etc/shadow 文件中的 root 用户密码从 ! 改为 *,以确保 SSH 密钥在云镜像上正常工作。
……然后循环就完成了!
你以 root 用户身份(其 shadow 条目为 *)通过 SSH 连接。
你输入了长度超过 256 个字符的密码(例如,300 个 A)。
crypt() 函数达到长度限制 → 返回 * → OpenSSH 将其与数据库中的值进行比较 → 数据库中的值也是 * → 你以 root 用户身份登录。
这条攻击链耗时 46 年(!!!)才完成。
每一次单独的更改都看似合理。但它们共同构成了一个完美的 * == * 身份验证绕过漏洞(CVE-2026-123158,绰号 *sshole)。 OpenSSH 10.6p2 和 Alpine 软件包中已修复。
分享至:
脉络
热门快讯
APP下载
X
Telegram
复制链接