Next.js: CVE-2025-29927
漏洞概述
Next.js 是由 Vercel 开发的 Web 开发框架,旨在简化高性能 Web 应用程序的创建。Next.js 构建于 React 之上,并通过添加多项功能(例如静态站点生成 (SSG) 和服务端渲染 (SSR))扩展了 React 的功能。SSG 在构建时预生成页面,从而可以更快地交付给用户;此外,SSR 在请求时渲染页面,从而减少加载时间。简而言之,Next.js 添加了旨在提升性能和用户体验的功能。
CVE -2025-29927 是 Rachid 和 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
即可访问受保护的路由(即页面)。
利用此漏洞我们可以访问受保护的页面。一个简单的方法是在终端中输入以下命令。
|
|
该命令与普通的 curl
命令类似,但有一个区别:它使用 -H
选项(相当于 --header
选项)向 HTTP GET 请求添加额外的标头。因此,上述 curl
命令允许攻击者绕过所有安全控制并检索受保护的页面。
Burp Suite
使用 Burp Suite 也同样容易利用此漏洞。一种简单的方法是使用 Burp Suite 的浏览器,并在访问 http://10.10.134.123:3000/protected
时修改请求。
漏洞检测
回想一下前面的任务,Next.js 的 CVE -2025-29927 是一个中间件授权绕过漏洞,导致能够访问以前需要此类授权的页面和路由。
此任务将涵盖一些可用于通过日志和网络流量检测此类攻击发生的技术和规则。
手动
Web 服务器日志可能有助于发现此类漏洞的证据。但这取决于 Web 服务器是否配置为记录 HTTP 标头。例如,NodeJS 允许通过 request.headers['x-middleware-subrequest']
记录此特定的 HTTP 标头。
如果 Web 应用程序使用了代理,则需要修改 Web 服务器(例如 Nginx 或 Apache2)上的日志配置,以记录此特定标头。例如,可以使用 Apache2 中的 LogFormat :
|
|
一旦正确设置了此 HTTP 标头的日志记录,就可以使用 Grep、Yara 等常用工具。
[了解]Snort (v2)
以下 Snort 规则在用作 IDS 时可用于检测 CVE -2025-29927 的发生:
|
|
此规则检查数据包时不考虑任何协议,例如 http_headers
模块。这是因为在撰写本文时, HTTP 标头“x-middleware-request”在 Snort 中尚未被识别 。
首先,我们将 Snort 规则添加到本地规则中。默认情况下,在 Ubuntu 上,它位于 /etc/snort/rules/local.rules
。现在,我们将上面的代码片段粘贴并保存。请注意,如果您已有规则,则需要将 sid
值更改为其他值。
|
|
现在,我们可以运行 Snort 并测试其检测效果。下面的终端以控制台模式运行 Snort,以演示警报触发过程。
|
|
[了解]Zeek
Zeek 为网络流量中的威胁检测提供了更全面的方案。对于 CVE -2025-29927,可以使用以下 Zeek 规则:
|
|
确保此文件以 .zeek
扩展名保存在 Zeek 脚本的配置目录中。您需要修改 local.zeek
文件,通过添加 @load ./cve_2025_29927.zeek
来包含此脚本。
最后,通过 sudo zeekctl deploy
重启 Zeek 以应用配置更改。如果成功,当检测到 CVE -2025-29927 时, Zeek 将会发出警报:
|
|
总结
查看关于发现此漏洞的原始帖子,许多流行应用程序的源代码中仍然潜伏着许多漏洞。对于已修复的版本,用户需要升级到以下版本:
- 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 应用程序。