OpenSSH 刚刚发布版本 10.6p2,修复了一个愚蠢的漏洞。发现者把这个漏洞命名为 SSHole。漏洞影响使用 musl libc 且未启用 PAM 的 OpenSSH 服务。已知 Alpine Linux 和 OpenWrt 等都受影响。
Linux 使用 /etc/shadow 保存密码哈希。当密码字段为 “*” 时,表示禁止该账户使用密码登录。默认情况下,为了安全,root 用户是不允许用密码登录的。
musl libc 的 crypt() 在某些密码计算失败的情况下会返回字符串 “*”。比如,当使用 SHA-512 计算密码哈希时,如果输入长度大于 256(且小于 1024),就会导致返回 “*”。
所以,对于本来不允许用密码登录的 root 账号,如果输入长度大于 256 的任意字符串,就会导致 crypt() 返回 “*”,然后 OpenSSH 用这个 “*” 去和 /etc/shadow 里那个原本用来表示不允许密码登录的 “*” 对比,发现完全相同,就认为用户输入了正确的密码,于是让用户成功登录。
这个漏洞已经存在了 10 年。