Ustvari brezplačen račun
Varnost kode aplikacij z LLM

Izhod vašega modela je nezaupanja vreden vhod. Poiščite mesta, kjer vaša koda na to pozabi.

Statična analiza kode okoli vašega LLM — kode, ki sestavlja poziv, kliče model in z odgovorom nekaj naredi. Ne modela. Ne odpornosti poziva na jailbreak. Kode.

Brezplačni paket vključuje 3 projekte in 30 analiz na mesec, brez omejitve števila uporabnikov in brez plačilne kartice. Ta analiza je vanj vključena.

Težava

Model ni knjižnica. Je nezaupanja vreden tolmač: podate mu niz in vrne vam drugega. Vse, kar je vplivalo na ta niz — uporabnikov lastni poziv, stran, ki mu je bila prikazana, dokument, ki ga je dobil, rezultat drugega orodja — je vplivalo na odgovor.

Odgovor je neškodljiv, dokler mu koda ne da zmožnosti delovanja. Nevarnost ni v tem, da je model nekaj rekel; je v tem, da je program temu verjel. Vsako mesto, kjer program obravnava ustvarjeno besedilo kot kodo, ukaz, poizvedbo, pot ali naslov URL, je vrivanje en skok dlje — in za razliko od vprašanja, ali je poziv mogoče zaobiti z jailbreakom, je ta skok viden v izvorni kodi.

Kaj Cybseco išče

Tam, kjer izhod modela doseže nekaj, kar deluje. To so lastne kategorije, resnosti in identifikatorji CWE pogona.

Izvajanje kode — CWE-94
kritična
eval, exec, compile, new Function, pickle.loads, yaml.load — odgovor postane program.
Lupina — CWE-78
kritična
os.system, subprocess, child_process.exec, execSync — odgovor postane ukaz.
Poizvedba SQL — CWE-89
visoka
execute, raw, createQuery — text-to-SQL je natanko ta vzorec in DROP TABLE je verjetno nadaljevanje.
Pot v datotečnem sistemu — CWE-22
visoka
open, readFile, shutil.rmtree, unlink — tudi ../../etc/passwd je verjetno nadaljevanje.
Odhodna zahteva — CWE-918
visoka
requests, httpx, fetch, axios, urlopen — ponarejanje zahteve na strani strežnika, ki ga izbere model.

Konkreten primer

Devet vrstic in celotna oblika tveganja.

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)
Vir
client.chat.completions.create(…) — klic, ki vrne izhod modela. Analizator veže spremenljivko, ki ji je bil dodeljen, in prav to mu omogoča slediti vrednosti skozi funkcijo brez medproceduralne analize.
Tok
answer vsebuje besedilo, na katero je lahko vplival napadalec. Med klicem in ponorom ga nič ne pregleda, ne omeji in ne preslika na stalen nabor operacij.
Ponor
exec(…) — besedilo postane program v samem procesu aplikacije, z njenimi poverilnicami, njenim omrežjem in njenim datotečnim sistemom.
Zakaj je to pomembno
Karkoli lahko vpliva na task — neposredno ali prek dokumenta, prikazanega modelu — izbere, kaj se izvede. To je oddaljeno izvajanje kode en skok dlje.

Pognan na trenutnem pogonu ta odlomek da eno ugotovitev: llm-output-to-code-execution, CWE-94, resnost kritična, zanesljivost visoka, v vrstici exec. Zanesljivost je visoka, ker je spremenljivka vezana na dejanski klic completion. Ime, ki je odgovoru modela le podobno — llm_response, reply — se namesto tega poroča s srednjo zanesljivostjo, saj gre za ugibanje in trditi drugače bi pomenilo lagati o dokazih.

Kaj to ni

