Wie man „versteckten Code“ aus ChatGPT und anderen LLMs entfernt

CometAPI
AnnaDec 2, 2025
Wie man „versteckten Code“ aus ChatGPT und anderen LLMs entfernt

Da große Sprachmodelle (LLMs) zunehmend lauffähigen Code generieren und in Entwicklungspipelines und Agenten-Stacks integriert werden, steigt das Risiko, dass versteckt or böswilligen Anweisungen – egal ob sie in Modellausgaben eingebettet, über Webseiten oder Drittanbieter-Plugins eingespielt oder während des Modelltrainings eingeführt werden – können bei der Ausführung dieses Codes zu unsicherem Verhalten führen.

Laut Nutzerberichten in Entwicklerkreisen erlitt ein Softwareentwickler einen katastrophalen Datenverlust – ungefähr 800 GB an Dateien wurden gelöscht, Einschließlich der die gesamte CursorAI-Anwendung selbst — nach Ausführung des mit Hilfe von generierten Codes Zwillinge 3 während der Arbeit im Inneren CursorAI IDEDa Entwickler zunehmend auf LLMs zur Codegenerierung angewiesen sind, werden die Folgen von ungeprüften oder unsicheren Skripten immer gravierender.

Daher ist es sehr wichtig zu wissen, wie man gefährliche, von LLM generierte Codes erkennt und entfernt.

Was versteht man unter „verstecktem Code“ im Kontext von ChatGPT und LLMs?

Was verstehen die Leute unter „verstecktem Code“?

„Versteckter Code“ ist ein Oberbegriff, den Entwickler verwenden, um alle eingebetteten Anweisungen oder ausführbaren Inhalte im Text (oder in Dateien) zu beschreiben, die ein LLM aufnimmt oder ausgibt, einschließlich:

  • Anweisungen im Prompt-Stil eingebettet in Benutzerinhalte (z. B. „Vorherige Anweisungen ignorieren…“ versteckt in einem PDF).
  • Unsichtbare Charaktere oder Nullbreiten-Leerzeichen, die dazu verwendet werden, Token zu verbergen oder Tokenisierungsannahmen zu verletzen.
  • Verschlüsselte Nutzdaten (Base64-, URL-kodierte, steganografische Einbettungen in Bilder oder Dokumente).
  • Verstecktes HTML/JS oder Skriptblöcke, die in formatierten Inhalten enthalten sind und von nachgelagerten Renderern interpretiert werden könnten.
  • Metadaten oder Annotationen (Dateikommentare, versteckte Ebenen in PDFs), die Abrufsysteme oder das Modell anweisen.
  • Implizite Verhaltensweisen entstehend durch generierten Code, der gefährliche APIs verwendet (z. B. eval, exec, subprocess, oder Netzwerk-/Systemaufrufe) - selbst wenn die Absicht nicht explizit böswillig ist.
  • Prompt-Einblendungen die dazu führen, dass das Modell Code generiert, der versteckte Befehle oder Backdoor-ähnliche Logik enthält, weil ein Angreifer die Eingabeaufforderung oder den Kontext manipuliert hat.

Diese Angriffsvektoren werden oft als prompte Injektion or indirekte sofortige Injektion Wenn das Ziel darin besteht, das Modellverhalten zu ändern, betrachtet die Sicherheitscommunity das Prompt-Injection-Verfahren mittlerweile als eine zentrale Schwachstelle in LLMs (Large Model Learning), und OWASP hat es als LLM-Risikokategorie formalisiert.

Worin unterscheidet sich dies von gewöhnlicher Malware oder XSS?

Der Unterschied ist der semantisch Die sogenannte Prompt-Injection zielt auf das Verhalten des Modells bei der Ausführung von Anweisungen ab, anstatt auf das Host-Betriebssystem oder die Browser-Rendering-Engine. Dennoch stellt versteckter HTML-Code oder Skriptcode, der im Web-Renderer ausgeführt wird, weiterhin einen ausführbaren Angriff dar (ähnlich wie XSS); daher müssen sowohl die semantische als auch die Ausführungsebene geschützt werden. Branchenführer und Forscher bezeichnen Prompt-Injection als eine der größten Sicherheitsherausforderungen und veröffentlichen fortlaufend Strategien zur Abwehr dieser Angriffe.

Warum kann LLM versteckten oder gefährlichen Code erzeugen?

Modellverhalten, Trainingsdaten und Unterrichtskontext

