Gratis account aanmaken
Codebeveiliging van LLM-toepassingen

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.

Code-uitvoering — CWE-94
kritiek
eval, exec, compile, new Function, pickle.loads, yaml.load — het antwoord wordt een programma.
Een shell — CWE-78
kritiek
os.system, subprocess, child_process.exec, execSync — het antwoord wordt een commando.
Een SQL-query — CWE-89
hoog
execute, raw, createQuery — text-to-SQL is precies dit patroon, en DROP TABLE is een plausibele aanvulling.
Een bestandspad — CWE-22
hoog
open, readFile, shutil.rmtree, unlink — ../../etc/passwd is net zo goed een plausibele aanvulling.
Een uitgaand verzoek — CWE-918
hoog
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)
Bron
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.
Stroom
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.
Eindpunt
exec(…) — de tekst wordt een programma in het proces van de toepassing zelf, met haar inloggegevens, haar netwerk en haar bestandssysteem.
Waarom dit ertoe doet
Alles wat 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

Geen test van het model
Wij onderzoeken het model niet actief, doen er geen red teaming op en beoordelen niet hoe het zich onder druk gedraagt. Niets hier zegt of een prompt met een jailbreak te omzeilen is: dat is uit de broncode niet te beslissen, en het beweren zou precies het soort uitspraak zijn dat deze engine bestaat om te vermijden.
Geen volledige detectie van prompt injection
Indirecte injectie wordt gemeld waar onvertrouwde inhoud aantoonbaar een prompt bereikt. Een kanaal dat wij niet in de code kunnen zien, is een kanaal dat wij niet melden.
Geen garantie over een agent
Wij melden dat een agent een hulpmiddel heeft gekregen dat code of commando's uitvoert. Wat die agent vervolgens tijdens de uitvoering doet, ligt buiten wat statische analyse kan beslissen.
Aanvullend op AI-beveiliging tijdens de uitvoering
Guardrails, evaluatieopstellingen en red teaming beantwoorden vragen die dit niet kan beantwoorden, en dit beantwoordt vragen die zij niet kunnen beantwoorden. Geen van beide vervangt het andere.

Andere LLM-specifieke risico's in de code

Elk ervan is op een voorbeeld tegen de huidige engine afgegaan voordat het hier werd opgeschreven.

Geheimen en persoonsgegevens geïnterpoleerd in een prompt — CWE-200
Een 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.
Een agent met een hulpmiddel dat code of commando's uitvoert — CWE-250
PythonREPLTool, ShellTool, een code-interpreter, een terminal. Zoiets toekennen maakt van elke vraag over prompt injection een vraag over uitvoering van code op afstand.
Een beveiliging van het framework weer uitgezet — CWE-502
allow_dangerous_deserialization=True, trust_remote_code=True, dangerouslyAllow… — een framework had dit uitgeschakeld omdat het onveilig was.
Veiligheidsinstellingen van de aanbieder uitgeschakeld — CWE-693
BLOCK_NONE, safety_settings=None, moderation=false.
Een prompt of agentdefinitie die tijdens de uitvoering wordt opgehaald — CWE-829
hub.pull(…), een promptsjabloon dat over HTTP wordt geladen. Wie dat eindpunt beheert, beheert de instructies.
Onvertrouwde inhoud rechtstreeks in een prompt geladen — CWE-77
Een gescrapete pagina, een PDF, een repository, een wiki. Dit is het kanaal voor indirecte injectie, herkend aan waar de tekst vandaan komt en niet aan wat hij zegt.
Een API-sleutel van een model in de broncode — CWE-798
sk-…, sk-ant-…, AIza…, hf_… in de repository vastgelegd.
Een ingetrokken of opgevolgd model vastgezet in de code — CWE-1104
text-davinci-*, gpt-4-0314, claude-instant — zwakkere instructiehiërarchie, geen scheiding van de systeemprompt.

Waarom u hier iets van zou geloven

Een gepubliceerde benchmark
Precisie, recall en F1 per CWE, per taal en per analyselaag, over een geversioneerd, met de hand gelabeld corpus. Bekijk de cijfers.
Een gepubliceerd bereik
Elke laag die wij niet meten wordt benoemd, met de reden. Lees de methodologie.
Validatie op publieke code
Geanalyseerde repository's en commits, aangetroffen talen, voltooiingspercentage en determinisme — volumes en percentages, geen uitspraken over nauwkeurigheid. Bekijk de runs.
Elke bevinding draagt haar bewijs
Het bestand, de regel, de aangetroffen constructie en de CWE. Een bevinding die u niet kunt controleren, is een bevinding waarnaar u niet zou moeten handelen.

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.