OpenSSH项目11月5日紧急发布10.6p2版本,修复一个被评为严重的认证绕过漏洞。攻击者只需使用257至1024字节的长密码,就能在Alpine Linux服务器上登录没有设置密码的账户,包括只用密钥登录的账户。
攻击需要三个条件:能访问服务器网络、知道目标账户名,以及服务器上至少有一个账户设置了密码。Alpine的openssh-server软件包默认不启用PAM、且默认允许密码登录,恰好满足了漏洞触发的全部条件。默认配置恰好集齐了所有触发条件,让大量Alpine服务器在不知不觉中处于暴露状态。
漏洞的根源藏在Alpine使用的musl C库里。无密码账户的密码字段只有一个星号,太短而无法存放盐值,sshd于是借用另一个有密码账户的盐值来比对;而musl的crypt函数在密码超过256字节时会返回星号表示出错,这个星号恰好与无密码账户的字段完全匹配,登录就此放行。
受影响的账户并不少见。用adduser创建且未设密码的密钥账户、以星号标记的root账户,以及官方云镜像中的alpine用户都在其中。root默认受禁止密码登录的设置保护,但如果某个可登录账户能通过doas提权,防护就会失效。
十年旧患,一夜修复
这个问题其实从2016年就已存在,当时OpenSSH为修复用户名枚举漏洞而引入的盐值借用逻辑,埋下了今天的隐患。musl方面2012年为防止拒绝服务攻击而设置的256字节上限,则是另一块拼图。两个看似合理的设计叠加在一起,才造就了这次绕过。
OpenSSH团队本周早些时候得知漏洞后迅速发布了修复。项目负责人表示,团队现在认为漫长的保密期对攻击者更有利,因为AI工具已经能在数小时内重新发现同样的缺陷,快速公开修复才是更安全的做法。快速修复的代价是留给管理员的验证时间更短,但比起被动挨打,主动更新仍是更优的选择。
立即检查并更新
Alpine已为从3.16起的所有版本发布修复包,修复方法是升级软件包并重启sshd,因为单纯升级不会重启正在运行的服务。无法立即更新的用户,可以先把密码登录关掉,再确认密钥登录正常。
目前尚未报告有利用该漏洞的实际攻击。但安全团队建议管理员检查日志中针对无密码账户的成功登录记录,如果无法排除已被登录的可能,就应当把机器当作已被入侵来处理。
这次事件也提醒人们,基础组件的微小行为差异可能酿成严重后果。一个C库函数在出错时返回星号而不是空值,最终演变成可绕过认证的漏洞,供应链安全的考验无处不在。这也是开源基础设施的常态:一个看似无关紧要的底层改动,可能在十年后以漏洞的形式回到所有人面前。