LLMs werden darauf trainiert, anhand von Kontext und Anweisungen plausible Fortsetzungen zu generieren. Enthält der Kontext Hinweise auf eine feindliche Handlung oder fordert ein Benutzer Code an, der mächtige Aktionen ausführt, kann das Modell Code ausgeben, der subtiles oder aktives Verhalten beinhaltet.

LLMs produzieren plausiblen, aber unsicheren Code

LLMs sind auf flüssiges und nützliches Arbeiten optimiert, nicht auf Sicherheit bei schädlichen Nebenwirkungen. Sie erzeugen gerne eine prägnante Zusammenfassung. rm -rf /path/to/dir or shutil.rmtree() Wenn Nutzer aufgefordert werden, „aufzuräumen“, reagieren sie oft selbstsicher – und da ihre Antworten häufig so formuliert sind, dass sie diese unreflektiert kopieren und weiterverbreiten, ohne sie ausreichend zu prüfen. Dieses Problem der „selbstsicheren Täuschung“ ist der Grund, warum scheinbar harmlose Anfragen gefährlich werden können.

Automatisierung von Verschleierungs-Workflows

Angreifer automatisieren die Codeverschleierung durch die Verkettung von LLM-Aufrufen: Ein Modell generiert eine Nutzlast, ein anderes überarbeitet sie, um die Signaturerkennung zu umgehen, und so weiter. Branchenberichte und Analysen von Anbietern aus dem Jahr 2025 dokumentieren diese „KI-gestützte Verschleierung“ als eine aufkommende Technik.

Wie kann man versteckten Code in Modellausgaben aufspüren?

Checkliste für die schnelle Triage

  1. Suche nach unsichtbarem/ungewöhnlichem Unicode (Zero-Width-Joiners, Zero-Width-Spaces, Byte Order Marks, Non-ASCII-Homoglyphen).
  2. Statische Analyse / AST-Parsing durchführen um die Nutzung leistungsstarker APIs zu ermitteln (eval, exec, subprocess, os.system, reflektierende Anrufe).
  3. Suchen Sie nach kodierten Nutzdaten (base64, Hex-Blobs, wiederholte lange Zeichenketten oder komprimierter Inhalt).
  4. Auf Verschleierungsmuster prüfen (Zeichenkettenverkettung zur Erstellung von API-Namen, Zeichenarithmetik, chr() Ketten).
  5. Semantische Analyse verwenden um zu bestätigen, ob der Code tatsächlich E/A-Operationen, Netzwerkoperationen oder Dateisystemänderungen durchführt.

Statische Mustererkennung (schnell, erste Zeile)

  • Sprachbewusstes Parsen und Linting. Die generierte Ausgabe wird sofort in Codeblöcke anstatt in Fließtext umgewandelt. Formatierer und Linter (Black/Prettier, pylint, eslint) werden ausgeführt. Die Lint-Regeln sollten die Verwendung von … kennzeichnen. eval, exec, rm -rf, rohe Unterprozessaufrufe oder Shell-Pipes, die Befehle dynamisch erstellen.
  • Token- und Stringmuster-Scanner. Suche nach risikoreichen Token und Mustern: sudoabsolute Pfade wie /home/, C:\, rm -rf, shutil.rmtree, subprocess.Popen, Inline-Base64-Blobs, lange, nicht interpretierbare Zeichenketten und Shebangs, die den Interpreterkontext wechseln.
  • Geheime Scans und Herkunftsprüfungen. Erkennen von fest codierten Anmeldeinformationen, URLs, die auf nicht vertrauenswürdige Registrierungsstellen verweisen, oder Code, der Pakete dynamisch aus beliebigen Quellen abruft.

Die statische Analyse deckt viele offensichtliche Probleme schnell auf und ist als Teil eines CI-Gateways kostengünstig durchzuführen.

Semantische und kontextuelle Erkennung (tiefer)

  • Absichtsanalyse. Verwenden Sie ein sekundäres Modell oder eine Regel-Engine, um die Absicht des generierten Codes zu klassifizieren: Handelt es sich um „Lesen“, „Schreiben“, „Löschen“, „Netzwerkzugriff“ oder „Installieren“? Alles, was als Löschen/Schreiben kategorisiert wird, sollte eine Eskalation auslösen.
  • Datenflussanalyse. Analysieren Sie den Code, um festzustellen, ob nicht validierte oder benutzerdefinierte Pfade zu schädlichen APIs führen können. Wenn beispielsweise eine Variable, die aus einer LLM-Ausgabe oder einer Remote-Datei stammt, später in einen Shell-Befehl eingebunden wird, markieren Sie dies.
  • Herkunftskorrelation. Protokollieren Sie den gesamten Gesprächsverlauf, die Systemeingabeaufforderung und die Kontextseiten. Wenn verdächtige Ausgaben mit einem bestimmten externen Dokument oder Plugin-Aufruf korrelieren, kann dies auf Prompt-Injection oder einen manipulierten Kontext hindeuten.

