Featured image of post CVE-2025-29927

CVE-2025-29927

Next.js

Next.js: CVE-2025-29927

漏洞概述

Next.js 是由 Vercel 开发的 Web 开发框架,旨在简化高性能 Web 应用程序的创建。Next.js 构建于 React 之上,并通过添加多项功能(例如静态站点生成 (SSG) 和服务端渲染 (SSR))扩展了 React 的功能。SSG 在构建时预生成页面,从而可以更快地交付给用户;此外,SSR 在请求时渲染页面,从而减少加载时间。简而言之,Next.js 添加了旨在提升性能和用户体验的功能。

CVE -2025-29927Rachid 和 Yasser Allam 最近在 Next.js 中发现的一个漏洞,该漏洞表明如果授权检查发生在中间件中,则有可能被绕过。中间件是授予开发人员控制传入请求的部分。它充当传入请求和路由系统之间的桥梁。路由系统是基于文件的,即通过组织文件和目录来创建和管理路由。此漏洞允许攻击者绕过基于中间件的授权,并且 14.2.25 和 15.2.3 之前的所有版本都容易受到此漏洞的影响。

Next.js 广泛应用于各种类型的应用程序,包括电商平台、新闻应用、文档网站和交互式 Web 应用。因此,此漏洞可能造成严重后果,需要管理员将其安装升级到修补版本。

漏洞利用

Curl

Yunus Aydin 在 GitHub 上发布了一个概念验证 ( PoC ) 可利用的应用程序和漏洞代码。部署好之后可以通过访问 http://10.10.134.123:3000 查看示例 Web 应用程序。但是,如果尝试访问 http://10.10.134.123:3000/protected 上的受保护路由,将被重定向到主页。

利用 CVE -2025-29927 漏洞非常简单;攻击者只需在请求中添加额外的 HTTP 标头 x-middleware-subrequest: middleware 即可。正如披露此漏洞的原始帖子中所述,添加 x-middleware-subrequest 标头会导致请求被转发到其目的地,而无需中间件对其进行操作。因此,只需使用带有适当标头参数的 curl 即可访问受保护的路由(即页面)。

利用此漏洞我们可以访问受保护的页面。一个简单的方法是在终端中输入以下命令。

1
curl -H "x-middleware-subrequest: middleware" http://10.10.134.123:3000/protected

该命令与普通的 curl 命令类似,但有一个区别:它使用 -H 选项(相当于 --header 选项)向 HTTP GET 请求添加额外的标头。因此,上述 curl 命令允许攻击者绕过所有安全控制并检索受保护的页面。

Burp Suite

使用 Burp Suite 也同样容易利用此漏洞。一种简单的方法是使用 Burp Suite 的浏览器,并在访问 http://10.10.134.123:3000/protected 时修改请求。

image-20250417153324156

漏洞检测

回想一下前面的任务,Next.js 的 CVE -2025-29927 是一个中间件授权绕过漏洞,导致能够访问以前需要此类授权的页面和路由。

此任务将涵盖一些可用于通过日志和网络流量检测此类攻击发生的技术和规则。

手动

Web 服务器日志可能有助于发现此类漏洞的证据。但这取决于 Web 服务器是否配置为记录 HTTP 标头。例如,NodeJS 允许通过 request.headers['x-middleware-subrequest'] 记录此特定的 HTTP 标头。

如果 Web 应用程序使用了代理,则需要修改 Web 服务器(例如 Nginx 或 Apache2)上的日志配置,以记录此特定标头。例如,可以使用 Apache2 中的 LogFormat

1
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" \"%{x-middleware-subrequest}i\"" custom

一旦正确设置了此 HTTP 标头的日志记录,就可以使用 Grep、Yara 等常用工具。

[了解]Snort (v2)

以下 Snort 规则在用作 IDS 时可用于检测 CVE -2025-29927 的发生:

1
alert tcp any any -> any any (msg: "HTTP 'x-middleware-request' header detected, possible CVE-2025-29927 explotation"; content:"x-middleware-subrequest";  rawbytes; sid:10000001; rev:1)

此规则检查数据包时不考虑任何协议,例如 http_headers 模块。这是因为在撰写本文时, HTTP 标头“x-middleware-request”在 Snort 中尚未被识别

首先,我们将 Snort 规则添加到本地规则中。默认情况下,在 Ubuntu 上,它位于 /etc/snort/rules/local.rules 。现在,我们将上面的代码片段粘贴并保存。请注意,如果您已有规则,则需要将 sid 值更改为其他值。

1
2
3
4
5
6
7
8
kali@yrc-2404:~$ sudo nano /etc/snort/rules/local.rules
# $Id: local.rules,v 1.11 2004/07/23 20:14:44 bmc Exp $
# ----------------
# LOCAL RULES
# ----------------
# This file intentionally does not come with signatures.  Put your local
# additions here.
alert tcp any any -> any any (msg: "HTTP 'x-middleware-request' header detected"; content:"x-middleware-subrequest";  rawbytes; sid:10000001; rev:1)

现在,我们可以运行 Snort 并测试其检测效果。下面的终端以控制台模式运行 Snort,以演示警报触发过程。

1
2
kali@yrc-2404:/var/log/snort$ sudo snort -q -l /var/log/snort -i ens5 -A console -c /etc/snort/snort.conf
03/24-20:16:13.424299  [**] [1:10000001:1] HTTP 'x-middleware-request' header detected [**] [Priority: 0] {TCP} 10.10.142.69:49432 -> 10.10.219.251:3000

[了解]Zeek

Zeek 为网络流量中的威胁检测提供了更全面的方案。对于 CVE -2025-29927,可以使用以下 Zeek 规则:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
module CVE_2025_29927;

export {
    redef enum Log::ID += { LOG };
    global log_policy: Log::PolicyHook = Log::IGNORE;

    event http_header(c: connection, is_orig: bool, name: string, value: string) {
        if (name == "x-middleware-subrequest" && value == "middleware")
            Log::write(HTTP::LOG, [
                $timestamp=c$start_time,
                $uid=c$uid,
                $id=c$id,
                $note="CVE_2025_29927_Exploit",
                $msg="Detected HTTP header associated with CVE-2025-29927",
                $header=name,
                $value=value
           ]);
        notice_info(c, "CVE-2025-29927 Exploit", fmt("The HTTP header '%s' associated with CVE-2025-29927 was detected", value));
    }
  }
}

确保此文件以 .zeek 扩展名保存在 Zeek 脚本的配置目录中。您需要修改 local.zeek 文件,通过添加 @load ./cve_2025_29927.zeek 来包含此脚本。

最后,通过 sudo zeekctl deploy 重启 Zeek 以应用配置更改。如果成功,当检测到 CVE -2025-29927 时, Zeek 将会发出警报:

1
[Connnection_ID] The HTTP header "x-middleware-subrequest" associated with CVE-2025-29927 was detected

总结

查看关于发现此漏洞的原始帖子,许多流行应用程序的源代码中仍然潜伏着许多漏洞。对于已修复的版本,用户需要升级到以下版本:

  • Next.js 15.x 应该升级到 15.2.3
  • Next.js 14.x 应该升级到 14.2.25
  • Next.js 13.x 应该升级到 13.5.9
  • Next.js 12.x 应该升级到 12.3.5

如果修补不可行,唯一的解决方法是阻止包含 x-middleware-subrequest 的 HTTP 请求到达您的 Web 应用程序。

使用 Hugo 构建
主题 StackJimmy 设计