CVE-2025-55184: The Next.js Infinite Loop DoS Hidden in the React2Shell Patch
CVE-2025-55184 landed in the same Next.js versions that fixed React2Shell. One crafted request triggers an infinite loop that hangs your server — no crash, no error, just silence.
Yumi Hirasako
Security Researcher
You got the alert about React2Shell. You read the advisory. You ran npm install next@latest, saw a newer version number in your terminal, and considered the problem solved.
That was the right instinct. But the version you landed on might have shipped with CVE-2025-55184 — a denial of service bug tucked inside the fix itself.
One crafted request. An infinite loop starts. Your server doesn't crash with a 500. It just stops answering. Requests pile up. Memory climbs. From the outside, your app looks alive. From the inside, it's frozen.
The patch that shipped a new problem
When React2Shell (CVE-2025-55182) was disclosed, the Next.js team moved fast. A fix landed quickly, developers updated, and most people moved on.
The problem is that moving fast on a patch sometimes means the patch introduces new surface area. CVE-2025-55184 was found in the versions released to address React2Shell — not in the original vulnerable code, but in the new request-handling logic added to close the RCE.
This is a pattern security researchers call a patch bypass. You're not dealing with two independent bugs. You're dealing with a fix that solved one problem and created another. Developers who updated exactly once to escape the CVSS 10 RCE landed in a window where a DoS attack was possible.
The CVE timeline looks roughly like this: React2Shell disclosed, patch released, CVE-2025-55184 found in the patch, second fix required. If you updated between those two points, you were exposed to the DoS.
What actually happens when this fires
CVE-2025-55184 triggers an infinite loop in the App Router request handling path.
Here's what makes it particularly annoying: Node.js is single-threaded. When something blocks the event loop — like an infinite loop — the runtime can't context-switch away to handle other work. Every request in the queue waits. New requests can't even enter the queue. The process is alive, consuming CPU, and completely useless.
On a managed platform like Vercel, the function timeout eventually kicks in and kills the instance. That's cold comfort when your app has been unresponsive for 30 seconds and the attacker just keeps sending the crafted request to keep resetting the clock.
On a self-hosted Node.js deployment — a VPS, a Railway service, a container — the process hangs indefinitely. You won't see a crash. You won't see a 5xx in your logs. You'll see requests queuing and memory climbing until someone notices and restarts the process. Meanwhile your users see a loading spinner going nowhere.
This is what makes DoS vulnerabilities underestimated. A crash is obvious. A silent hang is not.
There's no authentication required to trigger it. The crafted request hits an App Router route. That's the full requirement. If your app is publicly accessible, the attack surface is your entire domain.
Which versions are affected
If you updated Next.js to escape React2Shell but haven't checked since, verify where you landed.
| Version line | Affected range | Safe from |
|---|---|---|
| Next.js 14.x | Post-React2Shell patch, before 14.2.35 | 14.2.35+ |
| Next.js 15.x | Post-React2Shell patch, before 15.2.4 | 15.2.4+ |
Check your current version with:
# See exactly what version is installed
npm list nextIf your output shows something like next@15.2.2 or next@14.2.33, you're in the affected range.
If you want to check your full dependency surface — not just Next.js, but all packages with known CVEs — Data Hogo does that automatically. Free scan, no card needed.
The fix
Straightforward. Update to a safe version and verify.
# Update to the fixed version
npm install next@15.2.4 # or 14.2.35 for the 14.x lineThen confirm the installed version:
# Verify the update landed
npm list nextAlso check your package.json to make sure nothing is pinning you to a vulnerable range:
{
"dependencies": {
"next": "15.2.2"
}
}A pinned version like "15.2.2" won't update automatically. Change it to "^15.2.4" or just run npm install next@latest if you're comfortable taking the latest release.
One more thing: if you run multiple services or have a monorepo, check each one. It's easy to update the main app and forget about a companion service running an older lockfile.
Why vibe coders are hit harder
The typical vibe coding workflow — scaffold with AI, deploy, move on — leaves a specific gap around dependency maintenance.
When you ship fast and don't revisit the project, your package.json becomes a snapshot of the day you shipped. That's fine for a weekend side project. It's not fine for anything taking real traffic.
CVE-2025-55184 is a good example of why you can't treat "updated to fix X" as "done with security." You patched a CVSS 10 RCE. The follow-on DoS came in the same version window. Both require attention.
The update cadence that actually keeps you safe looks like this: update when a CVE drops, then check again one week later, then follow the changelog for the next minor release. That's three steps that most developers skip after step one.
If your app runs on Next.js App Router and uses Server Functions — which most AI-generated Next.js apps do, because the docs recommend them — you're in the affected population for both CVE-2025-55182 and CVE-2025-55184. Not because you did anything wrong. Because the framework you trust had two bugs in consecutive patches.
TL;DR
- CVE-2025-55184 is a denial of service vulnerability introduced in the Next.js versions that patched React2Shell (CVE-2025-55182).
- A crafted HTTP request triggers an infinite loop, blocking the Node.js event loop and making your app unresponsive to all requests.
- The server doesn't crash — it just hangs silently until restarted.
- Affected: Next.js 14.x before 14.2.35, Next.js 15.x before 15.2.4.
- Fix:
npm install next@15.2.4(ornext@14.2.35on the 14.x line), then verify withnpm list next. - If you updated once for React2Shell and didn't check again, check now — you may have landed in the vulnerable window.
- Run a free scan on Data Hogo to catch this and other CVEs in your dependency tree automatically.
Related Posts
CVE-2025-55183: When Your Next.js Server Function Returns Its Own Source Code
A crafted request made Next.js Server Functions return their source code in the HTTP response. If you hardcoded an API key — even just for testing — it was readable.
CVE-2025-67779: The Next.js DoS Fix That Needed a Fix
The first patch for CVE-2025-55184 was incomplete. CVE-2025-67779 is the fix for the fix. If you updated Next.js once after React2Shell, there's a chance you're still exposed.
React2Shell: The Critical Vulnerability That Hit Every Next.js App Router Project
CVE-2025-55182 let attackers run arbitrary code on your server with a single HTTP request — CVSS 10. If you use Next.js App Router with Server Actions, check your version now.