Alpine Linux OpenSSH漏洞:攻击者可绕过密码认证

Alpine Linux曝OpenSSH严重漏洞,攻击者可绕过密码认证。该缺陷影响3.16至Edge版本,需满足特定账户哈希条件。用户应立即更新软件包并重启SSH服务以消除风险。

Alpine Linux 曝 OpenSSH 严重漏洞:攻击者可绕过密码认证

近期,安全研究人员披露了影响 Alpine Linux 系统中 OpenSSH 服务器的严重安全漏洞。该漏洞允许攻击者在无需知晓任何密码的情况下直接登录系统。受影响的用户应立即执行软件包更新并重启 SSH 服务,仅升级软件包而不重启守护进程无法消除风险。

升级后必须重启sshd进程

作为临时缓解措施,管理员可在 sshd 配置中将 PasswordAuthentication 设置为 no 并重启服务,此举可立即封堵该漏洞。

漏洞原理与利用条件

该漏洞具有极高的利用效率,攻击者只需发起一次连接即可成功入侵,无需尝试多次或依赖暴力破解。

触发该漏洞需满足以下特定环境条件:

  • 账户状态:目标机器上存在一个密码字段为 * 的账户(即未设置密码、仅通过密钥登录的账户)。
  • 哈希类型:同一机器上至少存在另一个使用 $5$ 或 $6$ 格式密码哈希的本地账户。
  • 攻击载荷:攻击者发送长度在 257 到 1024 字节之间的超长密码字符串。

值得注意的是,只要有一个拥有密码哈希的用户存在,所有无密码账户都将变得可访问。相关技术细节已记录在 OpenSSH 10.6p2 版本的发布说明中,截至目前尚未分配通用的 CVE 编号。

受影响范围分析

若同时满足以下条件,系统将处于受威胁状态:

  • 运行不使用 PAM 模块的 openssh-server 包。(注:使用 PAM 的 openssh-server-pam 版本不受此漏洞影响。)
  • SSH 配置中启用了密码验证(PasswordAuthentication yes),这是 OpenSSH 的默认行为。
  • 系统中存在密码字段为 * 的账户。这包括:
    • 自 Alpine 3.16 起,基础镜像中的 root 账户默认标记为 root:*。虽然默认的 PermitRootLogin 禁止密码登录 root,但若配置了 PermitRootLogin yes,或通过 doas 等工具提权,则可能暴露风险。
    • 通过 adduser 创建时无密码,或使用 usermod -p '*' 修改过的仅密钥用户。
    • 通过目录服务(如 musl-nscd, nslcd, winbind, sssd)管理的用户,因其通常没有影子文件条目。
    • 官方微型云镜像中的 alpine 用户。
  • 至少有一个本地账户使用 $5$ 或 $6$ 格式的密码哈希。

受影响版本:经核查,从 Alpine 3.21 到 3.24 以及 Edge 分支均受影响。此外,不再定期更新的旧版本(3.16 至 3.20)同样存在此缺陷。

不受影响的场景

  • 未在容器内运行 sshd 的 Docker 及其他容器化部署。
  • 完全禁用密码认证的服务器。
  • 使用 openssh-server-pam 且启用 UsePAM 的系统。
  • 锁定账户:/etc/shadow 中密码字段以 ! 开头的用户(此类用户无法通过密码或密钥登录)。
  • 系统中不存在任何使用 $- 风格密码哈希账户的环境。
  • 通过 cloud-init 配置并显式写入 PasswordAuthentication no 的云镜像。

修复方案

方案一:升级软件包并重启服务

执行以下命令进行全量升级:

apk upgrade -U -a

Alpine 3.21.10、3.22.8、3.23.8 和 3.24.4 版本已包含修复后的软件包。各分支对应的修复版 OpenSSH 版本如下表所示:

分支 (Branch) 修复后的 OpenSSH 版本
edge 10.6_p2-r0
3.24 10.3_p1-r2
3.23 10.2_p1-r1
3.22 10.0_p1-r11
3.21 9.9_p2-r1
3.20 9.7_p1-r6
3.19 9.6_p1-r3
3.18 9.3_p2-r4
3.17 9.1_p1-r7
3.16 9.0_p1-r6

重要提示:升级软件包不会自动重启正在运行的 sshd 进程。必须在升级后手动执行 rc-service sshd restart 以确保补丁生效。

方案二:禁用密码身份验证(若无法立即更新)

在执行操作前,请确保 SSH 密钥登录功能正常,并保持当前会话开启直至新配置测试通过。

以 root 权限执行以下命令。这些命令将创建一个 drop-in 配置文件,修改主配置文件中的密码验证设置,并备份原始文件。从 Alpine 3.19 开始,默认配置会读取 drop-in 目录;对于更早版本,脚本会直接修改主配置文件。

mkdir -p /etc/ssh/sshd_config.d
echo 'PasswordAuthentication no' > /etc/ssh/sshd_config.d/00-no-passwords.conf
sed -i.bak -e '1i PasswordAuthentication no' \
  -e 's/^\(\s*PasswordAuthentication[^y#]*\)yes/\1no/i' \
  /etc/ssh/sshd_config
sshd -t && rc-service sshd restart
sshd -T | grep -i passwordauthentication

最后一条命令应输出 passwordauthentication no。如需撤销更改,删除 /etc/ssh/sshd_config.d/00-no-passwords.conf 并将 /etc/ssh/sshd_config.bak 恢复为 /etc/ssh/sshd_config。

关于云镜像(Micro Cloud)

从 3.18.11 到 3.24.3 构建的官方微型云镜像(包括 qcow2、VHD 和 AMI 工件)默认包含一个密码字段为 * 且无密码的 alpine 用户。初始状态下这些镜像是安全的,但一旦管理员设置了控制台密码,或通过用户数据添加了使用 hashed_passwd 的用户,导致系统中出现 $6$ 哈希,漏洞即刻变得可利用。攻击者可借此登录并通过 doas 获取 root 权限。

由 3.21.10、3.22.8、3.23.8、3.24.4 及后续版本构建的镜像已包含修复包。对于现有实例,仍需更新 openssh 或禁用密码认证。

支持周期说明

尽管 Alpine 3.21 及以上版本存在此错误,但官方已在每个版本分支(包括 3.16 之前)发布了修复包。需要注意的是,3.21 版本将于 2026-11-01 终止支持。

入侵检测建议

管理员应检查 /var/log/messages 日志,查找来自无密码账户(如 alpine、root 或仅密钥用户)的 sshd 登录记录。同时审查被暴露机器的资源使用情况、最近创建的用户、文件变动及授权密钥列表。若无法排除非法登录的可能性,应将机器视为已受损并进行隔离处理。

技术成因解析

当 sshd 编译时未链接 PAM 库,它通过调用 C 标准库函数 crypt() 将输入密码转换为哈希值,并与存储的密码字段进行比较。

对于存储字段过短而无法包含盐值(salt,哈希随机前缀)的账户,sshd 会借用另一个账户的盐值进行计算。当输入的密钥长度超过 256 字节时,crypt() 函数返回字符串 * 作为错误指标。由于 * 正是无密码账户在存储字段中的内容,导致哈希匹配成功,从而允许登录。

OpenSSH 10.6p2 版本已从代码层面避免了此问题,上述稳定分支中的软件包也包含了针对同一问题的补丁。

致谢

漏洞报告由维克菲尔德的奥斯根·库尔特金(Osman Kurtkin)提交。感谢 OpenSSH 项目的 Damien Miller 和 Darren Tucker 提供修复并发布 10.6p2 版本,感谢 Timo Teräs 协助分析问题,以及 Natanael Copa 负责构建并上传更新后的软件包。

评论 0

0/500

评论需审核后展示,请文明发言

💬
还没有评论,来说两句

相关阅读