Din models output er utroværdigt input. Find der, hvor din kode glemmer det.
Statisk analyse af koden omkring din LLM — den kode, der bygger prompten, kalder modellen og gør noget ved svaret. Ikke modellen. Ikke promptens modstandskraft over for et jailbreak. Koden.
Den gratis plan dækker 3 projekter og 30 analyser om måneden, uden grænse for antal brugere og uden betalingskort. Denne analyse er omfattet.
Problemet
En model er ikke et bibliotek. Den er en utroværdig fortolker: du giver den en streng, og den giver en tilbage. Alt, hvad der påvirkede den streng — brugerens egen prompt, en side den fik vist, et dokument den fik, resultatet fra et andet værktøj — påvirkede svaret.
Svaret er harmløst, indtil koden giver det en evne. Faren er ikke, at en model sagde noget; den er, at et program troede på det. Hvert sted, hvor et program behandler genereret tekst som kode, som en kommando, som en forespørgsel, som en sti eller som en URL, er en injection med ét spring mere — og i modsætning til spørgsmålet om, hvorvidt en prompt kan omgås med et jailbreak, er det spring synligt i kildekoden.
Hvad Cybseco leder efter
Hvor modeloutput når noget, der handler. Det er motorens egne kategorier, alvorsgrader og CWE-identifikatorer.
eval, exec, compile, new Function, pickle.loads, yaml.load — svaret bliver til et program.os.system, subprocess, child_process.exec, execSync — svaret bliver til en kommando.execute, raw, createQuery — text-to-SQL er præcis dette mønster, og DROP TABLE er en plausibel fuldførelse.open, readFile, shutil.rmtree, unlink — ../../etc/passwd er lige så plausibel en fuldførelse.requests, httpx, fetch, axios, urlopen — server-side request forgery, valgt af modellen.Et konkret eksempel
Ni linjer, og hele risikoens form.
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(…) — et kald, der returnerer modeloutput. Analysatoren binder den variabel, det blev tildelt, og netop det gør det muligt at følge værdien gennem funktionen uden interprocedural analyse.answer indeholder tekst, en angriber har påvirket. Mellem kaldet og slutpunktet er der intet, der inspicerer den, begrænser den eller afbilder den på et fast sæt operationer.exec(…) — teksten bliver til et program i applikationens egen proces, med dens legitimationsoplysninger, dens netværk og dens filsystem.task — direkte eller gennem et dokument, modellen fik vist — vælger, hvad der kører. Dette er fjernudførelse af kode med ét spring mere.Kørt mod den nuværende motor giver det uddrag ét fund: llm-output-to-code-execution, CWE-94, alvorsgrad kritisk, tillid høj, på linjen exec. Tilliden er høj, fordi variablen er bundet til et faktisk completion-kald. Et navn, der blot ligner et modelsvar — llm_response, reply — rapporteres i stedet med middel tillid, for det er et gæt, og at påstå andet ville være at lyve om beviset.
Hvad dette ikke er
Andre LLM-specifikke risici i koden
Hver enkelt blev udløst på en prøve mod den nuværende motor, før den blev skrevet her.
api_key, et kodeord, et IBAN eller en patientjournal placeret i den tekst, du sender. Rapporteres, hvor en reel promptkontekst bliver bygget, ikke på enhver f-streng, der tilfældigvis indeholder en nøgle.PythonREPLTool, ShellTool, en kodefortolker, en terminal. At give ét af dem gør ethvert spørgsmål om prompt injection til et spørgsmål om fjernudførelse af kode.allow_dangerous_deserialization=True, trust_remote_code=True, dangerouslyAllow… — et framework slog den fra, fordi den var usikker.BLOCK_NONE, safety_settings=None, moderation=false.hub.pull(…), en promptskabelon hentet over HTTP. Den, der kontrollerer det endepunkt, kontrollerer instruktionerne.sk-…, sk-ant-…, AIza…, hf_… committet til repositoriet.text-davinci-*, gpt-4-0314, claude-instant — svagere instruktionshierarki, ingen adskillelse af systemprompten.Hvorfor du skulle tro på noget af dette
Udbyderuafhængig af konstruktion. Analysatoren genkender formen — noget producerer tekst, noget forbruger den — frem for ét bestemt SDK's skrivemåde. Den nævner det framework, den så, når den kan (OpenAI, Anthropic, Google, Azure OpenAI, Mistral, Bedrock, Ollama, LiteLLM, LangChain, LangGraph, LlamaIndex, Semantic Kernel, AutoGen, CrewAI, Hugging Face), så et fund kan sige, hvor det kom fra. Det er en mærkat på fundet, ikke en integration pr. SDK, og et framework, der ikke står på listen, analyseres på nøjagtig samme måde.
Se Cybseco ræsonnere om et virkeligt system
Se den interaktive demo, og anmod derefter om en guidet prøveperiode til dit team.