On December 3, 2025, the React team disclosed CVE-2025-55182, known as React2Shell: unauthenticated remote code execution in React Server Components, rated CVSS 10.0. An attacker could send one crafted HTTP request to a Server Function endpoint, and React's payload decoder would run the attacker's code on your server.
The fix shipped that day. Over the next eight weeks, researchers probing the patch found four more bugs, and two of the patches that followed turned out to be incomplete. If you run the App Router, you patched React at least twice, and the second time caught teams that had closed the ticket.
The timeline
November 29, 2025
Lachlan Davidson reports the RCE through Meta Bug Bounty.December 1
The React team has a fix and starts working with hosting providers and framework maintainers.December 3
React publishes 19.0.1, 19.1.2 and 19.2.1 and discloses CVE-2025-55182.December 3 and 4
Andrew MacPherson reports a source code leak. RyotaK reports a denial of service. Both came from probing the new patch.December 11
React discloses CVE-2025-55183 and CVE-2025-55184, then finds a missed DoS case and discloses CVE-2025-67779 the same day.January 26, 2026
More DoS paths, CVE-2026-23864. React ships 19.0.4, 19.1.5 and 19.2.4 and says the previous patches were incomplete.
React patched the critical bug four days after the report. Teams that upgraded once and moved on stayed exposed to the DoS bugs for weeks.
What each bug does
| CVE | Impact | CVSS |
|---|---|---|
| CVE-2025-55182 | Remote code execution, no auth | 10.0 |
| CVE-2025-55184 | Infinite loop hangs the server | 7.5 |
| CVE-2025-67779 | Infinite loop, a case the first DoS fix missed | 7.5 |
| CVE-2026-23864 | Crashes, out-of-memory or CPU exhaustion | 7.5 |
| CVE-2025-55183 | Returns Server Function source code | 5.3 |
The vulnerable code lives in react-server-dom-webpack, react-server-dom-parcel and react-server-dom-turbopack. Your own package.json may not list them. Next.js, React Router, Waku, @parcel/rsc, @vitejs/plugin-rsc and RedwoodSDK pull them in.
One detail catches people: an app with no Server Functions can still be vulnerable if its framework supports Server Components. The endpoint exists either way. Apps without a server, or without an RSC-capable framework, are safe.
The source leak and your secrets
CVE-2025-55183 lets an attacker read the source of a Server Function that turns an argument into a string, through a template literal or a database write. The advisory's example shows a hardcoded connection string coming back in the response.
"use server";
export async function createUser(name: string) {
// Leaks: a literal in the function body
const conn = db.createConnection("SECRET KEY");
// Safe: read at runtime, not part of the source
const conn2 = db.createConnection(process.env.DB_URL);
return { message: `Hello, ${name}!` };
}
Secrets you read from process.env at runtime stay safe. Secrets written into the source can leak, along with any functions your bundler inlined into the Server Function. The team says to check your production bundle, not your source files. If you find a literal secret there, rotate it.
Patched versions
Use the last line on each branch. Earlier fixes, including 19.0.3, 19.1.4 and 19.2.3, are vulnerable.
| Package | Safe versions |
|---|---|
| react-server-dom-* | 19.0.4, 19.1.5, 19.2.4 |
| next 13.3 to 14.x | 14.2.35 |
| next 15.5.x | 15.5.10 |
| next 16.0.x / 16.1.x | 16.0.11 / 16.1.5 |
Each Next.js 15 minor has its own patch, from 15.0.8 to 15.5.10. The React post lists two different numbers for 15.4, so confirm against the Next.js security blog before you pin. React Native apps are safe. In a monorepo, update only the react-server-dom-* packages. Bumping react there breaks React Native with a version mismatch.
Hosting providers deployed temporary filters. The React team says not to rely on them.
The patch lane
Expect the two-round pattern again. Researchers probe each fresh patch, and the follow-up advisory can land a week later. Build the lane once:
- Inventory. Run
npm ls react-server-dom-webpack react-server-dom-turbopack react-server-dom-parcelin each app in the monorepo, including examples and internal tools. - Branch. Keep framework security bumps out of feature releases, with their own PR template and a same-day deploy path.
- Verify. Check the version running in production, from the built bundle or a version endpoint, not the lockfile on
main. - Re-open. Leave the ticket open for two weeks after a critical patch and watch the advisory for an update banner.
- Rotate. If a CVE exposes source or memory, search the production bundle for literals and rotate what you find.
This week
Run the npm ls command above across your repos and confirm each hit resolves to 19.0.4, 19.1.5 or 19.2.4 or later. Then grep your Server Functions for string literals that look like keys, and move them to environment variables.
Volodymyr Chornous

