SSH 的 256 字节漏洞:musl 上的 OpenSSH 十年空门
来源:sshhole.com — 2026-11-05
📋 概述
作者把一条 2016 年就存在于 musl 的边界条件翻了出来:在 Alpine、OpenWrt、Buildroot 以及大量 Docker 基础镜像里,密码字段是 * 的账号(root、只允许密钥登录的部署用户、LDAP 用户)本来永不可能用密码登录,实际却会接受任何长度超过 256 字节的密码。链条不长:2012 年 musl 为了不让程序在 crypt() 返回 NULL 时崩溃,改成失败时返回单个星号;二十天后又因为 sha512crypt 越算越慢,把输入截断到 256 字节。于是「超长密码被截断 → 比对前的哈希变成星号 → 与存储的星号相等」这条路径就成立了。文章按年份把 1980 年的 /etc/passwd、1997 年 crypt() 的 NULL 约定、2012 年的两次提交、2019 年的补丁逐段串起来,是一次完整的软件考古。
🔑 核心要点
密码字段为 * 的账号应当永不可登录,但在 musl 上超长密码会被截断后比对一个星号。
2012 年 musl 为规避 crypt() 返回 NULL 导致程序崩溃,改成失败时返回单个字符,选中的正是星号。
二十天后另一次提交为防 sha512crypt 被超长输入拖慢,把输入长度硬截断在 256 字节。
影响面覆盖 Alpine、OpenWrt、Buildroot、Yocto 与常见容器基础镜像,以及 3.16 之后默认 root:* 的镜像。
💡 金句
accounts that should never take a password at all (root, your key-only deploy user, ldap users, the default user on alpine's aws and azure images) take any password longer than 256 characters.
👍 0
❤️ 点赞
👎 0
沉底
← 返回 Hacker News 首页