最近的一项安全发现,在 sshhole.com 网站上得到了强调,指出了一个源于 musl C 库变更的漏洞。作为 Alpine Linux 默认的 C 库,musl 库修改了 `crypt()` 函数的行为。此前,如果该函数遇到错误,它将返回 NULL。然而,在更新后的实现中,该函数在失败时现在返回单个字符而非 NULL。据报道,这一更改是为了兼容那些未能正确检查 NULL 返回值的程序,但在特定配置下,它引入了安全风险。

这种行为专门影响不使用可插拔认证模块 (PAM) 的系统。在这些环境中,系统可能会通过将 `crypt()` 函数的输出与存储的密码哈希进行比较来尝试验证用户身份。如果攻击者提供一个导致 `crypt()` 函数失败的密码,该函数现在将返回单个字符。如果该字符恰好与存储哈希的第一个字符匹配,身份验证检查就可能成功。这对于使用长密码的系统尤为相关,因为哈希的第一个字符是一个可预测的目标。Hacker News 上的评论者指出,虽然许多系统使用 PAM 来处理身份验证,但某些配置——特别是 Docker 容器中的配置——可能仍然存在漏洞。

这一发现的实际影响对构建在 Alpine Linux 之上的庞大 Docker 容器生态系统最为显著。虽然只有极少数的此类容器可能会在没有 PAM 的情况下启用密码认证的 OpenSSH,但由于基于 Alpine 的镜像数量庞大,即使是极小的百分比也可能代表大量的易受攻击目标。为了修复此问题,建议用户在 SSH 配置中设置 `PasswordAuthentication=no` 以禁用密码认证,或者将系统更新到已修复的版本。这一发现还引发了一场关于 musl 开发人员在核心加密函数中优先考虑“便利性”而非严格遵守 POSIX 标准的决策的辩论。