Dynamische und Verhaltenserkennung (am zuverlässigsten)

  • Sandbox-Ausführung mit Überwachung. Führe den generierten Code in einer streng eingeschränkten, temporären Umgebung ohne Netzwerkverbindung, ohne Host-Mounts und mit Systemaufruffilterung (seccomp) aus. Überwache Dateisystemaktivitäten, Netzwerkaufrufe, Prozessstarts und ungewöhnliche E/A-Operationen.
  • Kanarienvogel-Test. Bevor Sie den Code mit echten Daten ausführen, testen Sie ihn mit synthetischen Verzeichnissen, die Sentinel-Dateien enthalten; überwachen Sie ihn auf Löschungen oder Überschreibungen.
  • Verhaltensheuristiken. Achten Sie auf Schleifen, die übergeordnete Verzeichnisse durchlaufen, rekursive Operationen ohne Tiefenprüfung oder Umbenennungsmuster, die viele Dateien beschädigen könnten (z. B. wiederholtes Schreiben desselben Dateinamens).
    Die dynamische Analyse ist die einzige Möglichkeit, um Nutzdaten zu erkennen, die verschleiert, verzögert oder erst zur Laufzeit ausgelöst werden.

Wie sollte man versteckten Code entfernen oder neutralisieren, bevor man LLM-Ausgaben ausführt?

Defensive Entfernung vs. semantische Veränderung

Beim „Entfernen von verstecktem Code“ gibt es zwei Ziele:

  1. Desinfektion — Entfernen Sie Inhalte, die eindeutig kein Code sind oder verdächtig wirken (unsichtbarer Unicode, Zeichen mit der Breite Null, angehängte Base64-Daten). Die beabsichtigte, harmlose Logik sollte dadurch nicht beeinträchtigt werden.
  2. Neutralisation — Bei allen Aktionen, die externe Dienste ausführen oder aufrufen, sollten diese Aufrufe deaktiviert oder so eingestellt werden, dass sie keine Wirkung haben, bis sie verifiziert wurden.

Immer bevorzugen Neutralisierung + Überprüfung Vor dem blinden Löschen: Das willkürliche Entfernen von Codeabschnitten kann zu fehlerhaftem oder unerwartetem Verhalten führen. Ersetzen Sie stattdessen verdächtige Konstrukte durch explizite, protokollierte Stubs, die im Fehlerfall sicher funktionieren (Ausnahmen auslösen oder sichere Standardwerte zurückgeben).

Schritt 1 – Generierten Code als nicht vertrauenswürdige Daten behandeln

Führen Sie Code niemals direkt aus ChatGPT (oder einem anderen LLM) aus, ohne ihn vorher durch eine Entfernungs- und Härtungspipeline zu leiten. Diese Pipeline sollte durch Richtlinien vorgeschrieben und in CI/CD automatisiert werden.

Schritt 2 – Code extrahieren und kanonisieren

  • Text normalisieren und Nullbreitenzeichen entfernenEntfernen Sie Zeichen wie U+200B, U+200C, U+200D, U+FEFF und andere Nullbreiten-/Formatierungscodepunkte. Protokollieren Sie die entfernten Zeichen für Prüfzwecke. Dieser Schritt eliminiert viele „versteckte“ Kodierungen, die zur optischen Tarnung verwendet werden.
  • **Entfernen Sie jeglichen Nicht-Code-Kontext.**Entferne narrative Elemente, versteckte Kommentare und jegliche HTML-/Markdown-Wrapper. Konvertiere den Code mithilfe von Sprachformatierern (Black, Prettier) in die kanonische Form, sodass verschleierte Leerzeichen oder Steuerzeichen normalisiert werden.
  • Code mit diesen Konstrukten ablehnen oder unter Quarantäne stellen: dynamisch eval, rohe Unterprozessaufrufe (os.system, subprocess.Popen), inline Base64-Blobs dekodiert in die Ausführung oder eingebettet #! Direktiven, die versuchen, den Interpreterkontext zu verändern. Text normalisieren und Nullbreitenzeichen entfernen
    Entfernen Sie Zeichen wie U+200B, U+200C, U+200D, U+FEFF und andere Nullbreiten-/Formatierungscodepunkte. Protokollieren Sie die entfernten Zeichen für Prüfzwecke. Dieser Schritt eliminiert viele „versteckte“ Kodierungen, die zur optischen Tarnung verwendet werden.

