Skip to main content
SecurityReactWeb SecurityIncident Response

React2Shell: A Wake-Up Call for Modern Web Security

How a 10.0 severity vulnerability in React Server Components became weaponized in hours, and what it teaches us about the new threat landscape.

Andrew Yong

Security Engineer

December 8, 2025
6 min read

On December 3, 2025, the web development community faced a critical moment: the disclosure of CVE-2025-55182, known as React2Shell. With a maximum CVSS score of 10.0, this vulnerability in React Server Components represents one of the most severe threats to modern web applications this year. What happened next offers crucial lessons about the velocity of modern cyber threats.

Critical Timeline

Within hours of public disclosure, multiple China state-nexus threat groups began active exploitation attempts. The race between defenders and attackers has never been faster.

Understanding React2Shell

React2Shell is an unsafe deserialization vulnerability affecting React Server Components in React 19.x and Next.js 15.x/16.x when using App Router. Discovered by security researcher Lachlan Davidson and responsibly disclosed on November 29, 2025, the vulnerability enables unauthenticated remote code execution.

The Critical Detail

What makes this particularly dangerous is that applications are vulnerable even if they don't explicitly use server functions—as long as they support React Server Components. This caught many developers off guard who assumed their applications were safe.

Common Misconception

Many teams believed they were protected because they weren't using server actions. If you're running React 19 or Next.js 15+, you need to patch regardless of your feature usage.

The Exploitation Timeline

The speed of weaponization tells a sobering story about modern threat actors:

December 3, 2025 — CVE-2025-55182 publicly disclosed Hours later — First exploitation attempts observed in honeypot networks December 4, 2025 — Multiple threat groups actively scanning and exploiting

Amazon's threat intelligence teams identified exploitation attempts from known groups including Earth Lamia and Jackpot Panda, along with numerous unattributed threat clusters. One particularly persistent attacker spent nearly an hour systematically troubleshooting exploitation attempts, demonstrating this wasn't just automated scanning—threat actors were actively refining their techniques against live targets.

Observed Attack Patterns

Analysis of honeypot data revealed attackers:

  • Making 116 requests over 52 minutes to a single target
  • Attempting multiple exploit payloads
  • Executing reconnaissance commands (whoami, id)
  • Trying file writes to /tmp/pwned.txt
  • Attempting to read /etc/passwd

Detection Opportunity

Look for POST requests with next-action or rsc-action-id headers in your logs. Request bodies containing $@ patterns or "status":"resolved_model" are strong indicators of exploitation attempts.

The PoC Problem

A fascinating aspect of this incident highlights the disconnect between exploit availability and exploit quality. Many public proof-of-concepts circulating on GitHub fundamentally misunderstood the vulnerability:

  • Some explicitly registered dangerous modules (fs, child_process, vm) in the server manifest—something legitimate applications should never do
  • Several repositories contained code that would remain vulnerable even after patching

Yet threat actors attempted to use these flawed PoCs anyway, demonstrating a speed-over-accuracy approach. They're scanning broadly with any available tool, hoping to find the small percentage of vulnerable configurations.

False Security

Invalid PoCs in publications and vulnerability aggregators created dangerous false negatives, leading some teams to believe they weren't vulnerable when they actually were.

Immediate Response Actions

If you're running React 19 or Next.js 15.0.0 through 16.0.6, here's what you need to do now:

1. Verify Your Version

Check your deployed versions immediately:

# For Next.js applications
# In browser console:
next.version

# Or check package.json
cat package.json | grep "\"next\""

2. Upgrade to Patched Versions

Vercel released an automated fix tool:

npx fix-react2shell-next

Or manually update based on your version:

Vulnerable VersionPatched Release
Next.js 15.0.x15.0.5
Next.js 15.1.x15.1.9
Next.js 15.2.x15.2.6
Next.js 15.3.x15.3.6
Next.js 15.4.x15.4.8
Next.js 15.5.x15.5.7
Next.js 16.0.x16.0.7

3. Deploy Immediately

Once tested, deploy your patched application as quickly as possible. Every hour of delay is an hour of exposure.

4. Rotate Secrets

If your application was online and unpatched as of December 4, 2025 at 1:00 PM PT, assume potential compromise. Rotate all application secrets, starting with the most critical ones.

Defense in Depth

Even with patching, implement AWS WAF rules (AWSManagedRulesKnownBadInputsRuleSet v1.24+) as an additional layer of protection against known exploit patterns.

Indicators of Compromise

Review your logs for these signs of exploitation attempts:

Network Indicators:

  • HTTP POST requests with next-action or rsc-action-id headers
  • Request bodies containing $@ patterns
  • Request bodies with "status":"resolved_model" strings

Host-Based Indicators:

  • Unexpected execution of reconnaissance commands
  • Attempts to read /etc/passwd
  • Suspicious file writes to /tmp/ directory
  • New processes spawned by Node.js/React processes

Lessons for the Industry

React2Shell teaches us several critical lessons about modern vulnerability management:

1. Time-to-Exploit is Measured in Hours

The window between disclosure and active exploitation has collapsed from weeks to hours. Your patch cycle needs to match this velocity.

2. PoC Quality Doesn't Matter to Attackers

Even technically flawed exploits generate massive scanning campaigns. Defenders must assume weaponization will occur immediately upon disclosure.

3. Shared Infrastructure Complicates Attribution

Large-scale anonymization networks used by multiple threat groups simultaneously make definitive attribution challenging. Focus on detection and response rather than attribution.

4. WAF Rules Are Not Substitutes for Patching

While AWS, Vercel, and other providers deployed protection layers quickly, these cannot guarantee protection against all attack variants. Patching is the only complete fix.

"When PoCs hit the internet, sophisticated threat actors are quick to weaponize them. The speed at which these groups operationalized public exploits underscores a critical reality about modern threat landscapes."

Moving Forward

The React2Shell incident demonstrates why security cannot be an afterthought in modern web development. As we build increasingly complex server-side rendering architectures, we must:

  • Maintain aggressive patch management programs
  • Implement comprehensive logging and monitoring
  • Deploy defense-in-depth strategies (WAF rules, runtime protection, network segmentation)
  • Establish clear incident response procedures
  • Stay informed about vulnerability disclosures in our dependency chains

Proactive Monitoring

Set up automated alerts for security advisories from critical dependencies. Tools like GitHub Dependabot, Snyk, or npm audit can help you stay ahead of vulnerabilities.

If you discovered React2Shell exploitation attempts in your environment, document everything and consider sharing indicators with the security community. Collective defense makes us all stronger.

Have questions about securing your React applications? Let's reach out directly.