Skip to content
RESEARCH INDEX BREACHROAD / INTELLIGENCE NOTE

React2Shell CVE-2025-55182: critical RSC RCE

CVE-2025-55182 React2Shell is a CVSS 10.0 unauthenticated RCE. Affected React and Next.js versions, public PoC, attacks and patches.

PUBLIC RESEARCH
AUTHOR
/ Penetration Tester (OSCP, PNPT)
PUBLISHED
3 December 2025
READING TIME
22 min read
TOPIC
Critical Vulnerabilities
React2Shell CVE-2025-55182: critical RSC RCE

CVE-2025-55182, known as React2Shell, is a critical React Server Components vulnerability rated CVSS 10.0. A crafted unauthenticated HTTP request can execute server-side code while React Flight data is decoded. The flaw affects selected React 19 releases of react-server-dom-webpack, react-server-dom-parcel and react-server-dom-turbopack, plus frameworks embedding those packages—most notably Next.js.

Act immediately: upgrade vulnerable RSC packages to 19.0.1, 19.1.2, 19.2.1 or a later safe branch release, and move Next.js to a current fixed version. Audit indirect dependencies, built images, deployment caches and serverless revisions. Google confirmed broad exploitation by financially motivated and espionage actors.

Confirmed React2Shell facts

AttributeValue
CVECVE-2025-55182
NameReact2Shell
CVSS 3.x10.0 — critical
Affected packagesreact-server-dom-webpack, -parcel, -turbopack
Vulnerable versions19.0.0, 19.1.0, 19.1.1 and 19.2.0
Initial fixed versions19.0.1, 19.1.2, 19.2.1
Accessremote, unauthenticated, no user interaction
Impactcode execution with application-server process privileges
Public PoCsyes, multiple implementations and research projects
Exploitationbroad campaigns observed shortly after disclosure

The React Team published its advisory on 3 December 2025 and warned that an application may be vulnerable even when it defines no custom React Server Functions; framework support for React Server Components may be enough.

How the React Flight flaw works

React Server Components use the Flight format to exchange references to components, modules and data. The server decodes multipart requests and resolves references pointing into other model chunks.

In affected releases, reference-path resolution could traverse object properties without sufficiently limiting access to owned fields. Controlled data could construct an object behaving like an internal chunk/thenable and guide deserialization toward a code-execution function. The dangerous operation happened before the framework effectively validated the action identifier.

Defenders need to know that:

  • exploitation occurs during server-side request deserialization;
  • no valid business action or user account is required;
  • the presence of affected RSC packages on a live path may create exposure;
  • this is a server vulnerability, not ordinary browser-only React code;
  • Next.js App Router is important but not the only affected use case.

Not every React site is vulnerable. A static SPA with no server components and no vulnerable server package lacks this path.

Next.js and transitive dependencies

Next.js embeds React Server Components, so the issue was initially also tracked as CVE-2025-66478 before being marked a duplicate. Next.js fixed-version guidance evolved with later security updates. Use the current Next.js advisory and a supported branch rather than a version list copied from an old news story.

Inventory must include:

  • package-lock.json, pnpm-lock.yaml, yarn.lock and monorepos;
  • Next.js standalone artefacts and container layers;
  • serverless and edge functions with separate deployment cycles;
  • preview deployments and old PaaS revisions;
  • framework dependencies bringing RSC transitively;
  • build cache, golden images and disaster-recovery environments.

Changing package.json does not patch an already-built image. Rebuild, redeploy and remove old replicas.

Public PoC and fake exploit risk

The freeqaz/react2shell repository provides analysis, a vulnerable lab server, detection tooling and a comparison of public PoCs. It is offensive code and belongs only in an isolated lab or authorised test.

Google Threat Intelligence Group warned that many non-functional, AI-generated and malicious repositories circulated after disclosure. Some fake PoCs delivered malware to researchers. Therefore:

  1. prefer repositories referenced by established research teams;
  2. inspect commit history, author, dependencies and install scripts;
  3. run code without credentials on a disposable host detached from corporate networks;
  4. never submit real production addresses to untrusted scanners;
  5. base production decisions on SBOM and version evidence, not RCE proof.

Updating React and Next.js

React’s initial fixed versions were 19.0.1, 19.1.2 and 19.2.1. Additional denial-of-service and source-exposure issues were later found in the same packages, so deploy the latest fixed version in the selected branch, not merely the earliest React2Shell patch.

The process is:

  1. locate all three react-server-dom-* variants and dependent frameworks;
  2. update lockfiles on a controlled branch;
  3. run functional and security tests;
  4. perform a clean rebuild without old cache;
  5. sign and deploy the new image or artefact;
  6. remove old revisions and invalidate preview deployments;
  7. confirm the running version from runtime/SBOM evidence, not repository intent.

A WAF may temporarily block known request patterns but is not a complete fix. Google and other providers deployed protective rules, yet payload variation and encoding reduce signature certainty.

Confirmed post-disclosure campaigns

GTIG observed broad exploitation from 5 December 2025. Actors deployed XMRig miners, the MINOCAT tunneller, SNOWLIGHT downloader, and HISONIC and COMPOOD backdoors. Google linked some activity to China-nexus espionage clusters and also observed financially motivated and Iran-nexus operations.

The diversity shows why one IOC is insufficient. React2Shell became a general initial-access vector whose final payload depended on the operator.

Detection and threat hunting

Review:

  • unusual multipart requests and Server Action-related headers;
  • increased 500/303 responses and App Router path anomalies;
  • Node.js child processes: shells, curl, wget, interpreters and system tools;
  • outbound DNS/HTTP from application servers to new domains;
  • hidden directories, new systemd services, cron and shell-profile changes;
  • cryptominers and sudden CPU load;
  • application files changed after deployment and unknown npm packages;
  • new keys, tokens and CI/CD secrets used from unusual locations.