Schritt 3 – In AST parsen und riskante Knoten ersetzen

Nachdem der Code in einen AST geparst wurde, werden Knoten gefunden, die die dynamische Ausführung aufrufen (z. B. execErsetzen Sie alle Funktionsnamen, die programmatisch generiert werden, durch sichere Platzhalter, die eine kontrollierte Ausnahme auslösen, die auf „Unsicheres dynamisches Verhalten blockiert“ hinweist. Generieren Sie eine bereinigte Kopie des AST-basierten Quellcodes zur Überprüfung. Führen Sie Sicherheitsmusterprüfungen durch (benutzerdefinierte semgrep-Regeln für Ihre Umgebung). Markieren und neutralisieren Sie alle gefundenen Übereinstimmungen.

Schritt 4 – Statische Härtung und Neuschreiben

  • Automatisiertes Umschreiben: Code durch einen automatisierten Bereinigungsprozess leiten, der gefährliche Aufrufe durch sichere Umhüllungen ersetzt – z. B. ersetzen os.system() / subprocess mit einem genehmigten, isolierten Executor, der Timeouts und Netzwerksperren durchsetzt.
  • FähigkeitssteuerungAPI-Schlüssel, Token oder Aufrufe privilegierter Endpunkte ändern oder entfernen; für lokale Tests durch Mock-Adapter ersetzen. Versehentliches Einbinden von Geheimnissen oder URLs verhindern.
  • Abhängigkeits-Umschreibungen: Block dynamisch pip / npm Die Installationen werden vom Code erstellt. Abhängigkeiten müssen über Ihre Registry deklariert und genehmigt werden.

Schritt 5 – Bewegen Sie sich in einem aggressiven Sandkasten

  • Kurzlebige Container / Mikro-VMsFühren Sie den Code in einem Container/einer VM aus, die über kein Netzwerk, keinen Zugriff auf Host-Anmeldeinformationen und nur eingeschränkten Dateisystemzugriff verfügt. Technologien wie gVisor, Firecracker oder dedizierte Dienste für die temporäre Ausführung eignen sich hierfür. Falls der Code auf E/A-Operationen zugreifen muss, verwenden Sie einen Proxy, der die entsprechenden Richtlinien durchsetzt.
  • Systemaufruffilter & Sicherheitskompensation: Beschränken Sie die zulässigen Systemaufrufe. Dateischreibvorgänge außerhalb eines temporären Verzeichnisses sollten blockiert werden.
  • Ressourcen-/Zeitbeschränkungen: CPU-/Speicher-/Zeitlimits festlegen, damit selbst logische Bomben nicht unbegrenzt laufen können.

Die Ausführung in einer Sandbox in Kombination mit deren Überwachung deckt häufig Schadsoftware auf, die bei statischen Prüfungen übersehen wird. Branchenrichtlinien und aktuelle Whitepapers empfehlen Sandboxing als zentrale Schutzmaßnahme.

Welche automatisierten Tools und Regeln sollten in Ihrer Pipeline enthalten sein?

Empfohlene Toolchain-Komponenten

  • Unicode-Bereinigungsmodul (Benutzerdefinierte oder vorhandene Bibliotheken). Normalisierte Zeichen müssen protokolliert werden.
  • Parser + AST-Analysator für jede Zielsprache (Python ast, typed-ast(JavaScript-Parser, Java-Parser).
  • Statische Analysatoren / SAST: Bandit (Python), Semgrep (mehrsprachig, anpassbar), ESLint mit Sicherheits-Plugins.
  • Entropie und Dekodierungsheuristiken: Base64/Hex/Gzip erkennen und zur Überprüfung weiterleiten.
  • Sandbox-LaufzeitMinimaler Container mit striktem seccomp/AppArmor-Profil oder Sprachinterpreter mit deaktivierten Systemaufrufen.
  • Richtliniendurchsetzer: Eine Komponente, die über zulässige Module, zulässige Endpunkte und sichere API-Wrapper entscheidet.
  • Audit-Trail: Unveränderliche Protokolle, die die Originalausgabe, die bereinigte Ausgabe, die Unterschiede und die Entscheidungen aufzeichnen.

Beispielhafte semgrep-Muster (konzeptionell)

Verwenden Sie kurze, prägnante Regeln, die auf die Verwendung gefährlicher Funktionen hinweisen. Zum Beispiel:

  • Flagge eval, exec, Function Konstruktor (JS), dynamische Importe oder aus Zeichenketten zusammengesetzte API-Namen.
  • Flag-Netzwerkanrufe außerhalb der Zulassungsliste (z. B. requests.get (an unbekannte Hosts).
  • Flag schreibt in sensible Pfade (/etc, Systemordner) oder das Erzeugen von Prozessen.

(Diese Einstellungen sollten als Konfigurationselemente pro Organisation beibehalten und im Laufe der Zeit angepasst werden.)

Was sind praktische Desinfektions-Schnipsel (sichere Beispiele)?

Nachfolgend finden Sie ungefährliche, defensive Beispiele, die Sie anpassen können. Desinfektion und Detektion Code-Schnipsel – keine Exploit-Anleitungen.

Beispiel: Nullbreitenzeichen entfernen (Python, defensiv)

import re
ZERO_WIDTH_RE = re.compile(r'')
def strip_zero_width(s: str) -> str:
    cleaned = ZERO_WIDTH_RE.sub('', s)
    return cleaned

Dadurch werden Zeichen entfernt, die Angreifer häufig verwenden, um Code in ansonsten sichtbarem Text zu verbergen. Protokollieren Sie stets, was entfernt wurde, und behandeln Sie die Entfernung als Teil des Prüfprotokolls.

Beispiel: AST analysieren und untersuchen (Python, konzeptionell)

import ast

def has_dynamic_exec(source: str) -> bool:
    tree = ast.parse(source)
    for node in ast.walk(tree):
        if isinstance(node, ast.Call):
            if getattr(node.func, 'id', '') in ('eval', 'exec',):
                return True
        if isinstance(node, ast.Attribute):
            if getattr(node, 'attr', '') in ('popen', 'system'):
                return True
    return False

If has_dynamic_exec Gibt der Code True zurück, wird er nicht ausgeführt; stattdessen wird der dynamische Knoten durch einen sicheren Stub ersetzt und eine Überprüfung angefordert.

Hinweis: Diese Beispiele dienen der Verteidigung. Entfernen Sie weder Protokollierung, Überwachung noch manuelle Überprüfung aus Ihrem Workflow.

Abschließende Gedanken: Behandeln Sie die Ausgabe von LLM immer wie nicht vertrauenswürdigen Code.

LMs sind leistungsstarke Produktivitätswerkzeuge – sie können eleganten Code erzeugen, Entwürfe beschleunigen und Routinearbeiten automatisieren. Doch sobald sie in die Ausführung übergehen, ändern sich die Sicherheitsregeln: **Modellausgaben müssen als nicht vertrauenswürdige Artefakte behandelt werden.**Die Kombination aus schnellen Sicherheitslückeneinschleusungen, Backdoor-Forschung und der Offenlegung realer Sicherheitslücken in den letzten 18 bis 30 Monaten macht deutlich: Die Risikofläche hat sich vergrößert und wird sich weiterentwickeln.

Praktische Abwehrmaßnahmen, die Parsing, statische Analyse, dynamische Tests in einer Sandbox, Governance und kontinuierliches Red Teaming kombinieren, stoppen die meisten Angriffe. Teams müssen aber auch in organisatorische Kontrollmechanismen investieren: das Prinzip der minimalen Berechtigungen, die Nachverfolgbarkeit von Zugriffsquellen und eine Kultur, die davon ausgeht, dass die Ergebnisse von LLM verifiziert werden müssen. Die Branche entwickelt Tools und Frameworks, um diese Vorgehensweisen zu vereinfachen; gleichzeitig verringert die Anwendung der obigen Checkliste das Risiko, dass eine versteckte Payload unbemerkt eindringt.

Entwickler können auf die neueste LLM-API zugreifen, wie zum Beispiel Claude Sonnet 4.5 API kombiniert mit einem nachhaltigen Materialprofil. Gemini 3 Pro Vorschau usw. über CometAPI, die neuste Modellversion wird immer mit der offiziellen Website aktualisiert. Erkunden Sie zunächst die Fähigkeiten des Modells in der Spielplatz und konsultieren Sie die API-Leitfaden Für detaillierte Anweisungen. Stellen Sie vor dem Zugriff sicher, dass Sie sich bei CometAPI angemeldet und den API-Schlüssel erhalten haben. CometAPI bieten einen Preis weit unter dem offiziellen Preis an, um Ihnen bei der Integration zu helfen.

Bereit loszulegen? → Melden Sie sich noch heute für CometAPI an !

Wenn Sie weitere Tipps, Anleitungen und Neuigkeiten zu KI erfahren möchten, folgen Sie uns auf VKX kombiniert mit einem nachhaltigen Materialprofil. Discord!

SHARE THIS BLOG

500+ Modelle in einer API

Bis zu 20% Rabatt