The emergence of the React2Shell vulnerability, formally designated as CVE-2025-55182, has sent shockwaves through the global cybersecurity landscape, marking a pivotal moment in the evolution of modern web framework security. Rated at a maximum CVSS score of 10.0, this unauthenticated remote code execution (RCE) vulnerability targets the core of React Server Components (RSC) and its proprietary streaming format, known as the Flight protocol. The vulnerability allows an attacker to gain full shell access to a server through a single, specially crafted HTTP request, bypassing all authentication and authorization layers. This incident has fundamentally challenged the prevailing trust model of server-driven user interfaces, forcing a massive reassessment of how data and behavior are serialized across the network.
The Architecture of a CVSS 10.0 Crisis
At the center of the React2Shell vulnerability is the Flight protocol, a custom, line-delimited streaming format developed by the React team to facilitate the efficient delivery of interactive UIs from the server to the client. Unlike traditional web communications that rely on standard HTML or JSON, Flight is a sophisticated deserialization system capable of reconstructing complex component trees, lazy-loaded modules, and even executable server references.
When a React Server Component renders, the Flight protocol streams a series of "rows" to the client. These rows contain a mixture of JSON fragments and specialized prefixes that instruct the React runtime on how to assemble the application. The vulnerability resides specifically in the getOutlinedModel and getChunk functions within the react-server-dom-webpack package. These functions handle the resolution of internal references, particularly the $ prefix system, which the framework uses to navigate object properties and resolve asynchronous state.
The critical failure in the protocol’s design was the lack of rigorous validation during property traversal. When the parser encountered the $: prefix, it performed arbitrary property lookups on deserialized objects without verifying ownership via hasOwnProperty. This oversight created a classic deserialization sink, allowing attackers to inject prototype pollution strings such as __proto__ or constructor into the stream. By chaining these references, attackers were able to reach the JavaScript Function constructor, effectively turning a data-streaming protocol into an arbitrary code execution engine.
Chronology of the React2Shell Outbreak
The timeline of the React2Shell crisis reveals a rapid escalation from theoretical discovery to state-sponsored exploitation.
- December 3, 2025: Security researcher Durgesh Pawar identifies a critical flaw in the Flight protocol’s deserialization logic. The React team is notified, and the vulnerability is assigned CVE-2025-55182.
- December 5, 2025: Initial patches are released in React versions 19.0.1, 19.1.2, and 19.2.1. However, the complexity of the Flight protocol leads to the discovery of secondary vulnerabilities.
- December 8, 2025: The federal Cybersecurity and Infrastructure Security Agency (CISA) adds CVE-2025-55182 to its Known Exploited Vulnerabilities (KEV) catalog, citing evidence of active exploitation in the wild.
- December 10, 2025: Security firm Sysdig publishes a report linking React2Shell exploitation to North Korean state-sponsored actors. The report details the deployment of "EtherRAT," a file-less implant that utilizes the Ethereum blockchain for command-and-control (C2) communication.
- January 2026: A series of secondary CVEs (including CVE-2025-55184 and CVE-2026-23864) are disclosed, highlighting Denial of Service (DoS) and source code exposure risks inherent in the original protocol design.
- February 2026: Industry-wide adoption of strict schema validation and the "Taint API" becomes the standard for securing React-based enterprise applications.
Technical Analysis of the Gadget Chain
The exploitation of React2Shell is a masterclass in modern gadget chain construction. Because the Flight protocol is designed to reconstruct behavior rather than just data, it provides an unusually rich environment for attackers.
The primary attack vector involves the $: prefix, which facilitates property access across chunks. In a standard scenario, this might be used to resolve a user’s name from a previously loaded user object (e.g., $1:user:name). However, because the parser lacked a check for inherited properties, an attacker could supply a path that traversed into the object’s prototype.
By sending a payload that referenced $1:__proto__:constructor:constructor, the attacker could gain access to the global Function constructor. In JavaScript, the Function constructor can take a string and turn it into executable code, much like eval(). When the React runtime attempted to resolve this "property" during the rendering or reply-handling phase, it would execute the attacker’s payload in the context of the server process.
The impact was further magnified by the unauthenticated nature of Server Functions. In many Next.js and React configurations, these endpoints are exposed to the public internet to facilitate client-side interactions. This allowed the "React2Shell" exploit to hit the most sensitive parts of the application infrastructure without requiring a single valid credential.
Threat Actor Landscape and In-the-Wild Exploitation
The sophistication of the attacks following the disclosure of CVE-2025-55182 suggests that threat actors were prepared for such a vulnerability in the React ecosystem. The most notable campaign involved the deployment of EtherRAT, attributed to the Lazarus Group (DPRK).
EtherRAT is particularly dangerous because of its "EtherHiding" technique. Instead of communicating with a traditional IP address or domain for instructions, the malware reads data directly from the Ethereum blockchain. This makes the C2 infrastructure nearly impossible to take down through conventional legal or technical means, as the blockchain is decentralized and immutable.

