De uitvoer van uw model is onvertrouwde invoer. Vind waar uw code dat vergeet.
Statische analyse van de code rond uw LLM — de code die de prompt opbouwt, het model aanroept en iets met het antwoord doet. Niet het model. Niet de weerbaarheid van de prompt tegen een jailbreak. De code.
Het gratis abonnement omvat 3 projecten en 30 analyses per maand, zonder limiet op het aantal gebruikers en zonder creditcard. Deze analyse valt daaronder.
Het probleem
Een model is geen bibliotheek. Het is een onvertrouwde interpreter: u geeft het een tekenreeks en het geeft er een terug. Alles wat die tekenreeks heeft beïnvloed — de prompt van de gebruiker zelf, een pagina die het te zien kreeg, een document dat het meekreeg, het resultaat van een ander hulpmiddel — heeft het antwoord beïnvloed.
Het antwoord is onschadelijk totdat de code er een bevoegdheid aan geeft. Het gevaar is niet dat een model iets gezegd heeft; het is dat een programma het geloofd heeft. Elke plek waar een programma gegenereerde tekst behandelt als code, als een commando, als een query, als een pad of als een URL is een injectie met één sprong extra — en anders dan de vraag of een prompt met een jailbreak te omzeilen is, is die sprong zichtbaar in de broncode.
Waar Cybseco naar zoekt
Waar modeluitvoer iets bereikt dat handelt. Dit zijn de categorieën, ernstniveaus en CWE-identificatoren van de engine zelf.
eval, exec, compile, new Function, pickle.loads, yaml.load — het antwoord wordt een programma.os.system, subprocess, child_process.exec, execSync — het antwoord wordt een commando.execute, raw, createQuery — text-to-SQL is precies dit patroon, en DROP TABLE is een plausibele aanvulling.open, readFile, shutil.rmtree, unlink — ../../etc/passwd is net zo goed een plausibele aanvulling.requests, httpx, fetch, axios, urlopen — server-side request forgery, gekozen door het model.Een concreet voorbeeld
Negen regels, en de hele vorm van het risico.
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(…) — een aanroep die modeluitvoer teruggeeft. De analyzer bindt de variabele waaraan die is toegekend, en juist daardoor kan hij de waarde door de functie volgen zonder interprocedurele analyse.answer bevat tekst die door een aanvaller is beïnvloed. Tussen de aanroep en het eindpunt inspecteert niets die tekst, beperkt niets haar en brengt niets haar terug tot een vaste verzameling bewerkingen.exec(…) — de tekst wordt een programma in het proces van de toepassing zelf, met haar inloggegevens, haar netwerk en haar bestandssysteem.task kan beïnvloeden — rechtstreeks, of via een document dat het model te zien kreeg — kiest wat er draait. Dit is uitvoering van code op afstand met één sprong extra.Uitgevoerd op de huidige engine levert dat fragment één bevinding op: llm-output-to-code-execution, CWE-94, ernst kritiek, zekerheid hoog, op de regel exec. De zekerheid is hoog omdat de variabele gebonden is aan een echte completion-aanroep. Een naam die er alleen maar uitziet als een modelantwoord — llm_response, reply — wordt in plaats daarvan met gemiddelde zekerheid gemeld, want dat is een gok en iets anders beweren zou liegen over het bewijs zijn.
Wat dit niet is
Andere LLM-specifieke risico's in de code
Elk ervan is op een voorbeeld tegen de huidige engine afgegaan voordat het hier werd opgeschreven.
api_key, een wachtwoord, een IBAN of een medisch dossier in de tekst die u verstuurt. Gemeld waar daadwerkelijk een promptcontext wordt opgebouwd, niet bij elke f-string die toevallig een sleutel bevat.PythonREPLTool, ShellTool, een code-interpreter, een terminal. Zoiets toekennen maakt van elke vraag over prompt injection een vraag over uitvoering van code op afstand.allow_dangerous_deserialization=True, trust_remote_code=True, dangerouslyAllow… — een framework had dit uitgeschakeld omdat het onveilig was.BLOCK_NONE, safety_settings=None, moderation=false.hub.pull(…), een promptsjabloon dat over HTTP wordt geladen. Wie dat eindpunt beheert, beheert de instructies.sk-…, sk-ant-…, AIza…, hf_… in de repository vastgelegd.text-davinci-*, gpt-4-0314, claude-instant — zwakkere instructiehiërarchie, geen scheiding van de systeemprompt.Waarom u hier iets van zou geloven
Aanbiederonafhankelijk door opzet. De analyzer herkent de vorm — iets produceert tekst, iets verbruikt die — in plaats van de schrijfwijze van één SDK. Hij noemt het framework dat hij zag wanneer dat kan (OpenAI, Anthropic, Google, Azure OpenAI, Mistral, Bedrock, Ollama, LiteLLM, LangChain, LangGraph, LlamaIndex, Semantic Kernel, AutoGen, CrewAI, Hugging Face), zodat een bevinding kan zeggen waar zij vandaan komt. Dat is een etiket op de bevinding, geen integratie per SDK, en een framework dat niet in die lijst staat wordt op precies dezelfde manier geanalyseerd.
Zie Cybseco redeneren over een echt systeem
Bekijk de interactieve demo en vraag daarna een begeleide proef aan voor uw team.