Ni preizkus modela
Modela ne sondiramo, nad njim ne izvajamo red teaminga in ne ocenjujemo, kako se vede pod pritiskom. Nič tu ne pove, ali je poziv mogoče zaobiti z jailbreakom: tega iz izvorne kode ni mogoče odločiti, trditi pa bi pomenilo natanko tisto vrsto izjave, ki se ji ta pogon izogiba.
Ni popolno zaznavanje vrivanja pozivov
Posredno vrivanje poročamo tam, kjer nezaupanja vredna vsebina dokazljivo doseže poziv. Kanala, ki ga v kodi ne vidimo, ne poročamo.
Ni jamstvo glede agenta
Poročamo, da je agent dobil orodje, ki izvaja kodo ali ukaze. Kaj agent nato med izvajanjem stori, je zunaj tega, kar lahko statična analiza odloči.
Dopolnilo varnosti UI med izvajanjem
Varovala, ocenjevalna ogrodja in red teaming odgovarjajo na vprašanja, na katera to ne more, in to odgovarja na vprašanja, na katera ne morejo ona. Nobeno ne nadomešča drugega.

Druga tveganja, značilna za LLM, v kodi

Vsako od njih je bilo pred zapisom sproženo na vzorcu proti trenutnemu pogonu.

Skrivnosti in osebni podatki, vstavljeni v poziv — CWE-200
api_key, geslo, IBAN ali zdravstveni zapis, postavljen v besedilo, ki ga pošiljate. Poroča se tam, kjer se dejansko gradi kontekst poziva, in ne pri vsakem f-nizu, ki slučajno vsebuje ključ.
Agent z orodjem, ki izvaja kodo ali ukaze — CWE-250
PythonREPLTool, ShellTool, tolmač kode, terminal. Dodelitev enega od njih spremeni vsako vprašanje o vrivanju pozivov v vprašanje o oddaljenem izvajanju kode.
Varovalo ogrodja znova izklopljeno — CWE-502
allow_dangerous_deserialization=True, trust_remote_code=True, dangerouslyAllow… — ogrodje ga je izklopilo, ker je bilo nevarno.
Izklopljene varnostne kontrole ponudnika — CWE-693
BLOCK_NONE, safety_settings=None, moderation=false.
Poziv ali definicija agenta, pridobljena med izvajanjem — CWE-829
hub.pull(…), predloga poziva, naložena prek HTTP. Kdor nadzira to končno točko, nadzira navodila.
Nezaupanja vredna vsebina, naložena naravnost v poziv — CWE-77
Postrgana stran, PDF, repozitorij, wiki. To je kanal posrednega vrivanja, prepoznan po tem, od kod je besedilo prišlo, in ne po tem, kaj pove.
Ključ API modela, zapisan v izvorni kodi — CWE-798
sk-…, sk-ant-…, AIza…, hf_…, oddani v repozitorij.
Umaknjen ali nadomeščen model, trdno zapisan v kodi — CWE-1104
text-davinci-*, gpt-4-0314, claude-instant — šibkejša hierarhija navodil, brez ločitve sistemskega poziva.

Zakaj bi čemu od tega verjeli

Objavljen benchmark
Natančnost, priklic in F1 po CWE, po jeziku in po plasti analize, nad različico vodenim, ročno označenim korpusom. Poglejte številke.
Objavljen obseg
Vsaka plast, ki je ne merimo, je poimenovana, z razlogom. Preberite metodologijo.
Preverjanje na javni kodi
Analizirani repozitoriji in commiti, srečani jeziki, delež dokončanja in determinizem — količine in deleži, ne trditve o natančnosti. Poglejte zagone.
Vsaka ugotovitev nosi svoj dokaz
Datoteka, vrstica, najdena konstrukcija in CWE. Ugotovitev, ki je ne morete preveriti, je ugotovitev, po kateri ne bi smeli ukrepati.

Neodvisen od ponudnika že po zasnovi. Analizator prepozna obliko — nekaj ustvarja besedilo, nekaj ga porablja — in ne zapisa posameznega SDK. Poimenuje ogrodje, ki ga je videl, kadar zmore (OpenAI, Anthropic, Google, Azure OpenAI, Mistral, Bedrock, Ollama, LiteLLM, LangChain, LangGraph, LlamaIndex, Semantic Kernel, AutoGen, CrewAI, Hugging Face), da lahko ugotovitev pove, od kod prihaja. To je oznaka na ugotovitvi, ne integracija za vsak SDK, in ogrodje, ki ga na tem seznamu ni, se analizira povsem enako.

Oglejte si, kako Cybseco sklepa o resničnem sistemu

Oglejte si interaktivno predstavitev, nato zahtevajte voden preizkus za svojo ekipo.