
La mia ricerca su CVE-2025-55182
Questo repository contiene la mia ricerca sulla CVE-2025-55182, nota anche come vulnerabilità React2Shell. Il repo è composto da due parti principali: stand ed exploit.
Alcune informazioni su questa falla di sicurezza:
La vulnerabilità è fondamentalmente una mancanza di validazione dell'input utente. Ma non è così semplice =)
La parte React Client e la parte React Server utilizzano il React Flight Protocol per scambiare dati. Ecco un buon talk a riguardo, per familiarizzare velocemente.
Esempio di chunk di messaggi del React Flight Protocol:
{
"0": (None, '["$1"]'),
"1": (None, '{"object":"fruit","name":"$2:fruitName"}'),
"2": (None, '{"fruitName":"cherry"}'),
}
I chunk del RFP possono riferirsi l'uno all'altro utilizzando l'operatore $. Quando i chunk vengono successivamente deserializzati sul server, questi collegamenti vengono risolti. Una cosa fondamentale è che possiamo accedere al prototipo dell'oggetto da essi.
Manipolando il prototipo, possiamo forzare V8 ad attendere il nostro .then(). Il payload risultante potrebbe assomigliare a questo:
{
"then": "$1:__proto__:then",
"status": "resolved_model",
"reason": -1,
"value": '{"then": "$B0"}',
"_response": {
"_prefix": f"return foo; ",
"_formData": {
"get": "$1:constructor:constructor",
},
},
}
Non entrerò troppo nei dettagli di come funziona effettivamente questa catena di gadget, se vuoi saperne di più, leggi un'ottima analisi qui di Moritz Sanft.
Puoi anche vedere il confronto delle versioni su GitHub, prima e dopo la patch, se vuoi approfondire questa falla.
Ho creato una semplice app react/next.js, che utilizza (vedi stand/package.json):
"dependencies": {
"next": "16.0.6",
"react": "19.2.0",
"react-dom": "19.2.0"
},
Solo una semplice pagina con contenuto testuale, creata con create-next-app:
Per avviare, esegui questo nella directory stand:
docker compose up --build -d
Quindi naviga su http://localhost:3000 nel tuo browser.
Lo sfruttamento è semplice. Dobbiamo solo inviare dei chunk RFP appositamente costruiti con il nostro payload al server tramite una richiesta POST. Vedi exploit/src/main.py. Include anche un semplice controllo per verificare se il server è vulnerabile o meno: prova a eseguire un comando whoami, se il timeout viene superato, il server molto probabilmente utilizza una versione patchata.
Puoi vedere il payload RFP in exploit/resource/chunk.json.
Prima di eseguire l'exploit, non dimenticare di configurare un listener netcat e aggiornare il file exploit/resource/config.toml con il tuo host e porta, per ottenere una reverse shell.
Buon pwn!
Un grande ringraziamento a Lachlan Davidson, che ha scoperto la vulnerabilità, maple, che ha trovato un buon gadget, e anche Moritz Sanft, che ha condiviso il suo PoC e ha scritto un'ottima analisi.
prodotto da I3r1h0n.