IPBUF安全漏洞报告
English
CVE-2026-22037 CVSS 8.4 高危

CVE-2026-22037: @fastify/express URL编码绕过中间件访问控制漏洞

披露日期: 2026-01-19

漏洞信息

漏洞编号
CVE-2026-22037
漏洞类型
访问控制绕过
CVSS评分
8.4 高危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
@fastify/express

相关标签

@fastify/expressFastifyURL编码绕过中间件绕过访问控制绕过Express兼容性Node.jsCVE-2026-22037路径匹配安全中间件

漏洞概述

@fastify/express是Fastify框架的Express兼容性中间件插件,为Fastify应用提供完整的Express中间件支持。该插件在4.0.3之前的版本中存在严重的访问控制绕过漏洞,攻击者可以通过URL编码字符绕过中间件路径限制,访问受保护的端点而无需经过预期的中间件验证流程。漏洞源于中间件路径匹配逻辑与底层Fastify路由解码逻辑的不一致。当中间件注册在特定路径前缀(如/admin)下时,攻击者可以使用URL编码字符(如/%61dmin,其中%61代表字符'a')构造请求。中间件引擎无法识别编码后的路径而跳过执行,但Fastify路由会正确解码路径并匹配对应的路由处理器,导致访问控制中间件被绕过。此漏洞可能使攻击者获取未授权访问权限,危及应用程序的安全性。

技术细节

漏洞的核心问题在于URL路径解码时机的不一致。@fastify/express在注册Express风格中间件时,使用路径前缀匹配来决定哪些请求需要经过中间件处理。然而,其路径匹配逻辑在比较时不进行URL解码,直接将请求路径与注册的中间件路径进行字符串比较。当攻击者发送请求路径为`/%61dmin`(对应`/admin`)时,中间件引擎尝试匹配`/%61dmin`与注册的`/admin`路径,由于字符串不匹配,中间件被跳过。但Fastify的底层路由在接收到请求后,会先对路径进行URL解码,然后再进行路由匹配,因此`/%61dmin`被解码为`/admin`,成功匹配到`/admin`路由处理器。这种解码时机差异导致了安全检查的绕过。攻击者可以通过系统地替换路径中的关键字符为URL编码形式(如%2e代替.,%2f代替/),绕过各种基于路径的访问控制中间件,包括认证、授权、输入验证等。修复版本4.0.3通过统一路径解码时机解决了此问题。

攻击链分析

STEP 1
步骤1
攻击者识别目标应用使用@fastify/express中间件,并发现受保护的路由(如/admin、/api/admin等)
STEP 2
步骤2
攻击者构造包含URL编码字符的恶意请求,将路径中的关键字符进行编码(如将/admin中的'a'编码为%61)
STEP 3
步骤3
中间件引擎接收请求后,使用未解码的路径进行匹配,由于编码后的路径与注册的中间件路径不匹配,中间件被跳过
STEP 4
步骤4
Fastify底层路由处理器接收请求后,先对路径进行URL解码,然后进行路由匹配,成功匹配到目标路由
STEP 5
步骤5
攻击者成功绕过认证/授权中间件,获取对受保护端点的未授权访问,可能导致数据泄露或权限提升

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// CVE-2026-22037 PoC - URL Encoded Path Bypass // Target: @fastify/express < 4.0.3 const fastify = require('fastify')(); const fastifyExpress = require('@fastify/express'); fastify.register(fastifyExpress); // Register authentication middleware on /admin path fastify.use('/admin', (req, res, next) => { // Authentication check - should block unauthorized access if (!req.headers.authorization) { return res.status(401).json({ error: 'Unauthorized' }); } next(); }); // Protected admin endpoint fastify.get('/admin/dashboard', (req, res) => { res.json({ message: 'Admin Dashboard - Protected Data' }); }); // Normal user endpoint fastify.get('/user/profile', (req, res) => { res.json({ message: 'User Profile' }); }); // Attack vector: // Normal request (blocked by middleware): GET /admin/dashboard // Bypassed request (allowed): GET /%61dmin/dashboard // The encoded 'a' (%61) bypasses middleware but Fastify decodes and matches /admin/dashboard

影响范围

@fastify/express < 4.0.3

防御指南

临时缓解措施
如果无法立即升级,可采用以下临时缓解措施:1) 在Fastify的preHandler钩子中重新实现认证检查,确保在路由处理前进行权限验证;2) 对请求路径进行解码后再与白名单进行匹配;3) 使用Fastify的hook机制在请求早期阶段进行访问控制验证;4) 限制可以解码的字符类型,防止恶意编码绕过。建议在完成升级前限制受影响的端点公开暴露。

参考链接

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