CVE-2026-9733CVE-2026-9733是Mojolicious::Plugin::Web::Auth::OAuth2 Perl模块中的一个高危安全漏洞,影响该模块0.17及以下所有版本。该漏洞源于模块在OAuth2授权流程中默认使用了一个不安全的state参数生成机制。根据OAuth 2.0协议规范(RFC 6749第10.12节),state参数用于防止跨站请求伪造(CSRF)攻击,必须使用不可预测的随机值。然而,该模块在没有显式指定state生成器时,默认采用SHA-1哈希算法对可预测的低熵源进行哈希运算,包括epoch时间戳(可通过HTTP响应头中的Date字段泄露)和Perl内置rand函数的返回值。由于这些输入源均可被攻击者预测或获取,生成的state值实际上不具备足够的随机性,攻击者可以预先计算出有效的state值,从而绕过CSRF保护机制。该漏洞的CVSS评分为9.1,属于严重级别,攻击者可以通过网络远程利用,无需认证和用户交互,成功利用后可导致用户会话被劫持,机密性和完整性均受到高影响。该漏洞已于2026年6月23日公开披露,并已在CPAN安全补丁中发布修复方案。
该漏洞的根本原因在于Mojolicious::Plugin::Web::Auth::OAuth2模块的构造函数中,当用户未指定state生成器时,模块会使用一个默认的不安全实现。具体技术细节如下:
1. **默认state生成机制**:在lib/Mojolicious/Plugin/Web/Auth/OAuth2.pm文件的第129-131行,当构造OAuth2插件实例时若未提供自定义的state_generator回调函数,模块将使用内置的默认实现。该实现调用SHA-1算法对以下数据进行哈希:当前epoch时间戳(time()函数返回值)和Perl内置rand()函数的输出。
2. **低熵问题**:epoch时间戳虽然精度到秒,但攻击者可以通过HTTP响应头中的Date字段精确获取服务器时间,误差通常在毫秒级别。而Perl的rand()函数在没有调用srand()的情况下使用确定性种子,在某些Perl版本中甚至默认使用可预测的种子序列。
3. **利用方式**:攻击者首先访问目标OAuth2授权端点,获取服务器返回的Date头以确定大致时间范围,然后穷举可能的rand()值组合,计算对应的SHA-1哈希值。一旦找到匹配的state值,攻击者即可在自己的浏览器中发起授权请求,利用预测的state完成OAuth2流程,从而劫持受害者的会话。
4. **影响范围**:所有使用该模块默认配置部署的Perl Web应用均受影响,攻击者可获取受害者的OAuth2授权令牌,进而访问受保护资源。