React2Shell is the kind of security event that keeps shipping teams up at night: a pre‑auth Remote Code Execution in the React Server Components protocol with downstream impact across frameworks. As of December 17, 2025, there have been multiple updates, an incomplete fix, and specific version targets for React and Next.js. If you run the App Router, this is priority one. Here’s what changed and how to lock it down this week.
What happened — and what changed since December 3
On December 3, the React team disclosed a CVSS 10.0 vulnerability in React Server Components (CVE‑2025‑55182) that enables unauthenticated RCE by abusing the way RSC decodes payloads. The issue affected the RSC implementations in react-server-dom-* packages and was initially patched with 19.0.1, 19.1.2, and 19.2.1. If your app uses RSC, you were in scope even without explicit Server Functions. (react.dev)
Next.js followed with a downstream advisory tracking the RSC issue as CVE‑2025‑66478 and released an npx fix-react2shell-next utility to deterministically bump to patched lines. They also advised rotating secrets if your app was online and unpatched as of December 4, 2025 at 1:00 PM PT. (nextjs.org)
React2Shell follow‑ups: DoS, source leak, and an incomplete fix
Here’s the thing: the December 3 patches weren’t the end. On December 11, the React team disclosed two additional vulnerabilities in RSC found while researchers probed the original fix: a high‑severity DoS (CVE‑2025‑55184, later completed as CVE‑2025‑67779) and a medium‑severity source code exposure (CVE‑2025‑55183). The upshot: if you patched promptly after Dec 3, you likely had to patch again. React backported complete fixes to 19.0.3, 19.1.4, and 19.2.3; Next.js published updated guidance and fixed versions across 14.x–16.x lines. (react.dev)
Concretely, for Next.js App Router apps, the safe targets include 14.2.35 (for 13.3+ and 14.x), and for 15.x/16.x the specific fixed versions such as 15.0.7, 15.1.11, 15.2.8, 15.3.8, 15.4.10, 15.5.9, and 16.0.10, with matching canary builds for those staying on PPR canaries. If you’re on 14.3.0‑canary.77 or later canaries, the recommendation is to downgrade to stable 14.x or jump to the fixed canary. (nextjs.org)
Is React2Shell being exploited right now?
Yes, and defenders are seeing a familiar playbook. Microsoft reports exploitation attempts beginning December 5, including coin‑miner drops, reverse shells, and credential harvesting across Windows and Linux. Attackers are scanning for vulnerable RSC endpoints, then pulling down payloads, adding users, modifying authorized_keys, and trying cloud instance metadata endpoints for tokens. You’ll also see secret discovery tooling like TruffleHog and Gitleaks in the mix. If you were exposed before patching, assume secrets are compromised and rotate. (microsoft.com)
React2Shell: the minimum you must know
Let’s zoom in on the core facts that should drive your decisions:
- Primary risk: pre‑auth RCE via RSC payload decoding in unpatched environments (CVE‑2025‑55182).
- Follow‑ups: High‑severity DoS and medium‑severity source exposure; the initial DoS fix was incomplete and replaced by a complete fix (CVE‑2025‑67779). (react.dev)
- Scope: Next.js App Router apps using React 19 RSC; Pages Router apps and Edge Runtime aren’t affected by the RCE advisory but should still update to the safe lines recommended by Next.js. (nextjs.org)
React2Shell action plan (48‑hour patch‑and‑proof)
Below is a practical, time‑boxed plan we’ve used to help teams stabilize quickly without losing the audit thread.
Hour 0–6: Identify exposure and stop the bleeding
Inventory which apps actually use RSC in production. Confirm by checking dependencies for any of:
react-server-dom-webpack,react-server-dom-parcel,react-server-dom-turbopacknextwith App Router enabled
Snapshot your current state:
- Create a one‑pager per service: public URL(s), environment(s), current Next.js and RSC package versions, and last deploy SHA.
- Pull the last 14 days of logs for POSTs to Server Function endpoints; preserve them to immutable storage.
- If you run WAF/edge rules, enable temporary blocks for obviously malformed RSC payloads until you redeploy.
Hour 6–18: Patch to known‑good versions
For React packages, move to 19.0.3, 19.1.4, or 19.2.3 depending on your track. For Next.js App Router apps, target the fixed versions in your line: for 14.x use 14.2.35; for 15.x/16.x use the exact versions listed in the Dec 11 advisory. If you’re on PPR canaries, use the matching canary fixes. (react.dev)
Practical commands that won’t surprise CI:
npx fix-react2shell-nextto audit and bump Next.js deterministically on supported lines.npm i -E react@latest react-dom@latestalongside the updatedreact-server-dom-*packages if you’re not on Next.js but still using RSC.- Rebuild images with a clean lockfile; avoid partial lockfile edits that can drift between environments.
Redeploy, then smoke test server functions and critical routes. Verify the resolved versions at runtime: print process.versions for Node and require.resolve paths for next and RSC packages to confirm the right artifacts are loaded in prod.
Hour 18–30: Rotate and re‑issue
If you were online and unpatched during the window identified by the Next.js team (before Dec 4, 1:00 PM PT), rotate infrastructure and application secrets now. Prioritize cloud credentials, OAuth client secrets, webhook signing keys, and any tokens exposed to server‑side code paths processing RSC payloads. Update env management, redeploy, and invalidate caches/CDN if your app relies on signed URLs. Document each rotation with timestamps and approvers for audit traceability. (nextjs.org)
Hour 30–48: Hunt, clean, and prove
Search for suspicious POSTs hitting Server Function endpoints. Flag spikes around December 5 onward. Hunt for:
- Outbound calls to
*.trycloudflare.comor unusual pastebins. - New local users, modified
authorized_keys, or unfamiliar systemd services. - Coin‑miner processes (e.g.,
xmrig) or high CPU anomalies aligned with traffic bursts. - Secrets access anomalies: requests to cloud instance metadata endpoints (IMDS) and sudden spikes in 4xx from KMS, Vault, or Secrets Manager. (microsoft.com)
For proof, generate a change dossier per service that includes: version before/after, deploy times, the exact CVEs addressed, and links to immutable CI artifacts. This is the package you hand to auditors and incident reviewers.
“People also ask” — quick answers we keep sending
Are Pages Router apps affected?
Pages Router apps aren’t in scope for the RCE advisory and the RSC protocol issues tracked in CVE‑2025‑66478, but the Next.js team still recommends upgrading to the safe version lines to stay aligned with the hardened RSC runtime and future backports. (nextjs.org)
Do Edge Runtime apps need to patch for React2Shell?
No for the core RCE and follow‑ups; the affected path is the Node‑hosted RSC server function pipeline. Still, keep Edge environments current to minimize drift and unexpected coupling with server‑rendered routes. (nextjs.org)
We patched on December 4. Why did we have to patch again?
Because probing a critical fix often uncovers variant issues. On Dec 11, React disclosed a DoS and a source code exposure in adjacent code paths, and the initial DoS fix was incomplete—finished under CVE‑2025‑67779—so teams needed an additional bump to the fully fixed builds. (react.dev)
What’s the risk if we don’t rotate secrets?
If an attacker reached RCE on your server during the exposure window, they could have read environment variables, pulled instance metadata, or scraped config files. Missing a rotation leaves that door open even after you patch.
Deployment realities that trip teams up
A few patterns I’ve seen this month: first, partial lockfile bumps. Developers update next but forget react-server-dom-* versions pinned transitively by the bundler or a framework plugin. Second, canary drift. Canary builds enabled for PPR stick around long after the experiment, then miss stable backports. If you must stay on canary, use the explicitly fixed canaries; otherwise, move to 14.2.35 or the named 15.x/16.x targets.
Third, environment skew. Your staging uses Node 22 with a patched OpenSSL, but production is still on 20.x with a different glibc baseline. That can mask runtime differences in how the RSC payload is handled, especially under pressure. Make runtime parity an explicit gate.
Data you can bring to leadership
Executives want three things: impact, exposure window, and residual risk. Give them this:
- Impact: Pre‑auth RCE in RSC (CVE‑2025‑55182) plus high‑severity DoS and medium code exposure follow‑ups; complete DoS fix tracked as CVE‑2025‑67779. (react.dev)
- Exposure window: Your app’s last unpatched deploy date/time through the patched redeploy timestamp; if online and unpatched as of Dec 4, 1:00 PM PT, treat secrets as compromised and rotated. (nextjs.org)
- Residual risk: Post‑exploitation hunting results; confirmation of version pins; proof of secret rotation; and WAF/edge mitigations in place.
Don’t ignore Node.js releases on December 18
Separately from React2Shell, Node.js has security releases slated around Thursday, December 18, 2025 across supported lines (20.x, 22.x, and others). If you’re doing emergency deploys this week anyway, plan a Node bump window so you don’t re‑roll base images twice. Our Node.js Dec 18 runbook breaks down a safe patch path for production fleets. (nodejs.org)
What safe looks like (this week)
Here’s a quick baseline you can compare against. Your App Router services should meet all of the following:
- React RSC packages at 19.0.3, 19.1.4, or 19.2.3; no lingering 19.0.1/19.1.2/19.2.1 builds.
- Next.js on 14.2.35 (13.3+/14.x) or the exact 15.x/16.x fixed versions; canary users on the declared fixed canaries. (nextjs.org)
- Secrets rotated if exposed during the online/unpatched window; evidence stored and linked to change tickets. (nextjs.org)
- Threat hunting completed with findings documented; forensic logs preserved.
- Lockfile and CI/CD attestations present in a single change dossier per service, ready for audit.
What to do next
For developers and SREs:
- Run
npx fix-react2shell-nextand bump to the exact fixed lines; redeploy and verify fingerprints. - Upgrade RSC packages to the fully fixed React versions and rebuild containers from scratch.
- Rotate secrets and roll keys; confirm no hardcoded secrets exist in server functions.
- Harden: add WAF rules for malformed RSC payloads, block suspicious egress, and add alerting for IMDS access.
For engineering leaders:
- Ask for the per‑service change dossier (before/after versions, deploy times, CVEs closed, secrets rotated).
- Schedule a follow‑up Node.js patch window aligned with the December 18 releases.
- Fund a short “design for secure RSC” review: no hardcoded secrets, explicit input validation at server function boundaries, and a plan to pin and monitor transitive dependencies.
Related guidance from us
If you want a deeper operational checklist, use our Patch, Prove, and Monitor checklist, our Next.js patch‑again‑after‑Dec‑11 guidance, and the earlier 10‑day patch and proof plan to keep your team moving without losing the audit trail.
Bottom line on React2Shell
React2Shell isn’t done until you’ve 1) moved to the fully fixed React RSC and Next.js versions, 2) rotated secrets if you were online and unpatched during the exposure window, and 3) preserved evidence of both. Do those three, plus a short hunting pass, and you’ll be in a defensible place—without turning this into a never‑ending fire drill. If you need help, our application security services team can plug in quickly and leave you with clean version pins, rotated keys, and tidy proof for your board.