If Node launched a command, isolate the workload, preserve its image and logs, rotate every environment secret and examine the build/deployment platform. Rebuild from clean dependencies and a signed artefact.

The broader AppSec lesson

A modern frontend framework can be a full application server with its own RPC and deserialization protocol. SCA must cover runtime dependencies, while web application penetration testing should examine framework paths, not only business endpoints documented by the team. Combine SBOM, automated updates, preview testing and server-process monitoring.

Root cause and attack-surface boundaries

The confirmed weakness is in server-side React Flight decoding within affected react-server-dom-* packages. Impact occurs before application authentication, so user login, MFA and correct business-endpoint authorisation do not remove the flaw. Code runs with the Node or serverless process privileges; blast radius depends on that process’s secrets, filesystem, egress and cloud role.

Attack surface is not equivalent to every site using React. Establish whether the deployment runs server-side RSC and whether an affected package is on the active path. Include:

  • public Next.js App Router applications;
  • internal and preview applications behind SSO or VPN;
  • serverless, edge and regional function copies;
  • old revisions still receiving traffic;
  • DR and autoscaling images;
  • monorepos where one lockfile feeds several services;
  • platforms and frameworks bringing RSC transitively.

A static browser-only frontend without server RSC does not have this path. Conversely, absence of custom Server Functions is not sufficient exclusion, as the React advisory explains.

Safe exposure validation

There is no need to exploit production. Build a consistent evidence chain:

  1. generate an SBOM and dependency tree from the lockfile for the specific artefact;
  2. identify the framework and build containing the affected package;
  3. map active revisions, functions, Regions, previews and DR;
  4. confirm that the artefact handles server-side RSC;
  5. obtain the image digest or deployment identifier of each running replica;
  6. compare with current React and framework advisories;
  7. reserve dynamic testing for a disposable local lab without credentials.

Connect this process to CycloneDX/SPDX SBOM and VEX and container-image security. A repository scan is insufficient when production runs an older layer. Likewise, a clean workspace does not exclude an affected package bundled into a standalone artefact.

Telemetry and triage from request to workload

Google documented several tool families used after initial access. Do not base detection only on their names or hashes. Correlate behaviour:

LayerEvidenceTriage question
CDN/WAFrequest ID, method, content type, headers and statusdid it reach an origin, and which Region?
applicationroute, stack trace, 500/303 and deployment IDdid the RSC decoder process the request?
runtimeNode parent/child, command line, user and hashdid the application launch an unusual child?
container/serverlessimage digest, revision, cold start and file writewhich artefact and instance were active?
networkDNS, HTTP egress and new destinationdid outbound communication follow the request?
identity/cloudrole, token and secret usedid access expand beyond the application?
CI/CDbuild, signer, provenance and deployment actorwas the supply chain changed afterwards?

Triage first identifies the running artefact and timeline. It then links request ID to application event, child process, egress and cloud-identity use. A 500 response has many benign causes and is not exploitation proof. An unexplained child process under Node is high-value evidence even without a known indicator.

Maintain these analytics through a detection engineering and Sigma lifecycle, with regression fixtures for legitimate App Router errors and controlled canary events.

React2Shell decision tree

Does the artefact contain an affected react-server-dom-* release?

  • No: preserve SBOM and lockfile evidence for the running deployment and monitor later advisories.
  • Yes or unknown: prioritise update and establish whether server-side RSC is active.

Was the vulnerable artefact reachable from the Internet or a low-trust network?

  • Yes: hunt requests, processes, filesystem, egress, secrets and cloud activity from the exposure start.
  • No: patch anyway and prove the network control; phishing, SSRF or an internal foothold can alter reachability.

Did Node launch an unexpected process, write a file or exercise a secret?

  • Yes: isolate the workload, preserve image and logs, revoke roles and tokens, inspect CI/CD and rebuild from trusted sources.
  • No: complete a clean rebuild, remove old revisions and run a telemetry retest.

Rotate tokens and keys through the secrets-management process, including preview and deployment-platform credentials.

Hardening and remediation verification

Deploy the latest safe patch in a supported line and perform a clean rebuild. Then apply a read-only filesystem where feasible, non-root UID, constrained egress, short-lived workload identity and a runtime image without administrative tools. SAST, DAST, SCA and IAST answer different questions, as explained in SAST vs DAST vs IAST.

The retest should prove:

  • a safe version in the SBOM of the running digest, not only the repository;
  • no stale revision, cache or unpatched function remains;
  • RSC and Server Action functionality still works after upgrade;
  • the pipeline blocks publication of an affected artefact;
  • a harmless request and canary child-process test are visible;
  • no unexpected egress and minimum workload permissions;
  • closure or rotation of every secret reachable from an affected instance.

The public PoC is not part of a production retest. A laboratory may use it to establish that the patched version no longer follows the vulnerable path, while production verification relies on version, artefact, telemetry and deployment controls.

Checklist

  • Every RSC deployment and transitive dependency is identified.
  • Packages run the latest safe release in the selected branch.
  • A clean rebuild completed and old revisions and caches were removed.
  • Preview, serverless, edge and DR environments were updated.
  • Node child processes, egress, persistence and secret use were reviewed.
  • PoC code ran only in a disposable laboratory.
  • The SBOM represents the running digest and covers transitive dependencies.
  • CDN/WAF, application, runtime, cloud and CI/CD evidence shares deployment or time context.
  • Rotation covered workload, preview and deployment-platform secrets.
  • An independent retest followed deployment.

Sources

SHARE / COPY