Otvori besplatan račun
Sigurnost koda aplikacija s LLM-om

Izlaz vašeg modela je nepouzdan ulaz. Pronađite mjesta na kojima to vaš kod zaboravlja.

Statička analiza koda oko vašeg LLM-a — koda koji gradi prompt, poziva model i nešto radi s odgovorom. Ne modela. Ne otpornosti prompta na jailbreak. Koda.

Besplatni paket obuhvaća 3 projekta i 30 analiza mjesečno, bez ograničenja broja korisnika i bez platne kartice. Ova analiza u njega ulazi.

Problem

Model nije biblioteka. On je nepouzdan interpreter: predate mu niz znakova, a on vam vrati drugi. Sve što je utjecalo na taj niz — korisnikov vlastiti prompt, stranica koja mu je pokazana, dokument koji je dobio, rezultat drugog alata — utjecalo je i na odgovor.

Odgovor je bezopasan sve dok mu kod ne da sposobnost djelovanja. Opasnost nije u tome što je model nešto rekao; opasnost je u tome što je program u to povjerovao. Svako mjesto na kojem program s generiranim tekstom postupa kao s kodom, naredbom, upitom, putanjom ili URL-om jest injekcija jedan skok dalje — i za razliku od pitanja može li se prompt zaobići jailbreakom, taj je skok vidljiv u izvornom kodu.

Što Cybseco traži

Tamo gdje izlaz modela dospije do nečega što djeluje. Ovo su vlastite kategorije, ozbiljnosti i CWE identifikatori samog pogona.

Izvršavanje koda — CWE-94
kritična
eval, exec, compile, new Function, pickle.loads, yaml.load — odgovor postaje program.
Ljuska — CWE-78
kritična
os.system, subprocess, child_process.exec, execSync — odgovor postaje naredba.
SQL upit — CWE-89
visoka
execute, raw, createQuery — text-to-SQL je upravo ovaj obrazac, a DROP TABLE je uvjerljiv nastavak.
Putanja u datotečnom sustavu — CWE-22
visoka
open, readFile, shutil.rmtree, unlink — ../../etc/passwd jednako je uvjerljiv nastavak.
Odlazni zahtjev — CWE-918
visoka
requests, httpx, fetch, axios, urlopen — krivotvorenje zahtjeva na strani poslužitelja, koje bira model.

Konkretan primjer

Devet redaka i cijeli oblik rizika.

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)
Izvor
client.chat.completions.create(…) — poziv koji vraća izlaz modela. Analizator veže varijablu kojoj je dodijeljen, i upravo mu to omogućuje praćenje vrijednosti kroz funkciju bez međuproceduralne analize.
Tok
answer sadrži tekst na koji je napadač mogao utjecati. Između poziva i ponora ništa ga ne pregledava, ne ograničava niti ne svodi na nepromjenjiv skup operacija.
Ponor
exec(…) — tekst postaje program u vlastitom procesu aplikacije, s njezinim vjerodajnicama, njezinom mrežom i njezinim datotečnim sustavom.
Zašto je to važno
Sve što može utjecati na task — izravno ili preko dokumenta pokazanog modelu — bira što će se izvršiti. Ovo je udaljeno izvršavanje koda jedan skok dalje.

Pokrenut na trenutnom pogonu, taj isječak daje jedan nalaz: llm-output-to-code-execution, CWE-94, ozbiljnost kritična, pouzdanost visoka, na retku exec. Pouzdanost je visoka jer je varijabla vezana uz stvarni completion poziv. Ime koje tek sliči odgovoru modela — llm_response, reply — prijavljuje se sa srednjom pouzdanošću, jer je to pretpostavka, a tvrditi drukčije značilo bi lagati o dokazima.

Što ovo nije

