CVE-2025-25298CVE-2025-25298是Strapi开源无头内容管理系统(Headless CMS)中的一个中危安全漏洞。该漏洞存在于@strapi/core包的密码哈希处理逻辑中,影响5.10.3之前的所有版本。当用户使用bcryptjs进行密码哈希时,系统未强制设置密码的最大长度限制。由于bcryptjs算法本身会忽略超过72字节的输入数据,导致超过72字节的密码在哈希过程中被静默截断。这意味着用户可以创建一个密码超过72字节的账户,但在后续认证时,仅需使用前72字节即可成功登录。此漏洞会降低超长密码的有效熵值,可能误导用户认为超过72字节的字符部分是必需的,从而在实际安全效果上产生偏差。此外,过长的输入还会对服务器造成不必要的处理开销。该漏洞的CVSS 3.1评分为5.3分,攻击向量为网络(AV:N),无需认证(PR:N),无需用户交互(UI:N),对机密性产生低影响(C:L),完整性和可用性不受影响。该问题已在Strapi 5.10.3版本中修复,目前尚无已知的临时缓解方案。Strapi作为广泛使用的开源CMS平台,此漏洞可能影响大量依赖其进行内容管理的Web应用程序。建议所有使用受影响版本的用户尽快升级到修复版本以确保系统安全。
该漏洞的核心技术原理在于bcryptjs算法的固有特性和Strapi缺乏输入验证的组合。bcryptjs是基于bcrypt算法的JavaScript实现,其设计初衷是将密码哈希限制在72字节以内。当输入密码超过72字节时,bcryptjs会静默地丢弃超出部分,仅对前72字节进行哈希运算。在Strapi的@strapi/core包中,用户注册和密码更新接口未对密码长度进行上限校验,导致用户可以提交任意长度的密码。攻击利用方式如下:1)攻击者或正常用户注册时设置一个超过72字节的密码(例如'AAAAAA...(72字节有效部分)...BBBB(超长部分)');2)系统使用bcryptjs对完整密码进行哈希,但实际仅哈希前72字节,结果存储在数据库中;3)当用户尝试登录时,仅需输入前72字节部分即可通过认证,因为后端的哈希比较仅基于截断后的72字节;4)这种行为降低了密码的有效熵,因为攻击者只需猜测前72字节即可,无需考虑用户认为有效的全部字符。攻击者无需认证即可通过网络远程利用此漏洞,通过观察系统行为或尝试截断密码即可实现未授权访问的可能性。此外,超长密码输入还会导致bcrypt计算时的CPU开销增加,可能被用于拒绝服务攻击的辅助手段。修复方案是在密码处理流程中加入最大长度校验,确保输入不超过72字节。