Anwendungen, die Skripte im Format bat und cmd auf der Windows-Plattform mit den 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 Escapewirkung fĂŒr Sonderzeichen ĂŒbergeben werden. Die Schwachstelle erhielt den Codenamen BatBadBut und zeigt sich in Anwendungen, die Standardbibliotheken von Programmiersprachen wie Rust, PHP, Node.js, Python, Ruby, Go, Erlang und Haskell verwenden.
Das Problem wird als Schwachstelle bezeichnet, da es Funktionen der Bibliothek wie Command::arg und Command::args in Rust betrifft, die fĂŒr die direkte Ăbergabe von Argumenten an den Prozess ohne deren Verarbeitung durch den Befehlsinterpreter vorgesehen sind. Es wird angenommen, dass der Entwickler der Anwendung die Argumente möglicherweise nicht ĂŒberprĂŒft, da sie 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 Verwendung der API CreateProcess die Argumente als eine einzige Zeichenfolge formatiert, deren Analyse in die Verantwortung des gestarteten Prozesses fĂ€llt.
Beim Start von bat- und cmd-Skripten auf der Windows-Plattform ruft die Funktion CreateProcess() implizit die ausfĂŒhrbare Datei cmd.exe auf, selbst wenn die Anwendung diese beim Aufruf nicht angibt. Das Programm cmd.exe enthĂ€lt eine eigene komplexe Logik zur Argumenttrennung, um eigene Argumente, die des gestarteten Skripts und die Argumente dieses Skripts zu trennen. Um die Substitution von Argumenten auf der Windows-Plattform zu schĂŒtzen, werden in den Standardbibliotheken von Programmiersprachen separate Escaping-Handler angewendet, die sich jedoch durch Manipulation mit doppelten AnfĂŒhrungszeichen umgehen lassen.
Beispielsweise kann in einem Programm, das das Skript â./test.batâ mit einem Argument auf Basis von Benutzereingaben aufruft, ein Angreifer den Wert â»&calc.exeâ ĂŒbergeben, der beim Start des Skripts in die Zeichenfolge âC:\Windows\System32\cmd.exe /c .\test.bat «»&calc.exeâ umgewandelt wird und den Prozess calc.exe startet. Diese Methode funktioniert auch beim impliziten Start von Skripten, wenn die ausfĂŒhrbare Datei mit dem Namen âtestâ ohne Erweiterung aufgerufen wird und in einem der in der Umgebungsvariable PATH aufgefĂŒhrten Verzeichnisse die Datei âtest.batâ vorhanden ist.
Derzeit wurde bereits ein Patch (CVE-2024-24576) fĂŒr die Standardbibliothek der Programmiersprache Rust veröffentlicht und ist Teil des Updates auf Rust 1.77.2. Updates zur Behebung der Schwachstelle fĂŒr Node.js und PHP befinden sich in Vorbereitung (die Versionen 8.2.18 und 8.3.5 sind bereits festgelegt, aber die Veröffentlichungen wurden noch nicht angekĂŒndigt). Die Projekte Python, Ruby, Go, Erlang und Haskell haben bislang lediglich Warnhinweise in der Dokumentation eingefĂŒgt, dass die Schwachstelle bei unzureichender Escaping von Sonderzeichen auftreten kann.
In Rust 1.77.2 wurde eine zusĂ€tzliche ĂberprĂŒfung in die Standardbibliothek integriert, die einen Fehler zurĂŒckgibt, wenn der Argument des aufgerufenen Skripts Sonderzeichen enthĂ€lt, die nicht garantierten sicher escaped werden können. FĂŒr Entwickler, die die Escaping-Logik eigenstĂ€ndig implementieren, steht die Methode CommandExt::raw_arg zur VerfĂŒgung, die das Escaping auf Seiten der Bibliotheksaufrufe vollstĂ€ndig deaktiviert.
Das HinzufĂŒgen von SchutzmaĂnahmen wird dadurch erschwert, dass einfaches Escaping von doppelten AnfĂŒhrungszeichen nicht ausreicht, da der Befehlsshell Variablen wie â%PATH%â verarbeitet und enthĂŒllt. Beispielsweise kann ein AnfĂŒhrungszeichen ĂŒber die Manipulation mit der Umgebungsvariablen â%CMDCMDLINE%â eingebracht werden, indem man statt â"&calc.exeâ â â%CMDCMDLINE:~-1%&calc.exeâ angibt.
Quelle: opennet.ru
