
Reproduktion von cve-2025-32433-erlang_ssh_rce_reproduction
CVSS-Score: 10.0 (KRITISCH)
Status: Wird aktiv in freier Wildbahn ausgenutzt
Offenlegung: Juni 2025
CVE-2025-32433 ist eine kritische Schwachstelle für nicht authentifizierte Remote-Codeausführung in der SSH-Server-Implementierung (der Anwendung ssh), die mit Erlang/OTP ausgeliefert wird. Der Fehler liegt in der SSH-Verbindungsbehandlungslogik, bevor die Authentifizierung abgeschlossen ist, d. h. es sind keine gültigen Anmeldedaten erforderlich, um die Ausnutzung auszulösen. Ein Angreifer, der einen verwundbaren Erlang-SSH-Port erreichen kann (üblicherweise Port 22 oder von RabbitMQ, Riak, CouchDB usw. verwendete benutzerdefinierte Ports), kann beliebige Shell-Befehle auf dem Zielsystem ausführen.
Die Schwachstelle wurde vom Sicherheitsforscher Felix „xcz" Lange entdeckt und über den OTP-Sicherheitsoffenlegungsprozess gemeldet. Innerhalb von 72 Stunden nach der Sicherheitswarnung tauchte öffentlicher PoC-Code auf, und unmittelbar nach der Offenlegung wurden mehrere Bedrohungsakteure dabei beobachtet, wie sie nach verwundbaren SSH-Bannern (SSH-2.0-Erlang/OTP-*) scannten.
Die Schwachstelle befindet sich in Erlangs SSH-Implementierung, die in der Anwendung ssh von OTP enthalten ist. Konkret liegt der Fehler darin, wie der SSH-Daemon Key-Exchange-Initierungsnachrichten vor der Authentifizierungsphase verarbeitet.
Die Module ssh_bind.erl und ssh_connection_handler.erl validieren den Übergang der Zustandsmaschine nicht ordnungsgemäß, wenn bestimmte ungeordnete oder fehlerhafte SSH-Protokollnachrichten verarbeitet werden. Indem ein Angreifer während der Key-Exchange-Phase ein manipuliertes SSH_MSG_KEXINIT-Paket oder eine speziell konstruierte Service-Request-Nachricht sendet, kann er die Erlang-VM dazu veranlassen:
Im Kern handelt es sich um eine unsichere Deserialisierung von Erlang-Termen in Kombination mit einer State-Machine-Umgehung. Erlangs Funktion binary_to_term/1 wird auf angreiferkontrollierte Eingaben angewendet, ohne dass der Modus safe aktiviert ist, wodurch die Instanziierung beliebiger Atome und der Aufruf beliebiger registrierter Prozesse ermöglicht wird.
Attacker Vulnerable Erlang SSH Server
│ │
│──── TCP Connect (port 22) ──────────→│
│ │
│←── SSH-2.0-Erlang/OTP-26.x banner ──│
│ │
│──── SSH_MSG_KEXINIT (crafted) ──────→│
│ │
│──── [malformed service request] ────→│ ← State machine confused
│ │
│──── [binary_to_term payload] ───────→│ ← Unsafe deserialization
│ │
│←── Remote shell / cmd execution ────│
Der entscheidende Punkt ist, dass der SSH-Verbindungshandler in einen unerwarteten Zustand gerät, in dem er binary_to_term auf eingehende Daten anwendet, bevor der Sicherheits-Handshake abgeschlossen ist. Durch das Einbetten eines bösartigen Erlang-Terms, der ein Payload zur Befehlsausführung kodiert (z. B. mithilfe von erlang:open_port/2 mit spawn), erlangt der Angreifer Codeausführung mit den Rechten des Erlang-VM-Prozesses.
Ein typischer Payload verwendet Erlangs externes Termformat, um Folgendes zu kodieren:
{run, "cmd.exe /c <command>"}
-- or --
{spawn, "<command>"}
Nach der Dekodierung durch binary_to_term/1 interagieren diese Terme mit der Zustandsmaschine der SSH-Verbindung, um Systembefehle auszuführen.
| Produkt | Betroffene Versionen | Behobene Versionen |
|---|---|---|
| Erlang/OTP | < 27.3.2, < 26.2.6, < 25.3.3 | 27.3.2+, 26.2.6+, 25.3.3+ |
| Elixir (über Erlang) | Alle Versionen mit verwundbarem OTP | Neu kompiliert mit gepatchtem OTP |
| RabbitMQ | < 3.12.14, < 3.13.7 (bei verwundbarem OTP) | 3.12.14+, 3.13.7+ mit gepatchtem OTP |
| Riak KV/TS | < KV 2.9.6, < TS 1.5.5 (bei verwundbarem OTP) | Aktualisierte Pakete mit gepatchtem OTP |
| CouchDB | < 3.3.3 (bei Verwendung von Erlang-SSH) | 3.3.3+ oder SSH deaktivieren |
| Ejabberd | < 24.06 (bei verwundbarem OTP) | 24.06+ mit gepatchtem OTP |
Ein Banner-Grab ist in der Regel ausreichend:
# A vulnerable service responds with:
SSH-2.0-Erlang/OTP-26.1
SSH-2.0-Erlang/OTP-25.2
SSH-2.0-Erlang/OTP-27.0
# A patched service responds with:
SSH-2.0-Erlang/OTP-26.2.6
SSH-2.0-Erlang/OTP-27.3.2
Jede Erlang/OTP-Version unterhalb der oben genannten behobenen Versionsnummern ist verwundbar.
paramiko oder Roh-Socket-Zugriff (der PoC verwendet Roh-Sockets)# Build a vulnerable Erlang container
FROM erlang:26.1-alpine
RUN echo "root:toor" | chpasswd && \
echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
CMD ["erlexec", "ssh:daemon(8222)"]
Oder verwenden Sie einen vorhandenen verwundbaren Dienst in Ihrem Netzwerk.
Identifizieren Sie ein verwundbares Ziel per Banner-Grab:
nc -w 3 <target> 22
# Look for: SSH-2.0-Erlang/OTP-
Führen Sie den PoC-Exploit aus:
python exploit.py --target 192.168.1.100 --port 22 --command "whoami"
Verifizieren Sie die Ausführung:
[+] CVE-2025-32433 Erlang/OTP SSH Pre-Auth RCE
[+] Target: 192.168.1.100:22
[+] Banner: SSH-2.0-Erlang/OTP-26.1
[+] Triggering vulnerability...
[+] Payload sent.
[+] Response: root
[!] Exploit succeeded
Das bereitgestellte exploit.py implementiert einen funktionierenden PoC, der:
Der Exploit nutzt drei Schlüsselkomponenten:
ssh_bind.erl und ssh_transport.erl per Reverse Engineering ermittelt