The latest Next.js security update dropped on December 11 with two follow‑up vulnerabilities in the React Server Components (RSC) protocol—one High‑severity Denial of Service and one Medium‑severity Source Code Exposure. These land a week after the React2Shell RCE disclosure and require fresh action, even if you already patched on December 3. If you run the App Router in production, this is your weekend work: patch, verify, and reduce exposure before traffic ramps.
What changed in the Dec 11 advisory—and why it matters
Researchers probing the React2Shell fixes found two additional bugs in the RSC protocol. They don’t enable remote code execution like the original React2Shell, but they’re serious in practice:
CVE‑2025‑55184 (High, DoS): a crafted request can trigger an infinite loop during RSC payload deserialization, hanging the server process and starving future requests. The initial fix turned out incomplete; the complete fix is published as a follow‑on under a new CVE identifier. Treat this like a production‑stability emergency, especially behind limited autoscaling budgets.
CVE‑2025‑55183 (Medium, Source Code Exposure): a crafted request can make a Server Function return compiled source of other Server Functions. That can expose logic, and if you inlined secrets in code—versus pulling them from environment variables—the values may appear inside the compiled output depending on bundler settings.
Pages Router apps aren’t impacted functionally by these RSC protocol issues, but if your repository uses shared packages that depend on RSC libraries or you’re mid‑migration, patch anyway to keep dependency trees in a known‑good state.
Which Next.js versions are safe right now
Install the latest patched release in your line. As of December 11:
- 14.x → 14.2.35
- 15.0.x → 15.0.7
- 15.1.x → 15.1.11
- 15.2.x → 15.2.8
- 15.3.x → 15.3.8
- 15.4.x → 15.4.10
- 15.5.x → 15.5.9
- 16.0.x → 16.0.10
- 15.x canary → 15.6.0‑canary.60
- 16.x canary → 16.1.0‑canary.19
For older sites, DoS risk extends back to ≥13.3 when the App Router and RSC landed. If you’re running 13.x in production, prioritize a maintenance window and hop to the latest supported 14.x or the appropriate fixed 15.x/16.x release.
How to apply the Next.js security update (Dec 11)
Here’s a reliable, low‑drama sequence we’ve used on real teams:
- Freeze deploys briefly. Announce a 30–60 minute window. Flip your CI to manual to avoid unattended rollouts while dependencies shift.
- Pin and bump. In your app, update
nextto the exact patched version for your line. If you vendor or explicitly depend on any RSC packages (react-server-dom-webpack,react-server-dom-parcel,react-server-dom-turbopack), bump them to the latest patched pairings too. - Use the helper. Run the vendor‑provided tool to perform deterministic bumps and sanity checks.
Terminal:
npx fix-react2shell-next
Or install directly:
npm install [email protected]
npm install [email protected]
npm install [email protected]
npm install [email protected]
npm install [email protected]
npm install [email protected]
npm install [email protected]
npm install [email protected]
- Rebuild and run smoke tests. Focus on Server Actions/Server Functions and routes that stream RSC payloads. Your goal is to detect accidental behavior changes before traffic hits.
- Verify at runtime. Confirm the resolved versions in production containers:
Runtime check:
npm ls next
npm ls react-server-dom-webpack
- Ship, then watch. Increase metrics resolution for 24 hours: CPU, event loop lag, 5xx rates, and cold start latency. If you use a WAF, temporarily ratelimit anomalous POSTs to Server Function endpoints.
Quick gotchas that bite teams
Monorepos: Don’t let a workspace pull an older RSC package through a transitive dependency. Hoisted lockfiles can lie. Inspect the actual node_modules resolved tree in your production image.
Env secrets: The source‑exposure issue doesn’t leak runtime values fetched from process.env, but bundlers can inline constants. Grep for obvious foot‑guns like API keys or tokens in source files and shared utilities used by Server Functions.
Edge vs Node targets: If you split traffic between edge runtime and Node.js runtime, test both. Some teams only patched their Node function apps and left edge handlers on older canary builds.
“Are we affected if we’re on the Pages Router?”
Not by the RSC protocol itself. But if your repo includes packages that bring in RSC modules (directly or as peers), you can still resolve vulnerable versions in the tree. Also, the DoS variant affects versions of Next.js that include the App Router even if you’re not actively using Server Functions. Upgrade to the patched release line to keep future migrations clean and supply chain risk down.
How the vulnerabilities work (in plain English)
React’s RSC protocol lets clients call functions on the server, serializing arguments and results into a compact wire format. When the server deserializes a maliciously crafted payload, one bug could force an infinite loop (hanging the process) and another could trick the deserializer into returning compiled function code rather than the intended data structure.
The “code leak” sounds terrifying, but two constraints limit damage in most real apps: only the function body is in scope, and secrets that are pulled at runtime from environment variables aren’t inlined. The exception is secrets hardcoded as string literals or config constants that your bundler inlined into the compiled output.
Timeline you can brief leadership on
November 29, 2025: Researcher reports the RCE to the React team via bounty. December 3: React posts the React2Shell advisory with fixed versions. December 11: React discloses the two follow‑up bugs (DoS and Source Code Exposure) and pushes new patched versions; Next.js publishes a downstream advisory with an explicit version matrix and a helper utility. An addendum clarifies the initial DoS fix was incomplete and has a complete follow‑on fix. If you patched right after the first advisory, you likely need to patch again to pick up the complete DoS fix.
A fast response playbook you can run today
Here’s a succinct seven‑step framework we’ve used across SaaS and marketplace stacks:
- Confirm exposure: Inventory where you use the App Router and Server Actions/Functions. Document public endpoints and service boundaries.
- Patch and pin: Move to the exact fixed version in your release line. Commit lockfile changes. Add a CI job that fails builds if
npm ls nextdoesn’t match the fixed list. - Harden ingress: For 72 hours, add WAF rules or rate limits on endpoints that accept RSC payloads. Block obviously malformed payloads and abusive burst patterns.
- Monitor saturation: Add alerts on event loop lag, CPU, and request concurrency. The DoS symptom is a sharp rise in saturation with a flat or falling RPS.
- Forensics and logs: Sample and retain raw request bodies for suspect endpoints (privacy‑safe) for the next week. If logs show repeated malformed RSC frames, escalate.
- Rotate targeted secrets: If your code embeds constants that could have been inlined and exposed, rotate those credentials. You don’t need to rotate all secrets—target the ones plausibly referenced inside Server Functions.
- Prove closure: Capture a screenshot of dependency trees, CI checks, and runtime
npm lsfrom production containers. Put it in your incident notes. Future you will thank you.
People also ask
Is there a workaround if we absolutely can’t upgrade today?
Not a safe one. You can mitigate some risk with aggressive rate limiting and a WAF, but neither addresses the underlying deserialization bugs. Schedule the upgrade.
How do I know if we were hit by the DoS?
Look for synchronized spikes in CPU and event loop lag on your Node.js runtime, elevated 5xx, and logs where requests to RSC endpoints never complete. If you see that pattern, patch first, then evaluate whether it was malicious or incidental.
Could the Source Code Exposure leak our API keys?
Only if you hardcoded them or your build inlined them. Values read from environment variables at runtime are not part of the compiled function body. Still, audit for accidental inlining and rotate anything questionable.
Let’s get practical—your 30‑minute checklist
- Upgrade Next.js to the patched version for your line (14.2.35, 15.0.7, 15.1.11, 15.2.8, 15.3.8, 15.4.10, 15.5.9, or 16.0.10).
- Run the helper: npx fix-react2shell-next. Commit the lockfile.
- Add a CI guardrail that asserts resolved versions match the fixed list.
- Rate limit or shield Server Function endpoints temporarily.
- Watch CPU, event loop lag, and 5xx for 24 hours post‑deploy.
- Rotate any secrets that might be inlined in Server Function code.
What this means for 2026 roadmaps
Here’s the thing: RSC is a powerful capability, and scrutiny was inevitable. The responsible takeaway isn’t to abandon React or Next.js—it’s to treat server‑client serialization code with the same rigor you apply to auth and SQL queries. That means eliminating hardcoded secrets, adopting runtime checks on payload shape, and making “prove the patch” a standard step in your release template. Teams that invest in these habits recover faster the next time a critical CVE hits.
Related guidance and tools
If you’re coordinating a broader response, these playbooks will help:
• Read a practical week‑one plan in our Next.js Security Update: What To Fix This Week and the tactical follow‑ups in What to Patch Now and Next.js Security Update (Dec 11): Fixes, Risks, Plan.
• For the original RCE, see our security roadmaps in React2Shell: Your 14‑Day Patch and Proof Plan and Patch, Verify, Lock Down.
What to do next (by role)
Developers: Patch and verify today. Submit a short PR with version bumps, the CI assertion, and a dashboard snapshot. Add a test that exercises at least one Server Function with non‑trivial arguments to catch regressions.
Engineering managers: Timebox the maintenance window; assign owners for patch, verification, and comms. Ask for a one‑page post‑patch note with evidence and any rotated credentials.
Business leaders: Approve the window and communicate that it’s preventative maintenance tied to a documented CVE sequence. This isn’t feature work; it’s reliability insurance.
Zooming out
Security advisories like this follow a pattern: an initial critical release, then a wave of adjacent fixes as researchers grind on the patch edges. The right move is to build muscle memory around patch velocity and verification—not to panic or freeze. With the version matrix above, the helper command, and a short checklist, you can close this out before the next deploy train.
If you’d like help formalizing your security patch playbook, our team documents, tests, and automates these flows for clients. See how we work on what we do, explore recent projects, or contact us for a quick assessment.
