Skip to content

GHSA-cpj6-fhp6-mr6j CVE-2025-43865

React Router allows pre-render data spoofing on React-Router framework mode

High npm
Severity
8.2 / 10
High · CVSS 3.1
Exploit chance (EPSS)
0.81%
Chance of exploitation in the next 30 days. Higher than 57.06% of scored vulnerabilities.
Known exploited
No
Not in CISA's catalog
Weakness
CWE-345 Insufficient Verification of Data Authenticity
Fix
7.5.2
Upgrade react-router to this version or later

Description

Summary

After some research, it turns out that it's possible to modify pre-rendered data by adding a header to the request. This allows to completely spoof its contents and modify all the values ​​of the data object passed to the HTML. Latest versions are impacted.

Details

The vulnerable header is X-React-Router-Prerender-Data, a specific JSON object must be passed to it in order for the spoofing to be successful as we will see shortly. Here is the vulnerable code :

<img width="776" alt="Capture d’écran 2025-04-07 à 05 36 58" src="https://github.com/user-attachments/assets/c95b0b33-15ce-4d30-9f5e-b10525dd6ab4" />

To use the header, React-router must be used in Framework mode, and for the attack to be possible the target page must use a loader.

Steps to reproduce

Versions used for our PoC:

  • "@react-router/node": "^7.5.0",
  • "@react-router/serve": "^7.5.0",
  • "react": "^19.0.0"
  • "react-dom": "^19.0.0"
  • "react-router": "^7.5.0"
  1. Install React-Router with its default configuration in Framework mode (https://reactrouter.com/start/framework/installation)
  2. Add a simple page using a loader (example: routes/ssr)
  3. Access your page (which uses the loader) by suffixing it with .data. In our case the page is called /ssr:

image

We access it by adding the suffix .data and retrieve the data object, needed for the header:

image

  1. Send your request by adding the X-React-Router-Prerender-Data header with the previously retrieved object as its value. You can change any value of your data object (do not touch the other values, the latter being necessary for the object to be processed correctly and not throw an error):

Capture d’écran 2025-04-07 à 05 56 10

As you can see, all values ​​have been changed/overwritten by the values ​​provided via the header.

Impact

The impact is significant, if a cache system is in place, it is possible to poison a response in which all of the data transmitted via a loader would be altered by an attacker allowing him to take control of the content of the page and modify it as he wishes via a cache-poisoning attack. This can lead to several types of attacks including potential stored XSS depending on the context in which the data is injected and/or how the data is used on the client-side.

Credits

  • Rachid Allam (zhero;)
  • Yasser Allam (inzo_)

Affected versions

npm

PackageVulnerableFixed in
react-router
>= 7.0.0-pre.0, <= 7.5.1
No fix yet
react-router
>= 7.0.0-pre.0, < 7.5.2
7.5.2

How to fix

Move to the fixed version or later with your package manager, update the lockfile, and run your tests. If the package only arrives through another dependency, upgrade that dependency first. If none of its releases pulls a fixed version yet, force the version with your package manager's override.

react-router npm → 7.5.2

npm
npm install react-router@7.5.2
yarn
yarn add react-router@7.5.2
pnpm
pnpm add react-router@7.5.2

Severity breakdown

CVSS 3.1 8.2

CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:H

Attack vector
Network
Attack complexity
Low
Privileges required
None
User interaction
None
Scope
Unchanged
Confidentiality
None
Integrity
Low
Availability
High

Weakness

CWE-345: Insufficient Verification of Data Authenticity

The product does not sufficiently verify the origin or authenticity of data, in a way that causes it to accept invalid data.

References

Timeline

  1. Published
  2. Last updated by the source
  3. Latest EPSS score
AdvisorySeverityWhy it's related
GHSA-qwww-vcr4-c8h2
React Router: RSC Mode CSRF Bypass Allows Action Execution Before 400 Response
High Also affects react-router
GHSA-chx6-hx7r-mcp5
React Router: Unauthenticated Denial of Service via Inefficient Route Matching
High Also affects react-router
GHSA-wrjc-x8rr-h8h6
React Router: Open redirect via backslash in <Link> and useNavigate (CVE-2025-68470 bypass)
Medium Also affects react-router
GHSA-jjmj-jmhj-qwj2
React Router: Open redirect leading to XSS
Medium Also affects react-router
GHSA-h8fp-f39c-q6mh
React Router: RSCErrorHandler Missing Protocol Validation (XSS)
Medium Also affects react-router
GHSA-337j-9hxr-rhxg
React Router: Arbitrary Constructor Injection via deserializeErrors() in React Router SSR Hydration
Medium Also affects react-router
GHSA-84g9-w2xq-vcv6
React Router: Potential CSRF via PUT/PATCH/DELETE document requests
Low Also affects react-router
GHSA-8x6r-g9mw-2r78
React Router vulnerable to DoS via unbounded path expansion in __manifest endpoint
High Also affects react-router

Credits: cold-try, mhassan1

Is this in your code?

MergeHarbor checks every repository's dependencies against this database, ranks what matters by exploitability and reachability, routes it to the owning team and opens the fix pull request.

Check your repos with MergeHarbor