
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.
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 ermitteltErlang/OTP patchen (höchste Priorität):
# On Debian/Ubuntu
sudo apt-get update && sudo apt-get install erlang-base=1:27.3.2-1
# On RHEL/CentOS
sudo yum update erlang
# Source build
wget https://github.com/erlang/otp/releases/download/OTP-27.3.2/otp_src_27.3.2.tar.gz
tar xzf otp_src_27.3.2.tar.gz
cd otp_src_27.3.2
./configure && make && sudo make install
SSH-Zugriff einschränken (temporäre Notlösung):
# Firewall rules to limit SSH source IPs
iptables -A INPUT -p tcp --dport 22 -s <trusted_networks> -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
Erlang-SSH deaktivieren, falls ungenutzt:
% In sys.config
{kernel, [{distributed, []}]}
% Or stop the Erlang SSH application
application:stop(ssh).
Achten Sie auf anomale SSH-Handshake-Muster:
131, 104 usw.)epmd, beam.smp)Diese Informationen werden ausschließlich zu Bildungszwecken und für autorisierte Sicherheitstests bereitgestellt. Die unbefugte Verwendung dieses Exploits gegen Systeme, die Ihnen nicht gehören oder für die Sie keine ausdrückliche schriftliche Genehmigung zum Testen besitzen, ist illegal. Die Autoren übernehmen keine Verantwortung für einen Missbrauch.
Repository-Struktur:
cve-2025-32433-erlang_ssh_rce_reproduction/
├── README.md # This file
├── exploit.py # Python PoC exploit
└── LICENSE # MIT (for PoC code only)
| 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 |