CVE-2025-29927 漏洞分析:当 Next.js 的防死循环机制,变成了中间件鉴权绕过的入口

news2026/3/22 12:36:08
前文本文通过CVE-2025-29927来叙述Next.js框架的严重Critical漏洞这个漏洞的核心是中间件Middleware鉴权绕过。它并不是业务代码本身直接出现了认证缺陷而是Next.js内部为了防止中间件递归调用而设计的子请求标记机制被外部请求伪造后触发了“跳过 Middleware”的错误路径。漏洞概述CVE编号 CVE-2025-29927漏洞类型鉴权绕过可以跳过身份认证和授权受影响产品* Next.js 15.x 15.2.3Next…js 14.x 14.2.25Next.js 13.x 13.5.9Next.js 12.x 12.3.5补充说明官方还要求 11.x 用户采用临时缓解措施该分支未提供常规补丁版本漏洞位置中间件的路由防死循环验证漏洞表现 攻击者可以通过构造特定的 HTTP 请求头完全跳过 Next.js 的中间件逻辑从而绕过身份验证Authentication和授权Authorization。漏洞载体Next.js Middleware中间件Middleware是什么在Next.js中Middleware是一段请求完成并响应之前运行的代码通常定义在 middleware.ts 或 middleware.js 中。它是充当客户端和后端路由/页面之间的“守门员”。它的主要作用是什么Middleware 的设计初衷是为了在全局层面集中处理非业务逻辑减少核心业务代码的冗余。它通常被用于实现以下目标统一鉴权与访问控制最核心 检查用户的 Token、Cookie 或 Session判断其是否有权限访问某些受保护的路由如 /admin 或 /dashboard。如果没有权限则将其重定向到登录页。国际化i18n与本地化路由 根据用户的地理位置或语言偏好重定向到特定的语言版本如从 / 重定向到 /en-US。安全性增强 注入安全相关的 HTTP 头如 CSP 策略。日志记录与限流 在请求到达具体页面前记录访问日志或进行速率限制Rate Limiting。防死循环机制设计Next.js的内部路由机制比较复杂当请求到达中间件时会涉及它的请求重写Rewrite和内部路由跳转。在这个过程中Next.js 会发起“内部的子请求”。正常重写逻辑Next.js 的 Middleware 运行在缓存与路由处理之前开发者通常会在这里实现鉴权、重写、重定向等逻辑。假设用户要访问 tenant-a.example.com/dashboard中间件在第一次接收到这个请求后可能会把它重写为内部的实际路径 /app/tenant-a/dashboard也就是沟通前端 URL 与后端实际服务器返回内容之间的桥梁。在这个过程中Next.js 会把这个重写后的目标重新交给内部路由系统去处理而为了避免这种内部跳转反复再次进入中间件、最终导致递归失控框架就引入了专门的防死循环机制。死循环的发生如果因为开发者的失误导致中间件的逻辑出现缺陷没有排除已经重写过的路径会发生一个悲剧第一次匹配用户请求 /api/data -中间件重写为 /api/v2/data第二次匹配内部子请求/api/v2/data再次被中间件重写为/api/v2/v2/data。。。。。。如果没有一个“刹车机制”这种内部的相互调用会瞬间耗尽服务器Node.js 进程的内存和 CPU导致服务直接崩溃OOM - Out of Memory 或栈溢出。妥协机制为了防止开发者导致的惨剧Next.js在每次发起内部子请求时强行向字段中加注一个x-middleware-subrequest 计数器。它会记录这个子请求被重写的次数如果超过5次那么框架会认为“开发者编写出现问题为了不让进程死掉我需要停止让中间件处理这个请求把当前的请求直接丢给后端渲染”。这个“为了保命而强行放行”的底层防御逻辑把它变成了攻破大门的钥匙。漏洞原理在实际框架中中间件通过NextResponse.rewrite() 或 NextResponse.next() 触发内部子请求。为了防止中间件出发递归的无限死循环Next.js 引入了 MAX_RECURSION_DEPTH最大递归深度默认通常为 5和 x-middleware-subrequest 请求头来作为计数器。以下是存在漏洞的内部逻辑模拟// 模拟 Next.js 内部路由调度器 (存在漏洞的版本)constMAX_RECURSION_DEPTH5;functionhandleRequest(req,res){// 1. 获取请求头中的递归深度标记// 正常情况下这个 header 是 Next.js 内部发起的子请求自带的constsubrequestHeaderreq.headers[x-middleware-subrequest];// 2. 计算当前中间件的调用层级letcurrentDepth0;if(subrequestHeader){// Next.js 会通过冒号 : 将 header 值分割计算长度作为当前深度// 例如 middleware:middleware 的深度就是 2currentDepthsubrequestHeader.split(:).length;}// 3. 【致命缺陷点】如果深度达到或超过上限为了防止死循环框架会强行终止中间件if(currentDepthMAX_RECURSION_DEPTH){console.warn(Middleware recursion limit reached, skipping middleware...);// 直接进入页面渲染逻辑中间件鉴权被完全跳过returnrenderProtectedPage(req,res);}// 4. 正常执行中间件逻辑 (如验证 Token未登录则重定向)returnexecuteMiddleware(req,res);}可以看到如果真的触发死循环机制了框架会直接跳过中间件中的其他机制鉴权等等并让请求继续进入后续的路由分发、页面渲染或接口处理流程这就让当前这个请求没有认证和授权过程。如果请求对应的页面、API Route 或 Server Action 没有二次鉴权的话这就相当于我可以构建任何当前架构有的功能并且以我想要的任何身份来执行它。根本原因触发漏洞的根本原因是Next.js 盲目信任了 x-middleware-subrequest 这个请求头而没有验证它的来源。其实防止死循环的机制本身并没有太大的问题出现此漏洞的原因还是因为后端中间件处理轻信了前端的参数。如果一个外部攻击者在发起 HTTP 请求时手动在请求头中伪造了这个字段GET /admin/dashboard HTTP/1.1 Host: vulnerable-app.com x-middleware-subrequest: middleware在有缺陷的版本中中间件会完全信任这个原始请求中自带的x-middleware-subrequest: middleware字段这个原始请求在中间件眼中就是一个已经完成一次重写的请求。直接原因由于中间件轻信前端x-middleware-subrequest字段倘若我们构建一个GET /admin/dashboard HTTP/1.1 Host: vulnerable-app.com x-middleware-subrequest:middleware:middleware:middleware:middleware:middleware发送此请求会请求到达Next.js服务器内部逻辑读取 req.headers[‘x-middleware-subrequest’]。执行 .split(‘:’).length计算结果为 5。触发 currentDepth 5 的判断条件。Next.js 框架判定“这是一个内部请求且已经重写了 5 次为了防止服务器卡死立刻停止执行中间件直接输出最终页面。”/admin/dashboard 页面的敏感数据被直接返回给未授权的攻击者。(注在较早的 Next.js 12.x 版本中逻辑略有不同只需传入 x-middleware-subrequest: pages/_middleware 即可触发完全跳过。)可以看到请求直接越过中间件了什么中间件的鉴权认证统统都被甩到身后了也就是整个整个服务器的第一层大门已经被上述payload给干掉了在当时情况中流行使用 NextAuth.js (Auth.js)、Clerk 或 Supabase Auth。很多开发者的最佳实践是完全依赖中间件来保护整个后台路由。这样的话就可以通过这样一个简单的payload攻陷整个服务器了。源码Diff如何修复这个漏洞模拟Diff逻辑修复functionhandleRequest(req,res){// 【修复方案】在请求进入框架深处之前清洗来自外部的内部保留请求头// 确保 x-middleware-subrequest 只能由框架内部的 fetch/rewrite 生成if(isExternalClientRequest(req)){deletereq.headers[x-middleware-subrequest];}constsubrequestHeaderreq.headers[x-middleware-subrequest];letcurrentDepth0;if(subrequestHeader){currentDepthsubrequestHeader.split(:).length;}if(currentDepthMAX_RECURSION_DEPTH){returnrenderProtectedPage(req,res);}returnexecuteMiddleware(req,res);}修复逻辑其实根本原则是“不要信任来自外部边界的内部状态标识”。官方的修复思路本质上就是在请求进入核心路由引擎之前对请求信息进行严格清洗确保 x-middleware-subrequest 这样的内部标记只能由框架内部生成而不能被外部客户端直接带入。同时如果开发者暂时无法立即升级 Next.js 版本比较现实的缓解方式就是在应用前置层例如反向代理、网关或 WAF直接拦截所有来自外部、且携带该 Header 的请求以此模拟补丁效果。由此也可以看到这个漏洞本质非常简单道理也很直接就是服务器轻信了来自外部、可以被恶意伪造的内部状态参数。部署差异说明这个漏洞主要影响的是自托管的 Next.js 应用例如使用 next start 或 output: ‘standalone’ 部署的场景。如果应用运行在 Vercel 托管环境下官方说明默认不会受到这个漏洞影响。除此之外像 Netlify 和 Cloudflare Workers 这类与 Next.js 内部处理链路解耦较多的部署方式在当时的分析中也被认为不受该漏洞影响。这也说明了一个问题同样是 Next.js 项目不同的部署架构最终暴露出来的攻击面并不完全一样。中间件被完全绕过的灾难后果如果攻击者成功触发了防死循环机制导致中间件直接退出Skip这绝不仅仅是“没验证 Token”那么简单。在现代前端全栈架构中其后果是系统性的防线崩塌。核心业务数据裸奔这正是前文说道如果整个服务器完全依赖中间件来保护后端路由没有二次鉴权的情况下未授权的访客可以直接带着伪造的头访问任何页面包括其中敏感的个人身份信息、财务报表等等都会被完整渲染给前端。越权操作与 API 裸露Privilege Escalation如果Next.js API Routes (/api/… 或 Server Actions) 也被配置在中间件的保护范围内攻击者不仅可以看到页面还可以向受保护的接口发送POST/DELETE请求类似于直接POST到/api/admin/delete-userAPI如果缺乏深度防御就会乖乖执行删除操作。安全策略失效Security Headers Bypass优秀的中间件通常会做安全加固工作注入 Content-Security-Policy (CSP) 防止 XSS 攻击。注入 Strict-Transport-Security (HSTS)。执行 IP 黑名单拦截或速率限制Rate Limiting。一旦中间件被绕过这些响应头将全部丢失应用会暴露在 XSS、暴力破解等其他攻击的火力之下。国际化引发的缓存投毒i18n Cache Poisoning如果应用依赖中间件做语言重定向比如把根目录 / 强行重定向到 /en 或 /zh导致根目录 / 实际上是不存在实际页面的攻击者绕过中间件直接访问 /。Next.js 找不到 / 的页面组件抛出 404 或 500 错误。由于 Next.js 默认的强缓存机制或者外部 CDN如 Cloudflare, Vercel Edge的缓存这个 500 错误页面会被缓存下来。结果接下来所有正常用户的访问都会直接看到这个被缓存的错误页面造成严重的拒绝服务DoS。总结总结来说这个漏洞最可怕的地方并不只是“一个 Header 可以伪造”而是它利用了系统本身为了自保而设计出的“安全降级机制”让开发者精心构建的第一层防线直接变成了摆设。从这个角度看CVE-2025-29927 暴露出的并不是某一行代码写错了而是现代 Web 架构中一个非常危险的误区把中间件当成唯一的安全边界。一旦框架层的某个内部机制被绕过后面的页面、接口、Server Action 乃至缓存系统都会连锁暴露。这其实也引出了一个非常关键的现代 Web 安全架构理念纵深防御Defense in Depth。中间件可以作为第一层门禁但绝不能作为唯一的防线。真正稳固的系统必须在路由入口、中间件、业务控制器、敏感操作接口等多个层面分别进行校验这样即使其中一层失守也不会让整套系统瞬间门户大开。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2436960.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…