Die Ausgabe Ihres Modells ist nicht vertrauenswürdige Eingabe. Finden Sie, wo Ihr Code das vergisst.
Statische Analyse des Codes rund um Ihr LLM — des Codes, der den Prompt baut, das Modell aufruft und mit der Antwort etwas anfängt. Nicht das Modell. Nicht die Widerstandsfähigkeit des Prompts gegen einen Jailbreak. Der Code.
Der kostenlose Tarif umfasst 3 Projekte und 30 Analysen pro Monat, ohne Begrenzung der Nutzerzahl und ohne Kreditkarte. Diese Analyse läuft darin.
Das Problem
Ein Modell ist keine Bibliothek. Es ist ein nicht vertrauenswürdiger Interpreter: Sie geben ihm eine Zeichenkette, und es gibt Ihnen eine zurück. Was immer diese Zeichenkette beeinflusst hat — der Prompt des Nutzers, eine Seite, die ihm gezeigt wurde, ein Dokument, das ihm gegeben wurde, das Ergebnis eines anderen Werkzeugs — hat die Antwort beeinflusst.
Die Antwort ist harmlos, solange der Code ihr keine Fähigkeit gibt. Die Gefahr liegt nicht darin, dass ein Modell etwas gesagt hat, sondern darin, dass ein Programm es geglaubt hat. Jede Stelle, an der ein Programm erzeugten Text als Code, als Befehl, als Abfrage, als Pfad oder als URL behandelt, ist eine Injection mit einem zusätzlichen Sprung — und anders als die Frage, ob ein Prompt per Jailbreak umgangen werden kann, ist dieser Sprung im Quelltext sichtbar.
Wonach Cybseco sucht
Dort, wo Modellausgabe etwas erreicht, das handelt. Dies sind die Kategorien, Schweregrade und CWE-Kennungen der Engine selbst.
eval, exec, compile, new Function, pickle.loads, yaml.load — die Antwort wird zum Programm.os.system, subprocess, child_process.exec, execSync — die Antwort wird zum Befehl.execute, raw, createQuery — Text-to-SQL ist genau dieses Muster, und DROP TABLE ist eine plausible Vervollständigung.open, readFile, shutil.rmtree, unlink — ../../etc/passwd ist ebenfalls eine plausible Vervollständigung.requests, httpx, fetch, axios, urlopen — Server-Side Request Forgery, vom Modell gewählt.Ein konkretes Beispiel
Neun Zeilen, und die ganze Gestalt des Risikos.
from openai import OpenAI
client = OpenAI()
def run_plan(task: str):
answer = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": task}],
)
exec(answer.choices[0].message.content)client.chat.completions.create(…) — ein Aufruf, der Modellausgabe zurückgibt. Der Analyzer bindet die Variable, der sie zugewiesen wurde; genau das erlaubt ihm, dem Wert ohne interprozedurale Analyse durch die Funktion zu folgen.answer enthält von einem Angreifer beeinflussten Text. Zwischen Aufruf und Senke prüft ihn nichts, schränkt ihn nichts ein und bildet ihn nichts auf eine feste Menge von Operationen ab.exec(…) — der Text wird zum Programm im Prozess der Anwendung selbst, mit deren Zugangsdaten, deren Netzwerk und deren Dateisystem.task beeinflussen kann — direkt oder über ein Dokument, das dem Modell gezeigt wurde — wählt aus, was ausgeführt wird. Das ist Remote Code Execution mit einem zusätzlichen Sprung.Gegen die aktuelle Engine ausgeführt, erzeugt dieser Ausschnitt einen Befund: llm-output-to-code-execution, CWE-94, Schweregrad kritisch, Konfidenz hoch, in der Zeile exec. Die Konfidenz ist hoch, weil die Variable an einen tatsächlichen Completion-Aufruf gebunden ist. Ein Name, der nur wie eine Modellantwort aussieht — llm_response, reply — wird stattdessen mit mittlerer Konfidenz gemeldet, denn das ist eine Vermutung, und etwas anderes zu behaupten wäre eine Lüge über die Beweislage.
Was dies nicht ist
Weitere LLM-spezifische Risiken im Code
Jedes wurde an einem Beispiel gegen die aktuelle Engine ausgelöst, bevor es hier aufgeschrieben wurde.
api_key, ein Passwort, eine IBAN oder ein Patientendatensatz im Text, den Sie senden. Gemeldet dort, wo tatsächlich ein Prompt-Kontext aufgebaut wird, nicht bei jedem f-String, der zufällig einen Schlüssel enthält.PythonREPLTool, ShellTool, ein Code-Interpreter, ein Terminal. Eines davon zu gewähren macht aus jeder Prompt-Injection-Frage eine Frage nach Remote Code Execution.allow_dangerous_deserialization=True, trust_remote_code=True, dangerouslyAllow… — ein Framework hatte das deaktiviert, weil es unsicher war.BLOCK_NONE, safety_settings=None, moderation=false.hub.pull(…), eine über HTTP geladene Prompt-Vorlage. Wer diesen Endpunkt kontrolliert, kontrolliert die Anweisungen.sk-…, sk-ant-…, AIza…, hf_… im Repository eingecheckt.text-davinci-*, gpt-4-0314, claude-instant — schwächere Anweisungshierarchie, keine Trennung des System-Prompts.Warum Sie das alles glauben sollten
Anbieterunabhängig von Grund auf. Der Analyzer erkennt die Form — etwas erzeugt Text, etwas verbraucht ihn — und nicht die Schreibweise eines bestimmten SDK. Er benennt das Framework, das er gesehen hat, wenn er es kann (OpenAI, Anthropic, Google, Azure OpenAI, Mistral, Bedrock, Ollama, LiteLLM, LangChain, LangGraph, LlamaIndex, Semantic Kernel, AutoGen, CrewAI, Hugging Face), damit ein Befund sagen kann, woher er stammt. Das ist eine Kennzeichnung am Befund, keine Integration je SDK, und ein Framework, das in dieser Liste fehlt, wird genau gleich analysiert.
Sehen Sie Cybseco über ein reales System nachdenken
Sehen Sie sich die interaktive Demo an und fordern Sie dann einen begleiteten Test für Ihr Team an.