IPBUF安全漏洞报告
English
CVE-2026-34950 CVSS 9.1 严重

CVE-2026-34950 fast-jwt算法混淆漏洞

披露日期: 2026-04-06

漏洞信息

漏洞编号
CVE-2026-34950
漏洞类型
算法混淆
CVSS评分
9.1 严重
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
fast-jwt

相关标签

JWT算法混淆认证绕过fast-jwtCVE-2026-34950

漏洞概述

fast-jwt 是一个快速的 JSON Web Token (JWT) 实现。在 6.1.0 及更早版本中,位于 fast-jwt/src/crypto.js 的 publicKeyPemMatcher 正则表达式使用了 ^ 锚点。当密钥字符串包含前导空格时,该锚点失效,导致匹配失败。这使得攻击者能够重新利用之前被 CVE-2023-48223 修复的 JWT 算法混淆攻击,从而可能绕过签名验证机制,威胁系统安全。

技术细节

该漏洞的根源在于 fast-jwt 库在处理公钥格式验证时的正则表达式逻辑缺陷。JWT 的安全性依赖于严格的算法和密钥匹配。尽管 CVE-2023-48223 曾尝试修复算法混淆问题,但本次漏洞表明修复不完整。具体而言,`publicKeyPemMatcher` 正则表达式使用了行首锚点 `^`。如果攻击者提供的公钥字符串开头包含空白字符(如空格或换行符),正则匹配将失败。这种匹配失败可能导致验证逻辑绕过或回退,使得攻击者能够利用算法混淆攻击。例如,攻击者可以将令牌的头部算法修改为 HS256(对称加密),并利用被绕过验证的公钥作为密钥来伪造签名。由于无需交互且无需认证,攻击者可在网络上远程利用此漏洞,造成高机密性和高完整性影响。

攻击链分析

STEP 1
侦察
攻击者识别目标系统使用了存在漏洞的 fast-jwt 库(6.1.0及以下版本)。
STEP 2
准备
攻击者准备一个包含前导空格或换行符的恶意公钥字符串,并构造包含高权限载荷的 JWT 数据。
STEP 3
注入
攻击者向目标服务器发送带有恶意公钥和特定算法头(如HS256)的 JWT 请求,触发正则校验绕过。
STEP 4
执行
由于正则锚点失效,fast-jwt 未能正确限制算法,导致签名验证被绕过,攻击者成功伪造令牌。
STEP 5
利用
攻击者利用伪造的令牌以管理员身份访问系统资源,导致数据泄露或完整性破坏。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
const { fastjwt } = require('fast-jwt'); // Exploit Concept: Adding leading whitespace to the public key // This causes the regex check to fail, potentially leading to algorithm confusion. // The library might incorrectly validate the signature or allow algorithm bypass. const maliciousPublicKey = " \n-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...\n-----END PUBLIC KEY-----"; const payload = { user: 'admin', role: 'superuser' }; // Attacker attempts to sign or verify using a manipulated key // Depending on the library logic flow, this might bypass the asymmetric check. try { const sign = fastjwt.sign(payload, { algorithm: 'HS256', key: maliciousPublicKey }); const token = sign(); console.log("Potentially forged token:", token); } catch (e) { console.log("Explication attempt failed:", e.message); }

影响范围

fast-jwt <= 6.1.0

防御指南

临时缓解措施
在将公钥传递给 fast-jwt 进行验证之前,务必使用字符串修剪函数(如 JavaScript 的 `.trim()` 方法)清理密钥字符串,确保没有前导或尾随的空白字符,从而防止正则表达式校验被绕过。

参考链接

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