当前位置: 首页 > article >正文

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

前文本文通过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。中间件可以作为第一层门禁但绝不能作为唯一的防线。真正稳固的系统必须在路由入口、中间件、业务控制器、敏感操作接口等多个层面分别进行校验这样即使其中一层失守也不会让整套系统瞬间门户大开。

相关文章:

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

前文 本文通过CVE-2025-29927来叙述,Next.js框架的严重(Critical)漏洞,这个漏洞的核心是中间件(Middleware)鉴权绕过。 它并不是业务代码本身直接出现了认证缺陷,而是Next.js内部为了防止中间件…...

用STM32F103和FreeRTOS做个智能小管家:从传感器到QT界面的完整开发记录

从零打造智能环境监控系统:STM32F103FreeRTOS实战手记 去年夏天,我在书房里盯着不断跳闸的空调插座,突然萌生了一个想法:为什么不能自己做一个能感知环境、自动调节的智能系统?于是,这个结合STM32F103和Fre…...

嵌入式整数线性映射库:零依赖、溢出安全、硬实时兼容

1. 项目概述Map是一个轻量级、零依赖的嵌入式数学映射库,其核心功能是将一个输入数值区间(源范围)线性映射到另一个输出数值区间(目标范围)。该库不依赖任何标准C库函数(如math.h中的fabs或fminf&#xff0…...

BH1750环境光传感器驱动开发与嵌入式应用实践

1. BH1750环境光传感器技术解析与嵌入式驱动开发实践BH1750是由ROHM(罗姆)半导体推出的高精度数字环境光传感器IC,专为智能照明控制、自动背光调节、人机交互界面亮度自适应等场景设计。该器件采用IC串行接口,内置16位ADC&#xf…...

Z-Image-GGUF自动化运维:基于Shell脚本的模型服务监控与重启

Z-Image-GGUF自动化运维:基于Shell脚本的模型服务监控与重启 你有没有遇到过这种情况?一个跑得好好的AI文生图服务,突然就卡住了,或者直接崩溃了。尤其是在生产环境里,半夜三更收到告警,爬起来重启服务&am…...

SEW-Movifit变频器拨码开关设置全攻略(附X50接口位置图解)

SEW-Movifit变频器拨码开关设置全攻略(附X50接口位置图解) 在工业自动化领域,SEW-Movifit系列变频器因其出色的性能和稳定性备受工程师青睐。然而,对于初次接触该设备的现场技术人员来说,拨码开关的设置和接口定位往往…...

选对城市对年轻人的发展到底有多重要?

前言 最近后台有很多小伙伴问我,如何选择城市发展,特别是在工作的前五年。 小编个人认为,选对城市对年轻人的发展是非常重要。接下来小编就来聊聊我个人观点。 特别说明:仅代表个人观点,无任何引导,请大家…...

技术解析 2DGS vs 3DGS | SIGGRAPH 2024 新方法如何用‘二维圆盘’实现精准表面重建

1. 从3D到2D:为什么高斯溅射需要"降维打击" 去年第一次接触3D Gaussian Splatting(3DGS)时,我被它的实时渲染效果震撼了——在RTX 3090上能跑到200FPS以上的新视角合成,这比传统NeRF快了上百倍。但当我尝试用…...

信捷HMI与西门子S7-1200通信实战:从IP配置到Wireshark抓包全流程

信捷HMI与西门子S7-1200工业通信深度解析:从配置到诊断的全链路实践 在工业自动化项目中,不同品牌设备间的数据互通往往成为系统集成的技术难点。当信捷HMI需要与西门子S7-1200 PLC建立稳定通信时,工程师不仅需要掌握基础配置技能&#xff0c…...

Nanbeige 4.1-3B惊艳效果:流式渲染速度与显存占用的帕累托最优解

Nanbeige 4.1-3B惊艳效果:流式渲染速度与显存占用的帕累托最优解 1. 复古像素风AI对话体验 Nanbeige 4.1-3B模型带来的"像素冒险聊天终端"彻底改变了传统AI对话界面的刻板印象。这套前端设计采用了经典的JRPG视觉风格,将AI交互变成了一场充满…...

FLAC3D中桩单元与梁单元弯矩、轴力、剪力云图及包络线显示探索

flac3d桩单元,梁单元,弯矩,轴力,剪力云图显示,可以显示成包络线的形式,达到与midas类似的效果。 支持pile单元和beam单元。在岩土工程数值模拟领域,FLAC3D是一款强大的工具。今天咱们来聊聊如何…...

JIRA 7.3.8企业级部署实战:破解包安全替换与MySQL连接器配置详解

JIRA 7.3.8企业级部署实战:关键组件安全配置与MySQL连接优化 在企业级项目管理工具部署过程中,JIRA作为行业标杆产品,其稳定性和合规性直接关系到团队协作效率。本文将深入探讨两个核心组件——atlassian-extras和mysql-connector的配置细节&…...

探索Maxwell:地质电气数据处理的得力助手

Maxwell是一个用于地质电气数据的32位Windows应用程序。 加密狗软件 它是电子地球物理数据消费者的生产力增强工具。已经确定它已被开发用于处理所有类型的地球物理数据:时域,频域,地面,机载,dB / dt和B场。Maxwell自动…...

MATLAB小波工具箱GUI实战:5分钟搞定信号降噪与压缩(附完整流程)

MATLAB小波工具箱GUI实战:5分钟搞定信号降噪与压缩 在工程信号处理领域,噪声干扰和数据冗余是两大常见痛点。传统编程方式虽然灵活,但对于需要快速验证效果的工程师来说,往往显得效率不足。MATLAB小波工具箱提供的图形用户界面(GU…...

PostgreSQL 生产环境升级实战:pg_upgrade 核心原理与避坑指南

1. 为什么需要pg_upgrade? PostgreSQL作为一款开源关系型数据库,每年都会发布新版本。新版本不仅修复bug,还会带来性能优化和新功能。但很多DBA面对生产环境升级时总是犹豫不决——毕竟谁也不想因为升级导致业务中断或数据丢失。 我经历过一次…...

用Human Resource Machine教孩子学编程:20个趣味关卡背后的计算机原理

用Human Resource Machine解锁孩子的计算思维:20个趣味关卡中的编程奥秘 当我的小侄女第一次在平板上玩《Human Resource Machine》时,她完全没意识到自己正在学习计算机科学中最核心的概念。这款看似简单的游戏,实际上是一套精心设计的可视化…...

AI 创作者指南:序章.AI 创作时代的到来:为什么创作者必须升级?

序章|AI 创作时代的到来:为什么创作者必须升级? 想象一下:你正坐在电脑前,屏幕上跳出一行字—— “AI 不会替你创作,但会放大你创作的一切。” 这句话,是不是像老朋友拍拍你肩膀,语气轻松却戳中要害?不是吓唬你“AI要抢饭碗”,而是悄悄告诉你:别慌,AI其实是给你开了…...

2026年3月GESP真题及题解(C++七级):物流网络

2026年3月GESP真题及题解(C七级):物流网络 题目描述 一个物流网络由 nnn 个城市和 mmm 条双向公路组成。每条公路都有两个属性: 运输费用 wiw_iwi​景观评分 bib_ibi​ 当一辆运输车从城市 111 运送货物到城市 nnn 时&#xff…...

避开Webots 2021b+版本的大坑:手把手教你下载并配置2021a旧版(附中文环境设置)

避开Webots新版陷阱:2021a旧版完整安装与中文配置指南 当你在搜索引擎输入"Webots安装教程"时,可能已经遇到了那个令人抓狂的问题——下载材质失败。这不是你的网络问题,而是新版Webots的一个设计缺陷。本文将带你绕过这个坑&#…...

网络传输设备全解析:从集线器到路由器的数据传输奥秘

1. 网络传输设备基础:信号如何跑起来 当你用手机刷短视频时,数据正以每秒数亿次的电信号震荡穿过网线。这个过程中,双绞线里的铜丝就像高速公路,而网络设备则是立交桥系统。网卡把视频数据转换成电信号时,会经历三个关…...

OpenClaw多Agent实战指南:从单智能体到AI协作团队(非常详细),从入门到精通,收藏这一篇就够了!

Gartner 数据显示,2024 年 Q1 到 2025 年 Q2,企业对多智能体系统的咨询量激增 1445%,越来越多开发者从单 AI Agent 的「单兵作战」转向多 Agent 的「团队协作」。但实际使用中,很多人用 OpenClaw 时会遇到这样的问题:让…...

从防御者视角看DoS:用Snort和Wireshark给你的服务器做个‘压力测试’

从防御者视角看DoS:用Snort和Wireshark给你的服务器做个‘压力测试’ 在当今数字化时代,服务器安全已成为每个运维团队的首要任务。想象一下,当你的网站突然变得异常缓慢,甚至完全无法访问时,作为运维人员的你会如何应…...

OpenSSL实战:5分钟搞定ECDSA签名与验证(含secp256r1密钥生成)

ECDSA签名验证实战:从密钥生成到安全认证的全流程指南 在当今数字安全领域,椭圆曲线数字签名算法(ECDSA)因其高安全性和高效能已成为TLS 1.3、比特币等众多关键系统的核心组件。本文将带您快速掌握使用OpenSSL命令行工具完成ECDSA…...

ACM论文投稿必备:CCS Concepts分类指南(附LaTeX代码生成技巧)

ACM论文投稿必备:CCS Concepts分类指南与LaTeX代码生成实战 当你准备向ACM投稿时,是否曾被CCS Concepts分类搞得一头雾水?作为计算机科学领域最具影响力的学术组织之一,ACM对论文格式的要求极为严格,而CCS Concepts分类…...

Elasticsearch分词查询实战:match_phrase和term的5个常见坑点解析

Elasticsearch分词查询实战:match_phrase和term的5个常见坑点解析 第一次用Elasticsearch做精确查询时,我被match_phrase和term的诡异行为彻底搞懵了——明明数据就在那里,查询却总是返回空结果。后来才发现,问题出在对分词机制的…...

Gemini 3.1 Pro 硬核推理优化剖析:思维织锦、动态计算与国内实测

Gemini 3.1 Pro的卓越表现不仅源于庞大的参数与数据,更得益于其底层一系列精细的推理优化技术,包括创新的“思维织锦”框架、动态计算分配机制及针对性的训练策略。对于国内开发者与研究者而言,要深度验证这些优化技术的实际效果,…...

TTL与CMOS逻辑电路原理、差异及接口选型指南

1. 数字逻辑电路基础:TTL与CMOS技术原理与工程选型分析数字集成电路是现代电子系统的核心基石,其性能边界直接决定了整个系统的功耗、速度、集成度与可靠性。在数十年的发展历程中,双极型晶体管逻辑(TTL)与互补金属氧化…...

Gemini 3.1 Pro 2026硬核技术拆解:MoE架构、长上下文如何实现国内直访?

Gemini 3.1 Pro不仅是参数的简单扩张,其核心在于通过创新的MoE(混合专家)架构、革命性的长上下文处理机制及高效推理优化,实现了性能与成本的平衡。对于国内开发者和研究者,想要深入体验其技术特性,目前可通…...

⚡ SenseVoice-Small ONNX效果展示:新闻播音→带标点全文→摘要生成链路

SenseVoice-Small ONNX效果展示:新闻播音→带标点全文→摘要生成链路 1. 引言:当语音识别遇上新闻播报 想象一下,你刚录完一段重要的新闻播报音频,可能是会议纪要、采访录音,或者是一段需要整理成文字稿的播客内容。…...

手把手教你调试富文本编辑器:Cannot find a descendant at path 错误排查全记录

手把手教你调试富文本编辑器:Cannot find a descendant at path 错误排查全记录 富文本编辑器作为现代Web应用的核心组件之一,其复杂性往往隐藏在看似简单的API背后。当控制台突然抛出Cannot find a descendant at path [0,2] in node这类错误时&#xf…...