Anwendungen, die Skripte im bat- und cmd-Format auf der Windows-Plattform mithilfe der standardmäßigen Prozessstartfunktionen ausführen, sind anfällig für eine Schwachstelle, die es ermöglicht, eigenen Code auszuführen, wenn beim Start Argumente ohne separate Escape-Zeichen für Sonderzeichen übergeben werden. Diese Schwachstelle erhielt den Codenamen BatBadBut und tritt in Anwendungen auf, die standardmäßige Bibliotheken von Programmiersprachen wie Rust, PHP, Node.js, Python, Ruby, Go, Erlang und Haskell verwenden.
Das Problem wird als Schwachstelle betrachtet, da es Funktionen der Bibliothek betrifft, wie z.B. Command::arg und Command::args in Rust, die für die direkte Übergabe von Argumenten an den Prozess ohne deren Verarbeitung durch den Kommando-Interpreter ausgelegt sind. Es wird angenommen, dass der Entwickler der Anwendung die Argumente möglicherweise nicht überprüft, da diese direkt an den zu startenden Prozess übergeben werden. Während in Unix-Systemen die Argumente dem Prozess einzeln in einem Array übergeben werden, werden in Windows bei der Verwendung der API CreateProcess die Argumente in einer einzigen Zeichenkette formatiert, wobei das Parsing in die Verantwortung des gestarteten Prozesses fällt.
Beim Start von bat- und cmd-Skripten auf der Windows-Plattform zieht die Funktion CreateProcess() implizit die ausführbare Datei cmd.exe heran, selbst wenn die Anwendung diese nicht im Aufruf angibt. Das Programm cmd.exe enthält eine eigene komplexe Logik zur Argumenttrennung, um zwischen den eigenen Argumenten und den Argumenten des ausgeführten Skripts zu unterscheiden. Zum Schutz vor Argumenteinschleusung auf der Windows-Plattform werden in den Standardbibliotheken der Programmiersprachen separate Escaping-Handler verwendet, die sich jedoch durch Manipulation mit doppelten Anführungszeichen umgehen lassen.
Beispielsweise kann in einem Programm, das das Skript ‘./test.bat’ mit einem benutzerbasierten Argument aufruft, ein Angreifer den Wert ‘»&calc.exe’ übermitteln, der beim Ausführen des Skripts zur Zeichenfolge ‘C:\Windows\System32\cmd.exe /c .\test.bat «»&calc.exe»‘ erweitert wird und zum Start des Prozesses calc.exe führt. Diese Methode funktioniert auch beim impliziten Start von Skripten, wenn eine ausführbare Datei mit dem Namen „test“ ohne Angabe der Erweiterung gestartet wird und im einen der Verzeichnisse, die in der Umgebungsvariablen PATH erwähnt werden, eine Datei „test.bat“ vorhanden ist.
Derzeit ist ein Patch für die Standardbibliothek der Programmiersprache Rust veröffentlicht worden (CVE-2024-24576), der in das Update Rust 1.77.2 integriert ist. Updates zur Behebung der Schwachstelle für Node.js und PHP sind in Vorbereitung (die Versionen 8.2.18 und 8.3.5 wurden bereits getagt, jedoch wurden die Releases noch nicht angekündigt). Die Projekte Python, Ruby, Go, Erlang und Haskell haben vorerst nur in der Dokumentation eine Warnung über die Schwachstelle eingefügt, die bei unzureichender Escape-Behandlung von Sonderzeichen auftreten kann.
In Rust 1.77.2 wurde der Standardbibliothek eine zusätzliche Überprüfung hinzugefügt, die einen Fehler zurückgibt, wenn beim Starten eines Skripts im Argument Sonderzeichen vorhanden sind, die nicht zuverlässig sicher escaped werden können. Für Entwickler, die die Escape-Logik selbst implementieren, steht die Methode CommandExt::raw_arg zur Verfügung, die das Escaping bei Bibliotheksaufrufen vollständig deaktiviert.
Die Hinzufügung von Schutz wird dadurch erschwert, dass ein einfaches Maskieren von Anführungszeichen nicht ausreicht, da der Kommando-Interpreter Variablen wie „%PATH%“ verarbeitet und aufdeckt. Zum Beispiel kann das Anführungszeichen durch Manipulation der Umgebungsvariable „%CMDCMDLINE%“ eingefügt werden, indem anstelle von ‚»&calc.exe‘ – ‚%CMDCMDLINE:~-1%&calc.exe‘ angegeben wird.
Quelle: opennet.ru
