
Ma recherche sur la CVE-2025-55182
Ce dépôt contient mes recherches sur la CVE-2025-55182, également appelée vulnérabilité React2Shell. Le dépôt se compose de deux parties principales : le stand et l'exploit.
Quelques informations sur cette faille de sécurité :
La vulnérabilité est fondamentalement un manque de validation des entrées utilisateur. Mais ce n'est pas si simple =)
Les parties Client React et Server React utilisent le React Flight Protocol pour échanger des données. Voici une bonne présentation pour vous familiariser rapidement avec.
Exemple de morceaux de message du React Flight Protocol :
{
"0": (None, '["$1"]'),
"1": (None, '{"object":"fruit","name":"$2:fruitName"}'),
"2": (None, '{"fruitName":"cherry"}'),
}
Les morceaux du RFP peuvent se référencer les uns les autres à l'aide de l'opérateur $. Lorsque les morceaux sont ensuite désérialisés côté serveur, ces liens sont résolus. Un point clé ici est que nous pouvons accéder au prototype de l'objet à partir de cela.
En manipulant le prototype, nous pouvons forcer V8 à attendre notre .then(). La charge utile résultante peut ressembler à ceci :
{
"then": "$1:__proto__:then",
"status": "resolved_model",
"reason": -1,
"value": '{"then": "$B0"}',
"_response": {
"_prefix": f"return foo; ",
"_formData": {
"get": "$1:constructor:constructor",
},
},
}
Je n'entrerai pas trop dans les détails du fonctionnement réel de cette chaîne de gadgets. Si vous voulez en savoir plus, lisez une excellente analyse ici par Moritz Sanft.
Vous pouvez également consulter la comparaison de versions GitHub, avant et après le correctif, si vous souhaitez approfondir cette faille.
J'ai créé une application react/next.js simple, qui utilise (voir stand/package.json) :
"dependencies": {
"next": "16.0.6",
"react": "19.2.0",
"react-dom": "19.2.0"
},
Juste une page simple avec du contenu textuel, créée avec create-next-app :
Pour démarrer, exécutez ceci dans le répertoire stand :
docker compose up --build -d
Ensuite, naviguez vers http://localhost:3000 dans votre navigateur.
L'exploitation est simple. Il suffit d'envoyer des morceaux RFP spécialement construits avec notre charge utile au serveur via une requête POST. Voir exploit/src/main.py. Il inclut également une vérification simple pour savoir si le serveur est vulnérable ou non : il tente d'exécuter une commande whoami ; si le délai d'attente est dépassé, le serveur utilise très probablement une version corrigée.
Vous pouvez voir la charge utile RFP dans exploit/resource/chunk.json.
Avant d'exécuter l'exploit, n'oubliez pas de configurer un listener netcat et de mettre à jour exploit/resource/config.toml avec votre hôte et votre port, afin d'obtenir un reverse shell.
Bon pwn !
Un grand respect à Lachlan Davidson, qui a découvert la vulnérabilité, maple, qui a trouvé un bon gadget, et aussi Moritz Sanft, qui a partagé son PoC et rédigé une excellente analyse.
produit par I3r1h0n.