Nije test modela
Model ne sondiramo, ne provodimo nad njim red teaming i ne ocjenjujemo kako se ponaša pod pritiskom. Ništa ovdje ne govori može li se prompt zaobići jailbreakom: to se iz izvornog koda ne može utvrditi, a tvrditi to bila bi upravo ona vrsta izjave koju ovaj pogon postoji da izbjegne.
Nije potpuno otkrivanje injekcije prompta
Neizravnu injekciju prijavljujemo ondje gdje nepouzdan sadržaj dokazivo dospije do prompta. Kanal koji ne vidimo u kodu kanal je koji ne prijavljujemo.
Nije jamstvo o agentu
Prijavljujemo da je agentu dodijeljen alat koji izvršava kod ili naredbe. Što agent potom učini u vrijeme izvođenja, izvan je onoga što statička analiza može utvrditi.
Dopuna sigurnosti umjetne inteligencije u izvođenju
Zaštitne ograde, okviri za evaluaciju i red teaming odgovaraju na pitanja na koja ovo ne može, a ovo odgovara na pitanja na koja oni ne mogu. Nijedno ne zamjenjuje drugo.

Ostali rizici svojstveni LLM-u u kodu

Svaki je prije zapisivanja ovdje pokrenut na uzorku protiv trenutnog pogona.

Tajne i osobni podaci umetnuti u prompt — CWE-200
api_key, lozinka, IBAN ili medicinski zapis smješten u tekst koji šaljete. Prijavljuje se ondje gdje se doista gradi kontekst prompta, a ne kod svakog f-stringa koji slučajno sadrži ključ.
Agent s alatom koji izvršava kod ili naredbe — CWE-250
PythonREPLTool, ShellTool, interpreter koda, terminal. Dodjela jednog od njih pretvara svako pitanje o injekciji prompta u pitanje o udaljenom izvršavanju koda.
Zaštita okvira ponovno isključena — CWE-502
allow_dangerous_deserialization=True, trust_remote_code=True, dangerouslyAllow… — okvir ju je isključio jer je bila nesigurna.
Isključene sigurnosne kontrole pružatelja — CWE-693
BLOCK_NONE, safety_settings=None, moderation=false.
Prompt ili definicija agenta dohvaćeni u vrijeme izvođenja — CWE-829
hub.pull(…), predložak prompta učitan preko HTTP-a. Tko upravlja tom krajnjom točkom, upravlja uputama.
Nepouzdan sadržaj učitan izravno u prompt — CWE-77
Dohvaćena stranica, PDF, repozitorij, wiki. Ovo je kanal neizravne injekcije, prepoznat po tome odakle je tekst došao, a ne po tome što govori.
API ključ modela zapisan u izvornom kodu — CWE-798
sk-…, sk-ant-…, AIza…, hf_… predani u repozitorij.
Povučen ili zamijenjen model fiksiran u kodu — CWE-1104
text-davinci-*, gpt-4-0314, claude-instant — slabija hijerarhija uputa, bez odvajanja sistemskog prompta.

Zašto bilo čemu od ovoga vjerovati

Objavljeni benchmark
Preciznost, odziv i F1 po CWE-u, po jeziku i po sloju analize, nad verzioniranim, ručno označenim korpusom. Pogledajte brojke.
Objavljen opseg
Svaki sloj koji ne mjerimo imenovan je, s razlogom. Pročitajte metodologiju.
Provjera na javnom kodu
Analizirani repozitoriji i commiti, zatečeni jezici, stopa dovršenosti i determinizam — količine i stope, a ne tvrdnje o točnosti. Pogledajte izvođenja.
Svaki nalaz nosi svoj dokaz
Datoteka, redak, pronađena konstrukcija i CWE. Nalaz koji ne možete provjeriti nalaz je po kojem ne biste trebali postupati.

Neovisan o pružatelju po svojoj konstrukciji. Analizator prepoznaje oblik — nešto proizvodi tekst, nešto ga troši — a ne zapis pojedinog SDK-a. Imenuje okvir koji je vidio kada može (OpenAI, Anthropic, Google, Azure OpenAI, Mistral, Bedrock, Ollama, LiteLLM, LangChain, LangGraph, LlamaIndex, Semantic Kernel, AutoGen, CrewAI, Hugging Face) kako bi nalaz mogao reći odakle je došao. To je oznaka na nalazu, a ne integracija za svaki SDK, i okvir kojeg na tom popisu nema analizira se potpuno jednako.

Pogledajte kako Cybseco zaključuje o stvarnom sustavu

Pogledajte interaktivni demo, a zatim zatražite vođenu probu za svoj tim.