
Prova di concetto per CVE-2025-55182, una vulnerabilità RCE critica in Next.js Server Actions. Sfrutta la deserializzazione insicura nel protocollo React Flight per eseguire comandi arbitrari tramite inquinamento del prototipo e bypass della sandbox.
Uno script Proof-of-Concept (PoC) per React2Shell (CVE-2025-55182), una vulnerabilità critica di esecuzione remota di codice (RCE) che colpisce le applicazioni Next.js che utilizzano Server Actions.
[!WARNING] Disclaimer: Questo strumento è solo per scopi educativi e di test autorizzati. Non sono responsabile per qualsiasi uso improprio.
Questo script sfrutta una vulnerabilità di deserializzazione insicura nel protocollo "Flight" dei React Server Components. Permette a utenti non autenticati di eseguire codice JavaScript arbitrario sul server, portando a una parziale esecuzione remota di codice (RCE).
require (global.require o tramite il costruttore del modulo), assicurandosi che funzioni sulle versioni moderne di Node.js (v14+).pip install -r requirements.txt
python3 react2shell.py -u <TARGET_URL> [-c <COMMAND>]
| Argomento | Descrizione | Predefinito |
|---|---|---|
-u, --url | Obbligatorio. L'URL target (es., http://localhost:3000/). | N/A |
-c, --cmd | Opzionale. Il comando da eseguire sul server. | id |
Verifica identità utente:
python3 react2shell.py -u http://127.0.0.1:3000/
Elenca contenuti directory:
python3 react2shell.py -u http://127.0.0.1:3000/ -c "ls -la"
Leggi un file sensibile:
python3 react2shell.py -u http://127.0.0.1:3000/ -c "cat /etc/passwd"
L'exploit sfrutta una catena di Prototype Pollution e Deserializzazione Insicura all'interno della gestione delle Server Actions di Next.js per React Server Components (RSC).
Next-Action segnala al server di elaborare una Server Action.then dannosa ("$1:__proto__:then"). Questo inganna il gestore di richieste asincrone del server, facendogli trattare il payload come un "Thenable" (oggetto simile a una Promise)._response. Il campo _prefix è normalmente utilizzato per il buffering interno dello stream, ma manipolandolo possiamo iniettare JavaScript grezzo.require è spesso rimossa dallo scope globale per prevenire RCE. Lo script bypassa questo attraversando la catena dei prototipi di process.mainModule:
var require = global.require || global.process.mainModule.constructor._load;
child_process ed eseguire comandi di sistema.execSync), e l'output viene lanciato come oggetto Error. Questo errore viene serializzato e restituito al client nel corpo della risposta HTTP, permettendoci di vedere l'output del comando.Questo strumento è stato sviluppato con l'assistenza di Gemini 3 Pro.