The React2Shell vulnerability (CVE‑2025‑55182) is a pre‑authentication RCE in React Server Components with a CVSS of 10.0. If you host React 19 apps with Server Components—or frameworks that implement them like Next.js App Router—you must assume exposure and move fast. Patches were shipped on December 3 with follow‑ups the next week, and exploitation has been observed in the wild. This guide lays out a 72‑hour, business‑friendly plan to patch, prove, and protect—without torpedoing uptime during a holiday change freeze. (react.dev)
What is the React2Shell vulnerability (CVE‑2025‑55182)?
React Server Components (RSC) use the Flight protocol to serialize component trees and server actions. The bug lives in how server‑side packages deserialize attacker‑controlled payloads. In vulnerable versions (React 19.0, 19.1.0, 19.1.1, 19.2.0), an unauthenticated request can coerce the server into executing arbitrary code. Upgrading react-server-dom‑webpack, react-server-dom‑parcel, or react-server-dom‑turbopack to fixed versions—19.0.1, 19.1.2, or 19.2.1—closes the RCE. (react.dev)
Disclosure timeline matters: reported November 29, 2025; fix published and advisory posted December 3; public PoCs followed within ~30 hours; exploitation attempts were seen from December 5 onward. That’s why you’re seeing coin miners and RATs pop up in incident queues this week. (react.dev)
Does Next.js need a separate fix?
Yes. Next.js tracks the RSC issue under CVE‑2025‑66478 (later merged upstream) and provides a one‑command helper: npx fix-react2shell-next. If your app was online and unpatched as of December 4, 2025 at 1:00 PM PT, rotate critical secrets immediately; session stores and service tokens are fair game if an attacker achieved RCE. (nextjs.org)
There’s more: on December 11, researchers found two additional RSC issues—DoS and source disclosure—that don’t enable RCE but still warrant patching. An addendum later corrected an incomplete DoS fix (tracked as CVE‑2025‑67779). If you patched promptly for React2Shell, you likely need a second update to the latest React 19.x point releases. (react.dev)
How bad is exploitation right now?
Defenders have confirmed real‑world exploitation across Linux and Windows servers, with reliable PoCs and opportunistic scanning. Post‑exploitation payloads include miners and remote access trojans such as EtherRAT; some campaigns use Cloudflare tunnel endpoints for staging and persistence tricks. If you see suspicious outbound to trycloudflare.com or sudden CPU spikes, investigate immediately. (microsoft.com)
Your 72‑hour React2Shell response plan
Here’s the thing: teams get stuck debating fringe edge cases while attackers spray the internet. Don’t. Run this plan in three waves—Patch, Prove, Protect.
Wave 1 (Hours 0–12): Patch the blast radius
Inventory first. For each service behind a public URL or API gateway, answer:
- Does it run React 19 with Server Components? Look for
react-server-dom-*packages,server actions, or an App Router in Next.js. - Is it reachable from the internet? Private services behind service meshes can still be exposed via misconfigured ingress.
- Which deployment artifact includes the vulnerable code: Node.js container image, serverless bundle, or an edge function?
Then patch by lane:
- React RSC directly: upgrade to 19.0.1, 19.1.2, or 19.2.1 for RCE; then move to the latest 19.x for the DoS/source‑exposure fixes (19.0.3/19.1.4/19.2.3 or newer). (react.dev)
- Next.js (App Router): run
npx fix-react2shell-next, confirmnextmatches the patched release guidance in the advisory, and redeploy. (nextjs.org) - Other frameworks/bundlers adopting RSC (React Router, Waku, Parcel RSC, Vite RSC plugins): follow the React advisory and your vendor’s security notes. (react.dev)
Operational tips that save hours:
- Don’t chase full monorepo upgrades if you’re on React Native or mixed stacks; the React team notes you can update only the impacted server‑side RSC packages to avoid version mismatch errors with
react/react-dom. (react.dev) - Pin with intent. Add
overridesinpackage.jsonto force patch versions across workspaces, and rebuild lockfiles in CI. - Ship under a change freeze using a pre‑approved emergency path. Scope the diff to dependency bumps and a single config toggle if your WAF rule rollout is separate.
Wave 2 (Hours 12–36): Prove you’re safe
Patching without evidence isn’t enough. You need proofs—of version, exploitability, and exposure.
- Version proofs: in CI, add a step that runs
npm ls react-server-dom-webpack(or the relevant RSC package), greps for the fixed versions, and stamps the build metadata. Store as an artifact. - Exploitability proofs: build a canary route in staging with a known benign payload shaped like the public PoCs. It should fail cleanly now and not reach the Node.js runtime. Keep the payload out of logs.
- Exposure proofs: generate a per‑service matrix of external URLs, WAF policies, and ingress rules. Many orgs realize mid‑incident that “internal” preview deployments were internet‑facing.
- Secret hygiene: if a Next.js or RSC service was online and unpatched past December 4, 2025 1:00 PM PT, rotate your most sensitive secrets—DB creds, session keys, cloud tokens—and invalidate long‑lived refresh tokens. (nextjs.org)
Wave 3 (Hours 36–72): Protect for the long tail
Once you’re on patched bits, assume you’ll see copycat DoS and data‑exposure attempts for weeks.
- Update again: if you patched early, move to the latest React 19.x point release that includes the corrected DoS fix (the initial DoS patch was incomplete and required CVE‑2025‑67779 to finish the job). (react.dev)
- Harden deserialization surfaces: add request size/time limits at the CDN and origin, and narrow content types for RSC endpoints.
- Detections: watch for suspicious child process spawns from the Node.js runtime, outbound to
trycloudflare.com, unusual SSH key file changes, and bursty CPU tied to a single PID—behaviors seen in observed attacks. (microsoft.com) - Threat modeling: flag any service that accepts serialized input for deeper review. Today it’s RSC; tomorrow it’s another serializer with a different acronym.
People also ask: Are React apps without a server affected?
No—pure client‑only React apps aren’t impacted. The risk comes from the server‑side packages that parse RSC payloads. If you don’t run server actions, don’t use frameworks that add RSC on the server, and don’t deploy server‑side RSC packages, you’re out of scope. Verify by checking for react-server-dom-* in your production bundle, lockfile, or container image. (react.dev)
People also ask: Do I need to patch twice?
Probably. The December 3 patches address the RCE. On December 11, the React and Next.js teams disclosed additional non‑RCE issues (DoS and source code exposure) and subsequently issued a corrected DoS fix. If you updated in the first week, update again to the latest React 19.x and Next.js guidance. (react.dev)
People also ask: What about Node.js security releases?
Separate from React2Shell, the Node.js project signaled December security releases but pushed them to January 7, 2026. That’s good in one sense: you won’t juggle Node core patches during the holiday freeze. Still, track the advisory and be ready to roll patches across 25.x, 24.x, 22.x, and 20.x lines in early January. (nodejs.org)
A practical checklist you can copy into your runbook
1) Confirm exposure
For every public hostname, list the backing service and whether it uses RSC. Add a yes/no column for App Router in Next.js. Build once, reuse forever.
2) Pin patched versions
Use workspace‑wide overrides to force patched RSC and Next.js versions, regenerate lockfiles, and block merges that reintroduce vulnerable ranges.
3) Automate a smoke test
Add a healthcheck that calls a harmless, RSC‑shaped payload to prove deserialization isn’t executing code. Alert on any regression.
4) Rotate high‑value secrets
If a service was online and unpatched after December 4, rotate your crown jewels (database, queues, payment processor keys) and invalidate long‑lived tokens. (nextjs.org)
5) Instrument detections
Flag Node processes spawning shells, curl/wget to unfamiliar hosts, or creating new OS users. These were observed in real intrusions tied to this CVE. (microsoft.com)
6) Communicate the freeze exception
Document the exact diff, your rollback plan, and the risk if you don’t patch. Executives sign off faster when you quantify both paths.
Data you can take to leadership
Dates and versions anchor decisions:
- Reported: November 29, 2025. Disclosed/fixed: December 3, 2025. Reliable PoCs and exploitation began within days. (react.dev)
- RCE fixed in React 19.0.1, 19.1.2, 19.2.1; additional DoS/source disclosure issues disclosed December 11; corrected DoS fix released as CVE‑2025‑67779 with newer patch levels. (react.dev)
- Next.js advisory published December 3 with CLI helper and secret rotation guidance. (nextjs.org)
- Microsoft and others observed hundreds of compromises across organizations; payloads include EtherRAT, miners, and common persistence tactics. (microsoft.com)
- Node.js December security releases deferred to January 7, 2026—plan patch windows accordingly. (nodejs.org)
Why teams trip over this patch—and how to avoid it
First, RSC sits in a gray zone between framework and app code. Some teams don’t realize their framework pulled in server‑side RSC packages. Second, monorepos mask version drift; a single workspace might be pinned differently. Third, app teams patch fast but miss secrets or canary environments where attackers pivoted.
Here’s how we’ve kept clients calm and shipping:
- One page of truth: a short, live doc listing every public service, its RSC status, the exact patched version, and the date you verified it. It becomes your audit trail.
- “Patch, then prove” culture: don’t stop at
npm install. You need version proofs, exploitability tests, and exposure mapping. - Guardrails in CI: reject merges that introduce vulnerable ranges to any workspace; run
npm lschecks and a quick synthetic RSC payload test.
Zooming out: what React2Shell teaches about server‑driven UI
RSC is powerful because it collapses the client‑server gap. That also collapses blast radius if the serializer is flawed. The lesson isn’t “avoid RSC”—it’s that server‑edge serialization needs the same paranoia we apply to file parsers and templating engines. Put traffic limits in front, validate more at the edge, and keep the deserializer small and auditable.
What to do next
- Today: ship the patches and capture proofs. If you’re on Next.js, run the CLI fixer and redeploy.
- Within 48 hours: rotate critical secrets if you were exposed past December 4, and enable targeted detections for Node child processes and suspicious outbound. (nextjs.org)
- Within a week: close out the DoS/source‑exposure fixes, and schedule the Node.js January 7 security release window now so it doesn’t blindside you. (react.dev)
Need a hand under a freeze?
We’ve been in the trenches rolling hotfixes for RCEs without customer‑visible impact. If you want a two‑day “patch and prove” engagement, start with our security services overview and reach out via contact. If you’re managing Next.js at scale, our guide on patching and proving Next.js updates pairs well with this plan. For Node planning around early January’s releases, lean on our Node.js 72‑hour patch plan playbook. Prefer to read more first? Our blog has additional checklists and incident notes.
React2Shell has been a stress test for how your org handles server‑side JavaScript risk. Use this week to patch decisively, prove exposure is closed, and harden the interfaces that make server‑driven UI possible. You’ll sleep better through the break—and you’ll be ready for whatever the first patch Tuesday of 2026 brings.