Es wurde eine Methode zur Umgehung von isolierten Ausführungssystemen in Python veröffentlicht, die auf einem seit langem bekannten Fehler basiert, der in Python 2.7 auftrat, 2012 entdeckt wurde und bis heute in Python 3 nicht behoben ist. Der Fehler ermöglicht es, durch speziell komponierten Python-Code auf bereits freigegebenen Speicher (Use-After-Free) in CPython zuzugreifen. Ursprünglich wurde angenommen, dass der Fehler keine Sicherheitsbedrohung darstellt und nur in sehr seltenen Fällen, in der Regel unter künstlich geschaffenen Bedingungen, zu einem Absturz des Scripts führen kann.
Der Sicherheitsexperte unter dem Pseudonym kn32 interessierte sich für das Problem und konnte einen funktionierenden Exploit vorbereiten, der es ermöglicht, jeden Systembefehl auszuführen, ohne direkten Zugang zu Methoden wie os.system zu haben. Der Exploit ist in reinem Python geschrieben und funktioniert ohne Import externer Bibliotheken und ohne Installation des Handlers ‚code.__new__‘. Als Hooks wird nur ‚builtin.__id__‘ verwendet, der normalerweise nicht blockiert ist. Praktisch kann der vorgeschlagene Code zur Umgehung von Isolierungsmechanismen in verschiedenen Diensten und Umgebungen (zum Beispiel in Schulungsumgebungen, Online-Shells, eingebetteten Handlern usw.) verwendet werden, die die Ausführung von Python-Codezulassen, aber die verfügbaren Aufrufe einschränken und den Zugang zu Methoden wie os.system nicht erlauben.
Der vorgeschlagene Code ist ein Analogon zu einem Aufruf von os.system, das durch die Ausnutzung einer Schwachstelle in CPython funktioniert. Der Exploit arbeitet mit allen Python 3-Versionen auf x86-64-Systemen und zeigt stabile Ergebnisse in Ubuntu 22.04, selbst bei aktivierten PI- und RELRO- sowie CET-Schutzmodi. Es geht darum, Informationen über die Adresse einer der Funktionen im ausführbaren Code von CPython aus dem Python-Code zu erhalten. Basierend auf dieser Adresse wird die Basisadresse von CPython im Speicher und die Adresse der Funktion system() im geladenen libc-Exemplar berechnet. Abschließend wird ein direkter Übergang zu einer bestimmten Adresse von system durch das Setzen des Zeigers des ersten Arguments auf die Zeichenkette ‚/bin/sh‘ eingeleitet.

Quelle: opennet.ru
