IPBUF安全漏洞报告
English
CVE-2025-65945 CVSS 7.5 高危

CVE-2025-65945 | auth0/node-jws HS256算法签名验证绕过漏洞

披露日期: 2025-12-04

漏洞信息

漏洞编号
CVE-2025-65945
漏洞类型
签名验证绕过
CVSS评分
7.5 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
auth0/node-jws

相关标签

签名验证绕过JWT安全HS256node-jws身份验证绕过JSON Web SignatureNode.js高危漏洞

漏洞概述

CVE-2025-65945是auth0/node-jws库中的一个高危安全漏洞,CVSS评分7.5。该漏洞影响版本3.2.2及之前版本以及4.0.0版本。auth0/node-jws是Node.js平台上一个流行的JSON Web Signature(JWS)实现库,广泛应用于JWT令牌签名和验证场景。漏洞根源在于当使用HS256算法时,库在特定条件下存在不正确的签名验证逻辑。具体而言,当应用程序使用jws.createVerify()函数处理HMAC算法时,如果使用来自JSON Web Signature保护头或payload的用户提供数据来执行HMAC密钥查找操作,攻击者可以构造恶意请求绕过签名验证机制。由于HS256算法使用对称密钥进行签名和验证,攻击者可以通过精心构造的JWT令牌,利用用户可控的header或payload字段注入伪造的密钥标识符,从而骗过验证逻辑。这使得攻击者可以在不知道合法密钥的情况下生成有效的签名令牌,可能导致身份验证绕过、权限提升等严重安全问题。该漏洞已通过发布3.2.3和4.0.1版本进行修复。

技术细节

auth0/node-jws库的CVE-2025-65945漏洞源于其jws.createVerify()函数在处理HS256(HMAC-SHA256)算法时的不安全实现。漏洞的核心问题在于签名验证过程中,HMAC密钥的查找机制依赖于攻击者可控制的数据。在正常的JWS验证流程中,验证方需要使用与签名方相同的密钥来验证签名完整性。然而,当应用程序将JWS的保护头(protected header)或payload中的字段值用于密钥查找时,攻击者可以通过注入特定的算法标识符或密钥ID来操纵验证逻辑。具体攻击手法包括:1)攻击者构造一个JWS令牌,将alg头字段设置为HS256;2)将密钥查找相关的字段(如kid)设置为攻击者已知或可预测的值;3)使用该值对应的密钥对令牌进行签名;4)验证方在查找密钥时会使用攻击者提供的值,从而接受伪造的签名。由于HS256使用对称密钥,攻击者只需要找到系统中任何使用相同密钥的合法用户,即可生成有效的令牌。漏洞的技术根源在于库未能确保密钥查找过程与签名验证过程的隔离,违反了JWS规范中关于密钥选择的安全建议。

攻击链分析

STEP 1
步骤1: 信息收集
攻击者识别目标应用程序使用auth0/node-jws库进行JWT/JWS签名验证,并通过代码审计或黑盒测试发现密钥查找逻辑依赖用户可控的输入
STEP 2
步骤2: 构造恶意JWT
攻击者构造一个JWS令牌,将alg头设置为HS256,并将kid或其他用于密钥查找的字段设置为攻击者已知密钥对应的值
STEP 3
步骤3: 签名伪造
攻击者使用自己控制或已知的对称密钥对构造的JWT进行签名,生成看似合法的恶意令牌
STEP 4
步骤4: 绕过验证
目标应用程序收到恶意令牌后,使用jws.createVerify()进行验证,由于密钥查找时使用了攻击者提供的kid值,验证逻辑接受了伪造的签名
STEP 5
步骤5: 权限提升/未授权访问
攻击者成功绕过身份验证,可利用伪造的高权限令牌访问受保护资源或执行未授权操作

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
const jws = require('jws'); // Simulate vulnerable code pattern // This PoC demonstrates how an attacker can bypass signature verification // when user-controlled header/payload data is used in HMAC secret lookup // Vulnerable verification pattern (DO NOT USE) function vulnerableVerify(token, userProvidedKid) { // Attack scenario: userProvidedKid comes from JWT header/payload // and is used directly in secret lookup const secret = secretLookup(userProvidedKid); // Attacker controlled return jws.verify(token, 'HS256', secret); } function secretLookup(kid) { // In vulnerable apps, this might use user-provided kid directly // Attacker can use known kid or manipulate this lookup const secrets = { 'attacker_controlled': 'attacker_secret_key', 'default': 'default_secret' }; return secrets[kid] || 'fallback_secret'; } // Attacker creates malicious token const maliciousPayload = { kid: 'attacker_controlled', // Controls secret lookup alg: 'HS256', // Must use HS256 sub: 'admin' // Try to escalate privileges }; // Sign with attacker's known secret const maliciousToken = jws.sign({ header: { alg: 'HS256', kid: 'attacker_controlled' }, payload: { user: 'admin', role: 'administrator' }, secret: 'attacker_secret_key' // Attacker knows this secret }); // Verification bypassed! const result = vulnerableVerify(maliciousToken, 'attacker_controlled'); console.log('Verification result:', result); // Returns true incorrectly

影响范围

auth0/node-jws < 3.2.3
auth0/node-jws = 4.0.0

防御指南

临时缓解措施
如果无法立即升级到修复版本,可采取以下临时缓解措施:1)在应用层实施额外的签名验证逻辑,确保HMAC密钥与令牌的绑定关系安全;2)限制HS256算法的使用,优先采用RS256或ES256等非对称算法;3)实施令牌白名单机制,限制可接受令牌的来源和格式;4)增加审计日志,监控异常的JWT验证请求模式;5)使用Web Application Firewall(WAF)规则检测和阻止异常的JWT令牌。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表