- Zufällig herausgefunden, wie OpenAI Code Execution funktioniert
- Erläuterung der gefundenen Methode, der Prompt-Injection-Strategie, der genauen Funktionsweise und des Reverse Engineerings, mit dem sich C + JavaScript ausführen lassen
Entdeckungsprozess
- Um Code zur Port-Zuweisung zu debuggen, wurde ChatGPT nach einem CLI-Befehl gefragt, der den Port-Status prüft, doch statt zu antworten führte ChatGPT ihn lokal aus
- Nach mehreren Handshake-Anfragen kam von localhost:8080/openapi.json eine Antwort zurück → damit gelang der Zugriff auf die interne OpenAPI-Spezifikation
- Die von dem FastAPI-Dienst erzeugte OpenAPI-Spezifikation war jedoch nur spärlich dokumentiert und daher wenig nützlich
Weitere Port-Erkundung
- Um die Rolle anderer Ports zu verstehen, wurden durch die KI Handshakes für HTTP, TCP, UDP, MySQL und Postgres versucht
- @dexhorthy entdeckte, dass auf ZeroMQ-Signale Antworten zurückkommen
0xff00000000000000257 → Antwort 0xff00000000000000017f
- Über eine Google-Suche wurde ein passender Informationslink gefunden: Analyse des ZeroMQ-Protokolls
- Es stellte sich heraus, dass es keine Message Queue, sondern ein Jupyter Kernel war (eine auf ZeroMQ basierende Ausführungsumgebung)
Zugriff auf das Dateisystem
- Die Bitte, alle Dateien auf dem Server aufzulisten, wurde abgelehnt
- Nach dem Hochladen einer Datei wurden das Upload-Verzeichnis und die übergeordneten Verzeichnisse untersucht
- Schließlich wurde das Verzeichnis .openai_internal entdeckt
- Der eigentliche Server läuft im Modul user_machine
- Die KI wurde angewiesen, Dateinamen und Dateiinhalte als pandas-DataFrame auszugeben → Wiederherstellung des Quellcodes erfolgreich
Verständnis der Umgebung
- Umgebungsvariablen einer unter Kubernetes laufenden Umgebung überprüft
- Statt Docker oder Firecracker wird gVisor zur Emulation von Systemaufrufen und zum Sandbox-Schutz verwendet
- Außer Localhost-Aufrufen ist das Netzwerk blockiert (kein DNS, kein Zugriff auf externe Websites)
- Die Linux-Kernel-Version ist mit einem Stand von 2016 sehr alt
Struktur der Sandbox
- Als die KI gefragt wurde, wo sie ausgeführt wird, bestätigte sie die Ausführung in einem Azure-Rechenzentrum
- Läuft auf Azure Kubernetes, mit gVisor zur Prozessisolierung
- Der Container verwendet tini als Init-Prozess
- Code wird im Python-Jupyter-Kernel ausgeführt → Ausgabe an die UI über die OpenAI-API
User Machine (Code-Ausführungsumgebung)
- Verwendet einen Python-Jupyter-Kernel
- Das Ausführungslimit beträgt standardmäßig 30 Sekunden (über die API anpassbar)
- In der Sandbox können mehrere Kernel gleichzeitig laufen
- Maximale Größe für Dateiuploads: 1 GB
Sicherheit
- Verbindung zum externen Netzwerk vollständig blockiert
- Zugriff auf Systemdateien blockiert, keine offengelegten Schwachstellen wie lokale Netzwerkports
- Die Sicherheit von OpenAI war sehr stark; außer über den RPC-Kanal war keine Datenexfiltration möglich
Ausführung von C und JavaScript
- Die KI entdeckte, dass das
gcc-Binary vorhanden ist
- Ein einfaches C-Programm geschrieben → kompiliert → erfolgreich ausgeführt
- Nach dem Hochladen von Duktape (leichtgewichtige JavaScript-Laufzeit) gelang das Kompilieren einer C-Datei
- Python kompiliert C → erstellt eine JavaScript-Laufzeit → JS-Code erfolgreich ausgeführt
Prompt-Engineering-Strategie
- Die KI wurde dazu gebracht, sich als in einer Sandbox laufend wahrzunehmen
- Zunächst mit mathematischen Operationen begonnen → danach schrittweise Dateisystemzugriff angefragt
- Durch die Dateisystemsuche erkannte die KI ihren Sandbox-Status → anschließend wurden Sicherheitslücken getestet
Fazit
- Die Code-Ausführungsumgebung von OpenAI ist sehr robust und sicher
- Durch Reverse Engineering der Funktionsweise und der internen Umgebung wurde jedoch deutlich, dass sich C und JS ausführen lassen
- Code-Ausführung ist für die Verarbeitung einfacher API-Antworten sehr nützlich
- Wenn komplexe Code-Ausführung nötig ist, sollte man eine eigene Lösung in Betracht ziehen oder Dienste wie freestyle.sh verwenden
1 Kommentare
Hacker-News-Kommentar
Ich habe früher schon SQLite-Erweiterungen in C geschrieben, kompiliert und dann zum Testen in Python geladen.
Kürzlich eine interessante Geschichte in einem Python-Podcast gehört.
pip installauszuführen, wurde aber abgewiesen.pip install fooversuchst?“ meldete es, es gebe keinen Fehler, und installierte es.Es ist nicht klar, ob tatsächlich Code ausgeführt wird oder ob das LLM das Ergebnis nur errät und ausgibt.
Da es in einem gesperrten Container läuft, gibt es keinen Grund, es auf Python zu beschränken.
So setzt man das „Open“ in „OpenAI“ um.
Danke für den interessanten Artikel.
Ein Beispiel, bei dem Simonw vor einem Jahr mit ChatGPT und C experimentiert hat.
Ich habe letztes Jahr etwas Ähnliches gemacht und auch ausprobiert, beliebige Binärdateien auszuführen.
Die Angst vor einem Sicherheitsversagen ist so groß, dass ich nicht einmal daran denken würde, eine solche App online zu veröffentlichen.
Sehr cool, und es wäre auch interessant, andere Dinge auszuprobieren, etwa einen C++-Daemon auszuführen oder etwas zu
cronhinzuzufügen.