Simultaneously, Palo Alto Networks’ Unit 42 identified the "KSwapDoor" backdoor targeting Linux-based React environments. KSwapDoor utilized advanced obfuscation, masquerading as a legitimate kernel swap daemon ([kswapd1]) and using AES-256-CFB encryption for its communications. The speed at which these state-sponsored entities weaponized React2Shell underscores the vulnerability’s high value as an initial entry point into corporate networks.
Official Responses and Remediation Efforts
The React core team, in coordination with Vercel and Meta, responded with a series of "targeted hardening" patches. The primary fix involved caching the original Object.prototype.hasOwnProperty method and ensuring that every property access within the Flight parser used this cached version via .call(). This effectively blocked the prototype pollution path used in the React2Shell gadget chain.
In a public statement, lead maintainers emphasized that while the immediate RCE vector was closed, the "structural risks" of the Flight protocol require a multi-layered defense strategy. They introduced the Taint API (including taintObjectReference and taintUniqueValue) as a development-time guardrail to prevent sensitive server-side data from being accidentally serialized to the client.
However, industry experts have noted that the Taint API is not a silver bullet. Because it is reference-based, common operations like object spreading (...user) or JSON serialization can "break" the taint, allowing sensitive data to leak if developers are not extremely disciplined.
A Ranked Hierarchy of Defensive Measures
For organizations running React Server Components, security experts have established a ranked set of defensive priorities to mitigate the risks exposed by the Flight protocol.
1. Mandatory Schema Validation
The most critical defense is the implementation of strict input validation at the entry point of every Server Action. Using libraries like Zod or Valibot, developers must validate the shape, type, and length of all incoming data before it is processed. This prevents the Flight deserializer from handling unexpected structures that could trigger latent parsing bugs.
2. Environmental Isolation with ‘server-only’
To prevent the accidental exposure of sensitive business logic or credentials, the server-only package must be utilized. This build-time check ensures that modules intended for server-side execution can never be imported by client-side components, maintaining a hard boundary between the two environments.
3. CSRF Hardening
Following the discovery of CVE-2026-27978, which allowed for CSRF bypasses via sandboxed iframes, standard framework protections are no longer considered sufficient for high-value operations. Organizations are encouraged to implement explicit CSRF tokens and enforce SameSite=Strict cookie policies to protect authenticated sessions.
4. WAF and Infrastructure Monitoring
While Web Application Firewalls (WAFs) can be bypassed with techniques like padding or chunked encoding, they remain useful for blocking low-sophistication automated scans. Security teams are advised to implement rules that flag common prototype pollution patterns (e.g., __proto__) within the Next-Action headers of POST requests.
Historical Context and Future Implications
The React2Shell crisis is not an isolated event but rather the latest iteration of a recurring problem in computer science: the danger of custom deserialization. Historically, technologies like Java’s ObjectInputStream, Python’s pickle, and ASP.NET’s ViewState have all suffered from similar catastrophic vulnerabilities. Each of these systems attempted to move rich, stateful data across a network boundary, only to find that an attacker could manipulate that state to seize control of the execution flow.
The React Flight protocol’s decision to serialize behavior—such as module references and Promise chains—represents a significant increase in the attack surface of web applications. As the industry moves toward "Server-Driven UI" as a standard architectural pattern, the lessons of 2025 and 2026 suggest that frameworks must move toward a "Zero Trust" serialization model.
Future iterations of the Flight protocol may require cryptographic signing of all serialized payloads and content integrity checks to ensure that the data received by the client (or the reply received by the server) has not been tampered with in transit. Until such structural changes are implemented at the framework level, the responsibility for securing the deserialization boundary remains with the application developers, who must treat every Flight stream as a potential high-severity threat vector.
