
Nicht-destruktiver Detektor für nicht authentifizierte RCE in BeyondTrust Remote Support und PRA, der Argument-Injection und PostgreSQL-Escape-Bypass miteinander verknüpft, um die Ausnutzbarkeit über zeitbasierte Differenzanalyse zu verifizieren.
Ethischer Hinweis: Nur für Forschungs-, Bildungs- und autorisierte Testzwecke. Bitte nicht gegen Systeme ohne Erlaubnis verwenden.
BeyondTrust Remote Support (RS) und Privileged Remote Access (PRA) sind Appliances, die privilegierte Remote-Sitzungen in die internen Systeme einer Organisation vermitteln. Daher sind sie häufig im Internet erreichbar und nehmen eine vertrauenswürdige Position im Netzwerk ein.
Ein nicht authentifizierter Angreifer, der den WebSocket-Endpunkt der Appliance erreichen kann, kann Betriebssystembefehle als der Site-Benutzer ausführen, indem er zwei Schwachstellen miteinander verkettet: eine Argument-Injection im thin-scc-wrapper-Skript der Appliance (CVE-2024-12356) und eine Umgehung des PostgreSQL-String-Escapings, die ein ungültiges UTF-8-Byte in einen vorzeitigen SQL-Literal-Bruch verwandelt (CVE-2025-1094). Der verwundbare Pfad wird vor jeglicher Authentifizierung erreicht.
bt_rs_rce_check.py in diesem Repository ist ein nicht-destruktiver Detektor für diese Kette. Er durchläuft exakt den nicht authentifizierten Codepfad, den der echte Exploit verwendet, stoppt jedoch beim Nachweis der Erreichbarkeit: Das Einzige, was er das Ziel jemals ausführen lässt, ist ein harmloses sleep (eine zeitbasierte Differenzmessung) oder ein harmloser Hostname-/HTTP-Lookup an einen Out-of-Band-Collector, den Sie kontrollieren. Er öffnet niemals eine Shell, schreibt keine Dateien, liest keine Daten, bleibt nicht persistent und bewegt sich nicht lateral.
psql-SQL-Injection-Schwachstelle durch ungültiges UTF-8, verkettet zur vollständigen RCEBT24-10-ONPREM1 / BT24-10-ONPREM2 für selbst gehostete Appliances; Cloud-Instanzen wurden von BeyondTrust gepatcht).CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:HDie Kette führt zu nicht authentifizierter Remote-Codeausführung als der Site-Benutzer auf einer Appliance, deren gesamter Zweck darin besteht, privilegierten Zugriff auf interne Systeme zu vermitteln. Eine einzige anonyme Anfrage verwandelt einen exponierten RS- oder PRA-Host in einen Ausgangspunkt und ein Sprungbrett zu jedem nachgelagerten System, das die Appliance vermittelt.
Es sind keine Anmeldeinformationen, keine Benutzerinteraktion und kein vorheriger Zugriff erforderlich: Der Angreifer ist extern und anonym, und die einzige Voraussetzung ist die Netzwerkerreichbarkeit des WebSocket-Endpunkts der Appliance.
Die Schwachstelle wurde offengelegt, nachdem festgestellt wurde, dass sie in freier Wildbahn ausgenutzt wird. Sie wurde am 19. Dezember 2024 in den Katalog bekannter ausgenutzter Schwachstellen der CISA aufgenommen und öffentlich mit dem Datenverstoß vom Dezember 2024 beim US-Finanzministerium in Verbindung gebracht, der einem staatlich geförderten Akteur zugeschrieben wird.
Die verwundbare Logik befindet sich im Shell-Skript thin-scc-wrapper der Appliance, das einen vom Angreifer kontrollierten Sitzungsschlüssel (gskey) aus einem nicht authentifizierten WebSocket-Frame liest und an die Datenbank weiterleitet. Vollständige RCE ist eine Kette aus drei unterschiedlichen Problemen.
1. Argument-Injection in thin-scc-wrapper (CVE-2024-12356). Der Wrapper übergibt den nicht vertrauenswürdigen gskey unquotiert an einen Helfer, sodass die Shell das Wort vor der Ausführung von echo in Argumente aufteilt:
quoted=$(export PHPRC="$BG_app_root/config/php-cli.ini"; echo $gskey | $ingrediRoot/app/dbquote)
Ein Schlüssel, der mit -e beginnt, verwandelt echo in echo -e, das Backslash-Escapes interpretiert und es dem Angreifer ermöglicht, beliebige Rohbytes auszugeben — am wichtigsten \xC0 — in die Daten, die zur nächsten Stufe fließen. Der Angreifer kontrolliert ein Flag eines vorhandenen Befehls, anstatt einen neuen Befehl zu injizieren. Deshalb handelt es sich um Argument-Injection (CWE-88) und nicht um klassische Befehlsinjektion.
2. PostgreSQL-Escape-Umgehung durch ungültiges UTF-8 (CVE-2025-1094). dbquote escaped den Wert mit PHP's pg_escape_string(), das PQescapeStringInternal() von libpq aufruft. Für ein Multibyte-Zeichen vertraut es der Länge, die von pg_encoding_mblen() gemeldet wird, und kopiert die Bytes des Zeichens wörtlich, ohne sie zu validieren:
len = pg_encoding_mblen(encoding, source);
for (i = 0; i < len; i++) /* copy the character */
*target++ = *source++;
Ein Byte wie 0xC0 kündigt ein 2-Byte-Zeichen an, sodass der Escaper das nächste Byte als seine „Fortsetzung" verschluckt — selbst wenn dieses Byte ein einfaches Anführungszeichen (0x27) ist. Die Sequenz 0xC0 0x27 passiert daher mit einem nicht-escapten einfachen Anführungszeichen-Byte, das weiterhin in der „escapten" Zeichenkette eingebettet ist.
3. psql bricht aus dem Literal aus und führt \! aus (CVE-2025-1094). Die „escapete" Zeichenkette wird an psql weitergeleitet, das 0xC0 0x27 nicht als ein Zeichen behandelt. Daher schließt das 0x27 das SQL-String-Literal vorzeitig, und alles danach wird als neue Eingabe geparst. Der Angreifer nutzt dies, um die \!-Meta-Befehl von psql zu erreichen, der einen Shell-Befehl als der Site-Benutzer ausführt:
<0xC0>'; \! <cmd> #
Rapid7 stellte fest, dass RCE in der Praxis immer auf CVE-2025-1094 beruht und dass diese allein ausreicht: Die Zustellung des rohen 0xC0-Bytes innerhalb eines binären WebSocket-Frames (anstatt eines Text-Frames, wo UTF-8-Validierung es entfernen würde) erreicht gskey unverändert und löst den SQL-Ausbruch ohne jeden echo -e-Schritt aus. Dieser Detektor verwendet diesen Binär-Frame-Ansatz.
Die gesamte Kette ist vor der Authentifizierung über einen einzelnen WebSocket erreichbar: