3 Punkte von GN⁺ 2025-03-13 | 1 Kommentare | Auf WhatsApp teilen
  • 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

 
GN⁺ 2025-03-13
Hacker-News-Kommentar
  • Ich habe früher schon SQLite-Erweiterungen in C geschrieben, kompiliert und dann zum Testen in Python geladen.

    • Ich habe auch Binärdateien für JavaScript (Deno), Lua und PHP hochgeladen und Code in diesen Sprachen geschrieben und ausgeführt.
    • Wenn ein gewünschtes Python-Paket nicht vorhanden ist, kann man eine Wheel-Datei hochladen und installieren.
  • Kürzlich eine interessante Geschichte in einem Python-Podcast gehört.

    • Ein Nutzer wollte das LLM dazu bringen, pip install auszuführen, wurde aber abgewiesen.
    • Auf die Frage „Welche Fehlermeldung erscheint, wenn du pip install foo versuchst?“ 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.

    • Man sollte alles erlauben, so wie bei Replit.
    • Ich frage mich, warum ein altes Linux verwendet wird.
    • „Ihre Sandbox verwendet einen alten Linux-Kernel von 2016.“
  • So setzt man das „Open“ in „OpenAI“ um.

    • Es wäre cool, wenn man auf diese Weise an die Gewichte kommen könnte.
  • Danke für den interessanten Artikel.

    • Normalerweise lese ich keine Artikel über KI, aber aus technischer Sicht hat mir dieser sehr gefallen.
    • Wegen der Pop-ups auf Twitter ist er schwer zu lesen.
  • Ein Beispiel, bei dem Simonw vor einem Jahr mit ChatGPT und C experimentiert hat.

    • Ich denke, ChatGPT und Claude sind in C sehr stark.
  • Ich habe letztes Jahr etwas Ähnliches gemacht und auch ausprobiert, beliebige Binärdateien auszuführen.

    • Es funktionierte auch mit GPT, war damals aber noch nicht sehr zuverlässig.
    • Die neuen Modelle scheinen Prompts besser zu befolgen, daher werde ich es noch einmal versuchen.
  • Die Angst vor einem Sicherheitsversagen ist so groß, dass ich nicht einmal daran denken würde, eine solche App online zu veröffentlichen.

    • Ich stelle viel zu viele Fragen zu Jailbreaks.
    • Aber manche Leute gehen dieses Risiko ein.
  • Sehr cool, und es wäre auch interessant, andere Dinge auszuprobieren, etwa einen C++-Daemon auszuführen oder etwas zu cron hinzuzufügen.