Sukurti nemokamą paskyrą
LLM programų kodo saugumas

Jūsų modelio išvestis yra nepatikima įvestis. Raskite vietas, kur jūsų kodas tai pamiršta.

Statinė kodo aplink jūsų LLM analizė — kodo, kuris sudaro užklausą, iškviečia modelį ir ką nors daro su atsakymu. Ne modelio. Ne užklausos atsparumo jailbreak. Kodo.

Nemokamas planas apima 3 projektus ir 30 analizių per mėnesį, be naudotojų skaičiaus ribos ir be mokėjimo kortelės. Ši analizė į jį telpa.

Problema

Modelis nėra biblioteka. Tai nepatikimas interpretatorius: paduodate jam eilutę, o jis grąžina kitą. Viskas, kas paveikė tą eilutę — paties naudotojo užklausa, jam parodytas puslapis, jam duotas dokumentas, kito įrankio rezultatas — paveikė ir atsakymą.

Atsakymas nekenksmingas tol, kol kodas nesuteikia jam galios veikti. Pavojus ne tas, kad modelis kažką pasakė; pavojus tas, kad programa tuo patikėjo. Kiekviena vieta, kur programa sugeneruotą tekstą traktuoja kaip kodą, kaip komandą, kaip užklausą, kaip kelią ar kaip URL, yra injekcija vienu šuoliu toliau — ir, skirtingai nei klausimas, ar užklausą galima apeiti jailbreak būdu, tas šuolis matomas pirminiame kode.

Ko ieško Cybseco

Ten, kur modelio išvestis pasiekia tai, kas veikia. Tai paties variklio kategorijos, pavojingumo lygiai ir CWE identifikatoriai.

Kodo vykdymas — CWE-94
kritinis
eval, exec, compile, new Function, pickle.loads, yaml.load — atsakymas tampa programa.
Apvalkalas — CWE-78
kritinis
os.system, subprocess, child_process.exec, execSync — atsakymas tampa komanda.
SQL užklausa — CWE-89
aukštas
execute, raw, createQuery — text-to-SQL yra būtent šis šablonas, o DROP TABLE yra tikėtinas tęsinys.
Failų sistemos kelias — CWE-22
aukštas
open, readFile, shutil.rmtree, unlink — ../../etc/passwd yra lygiai toks pat tikėtinas tęsinys.
Išsiunčiama užklausa — CWE-918
aukštas
requests, httpx, fetch, axios, urlopen — serverio pusės užklausų klastojimas, kurį pasirenka modelis.

Konkretus pavyzdys

Devynios eilutės ir visa rizikos forma.

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)
Šaltinis
client.chat.completions.create(…) — iškvietimas, grąžinantis modelio išvestį. Analizatorius susieja kintamąjį, kuriam ji buvo priskirta, ir būtent tai leidžia jam sekti reikšmę per funkciją be tarpprocedūrinės analizės.
Srautas
answer turi tekstą, kurį galėjo paveikti užpuolikas. Tarp iškvietimo ir nuotėkio niekas jo netikrina, neriboja ir nesuveda į fiksuotą operacijų rinkinį.
Nuotėkis
exec(…) — tekstas tampa programa pačios programos procese, su jos prisijungimo duomenimis, jos tinklu ir jos failų sistema.
Kodėl tai svarbu
Viskas, kas gali paveikti task — tiesiogiai arba per modeliui parodytą dokumentą — pasirenka, kas bus įvykdyta. Tai nuotolinis kodo vykdymas vienu šuoliu toliau.

Paleista su dabartiniu varikliu, ši ištrauka duoda vieną išvadą: llm-output-to-code-execution, CWE-94, pavojingumas kritinis, patikimumas aukštas, eilutėje exec. Patikimumas aukštas, nes kintamasis susietas su tikru completion iškvietimu. Pavadinimas, kuris tik atrodo kaip modelio atsakymas — llm_response, reply — pranešamas vidutiniu patikimumu, nes tai spėjimas, o tvirtinti kitaip reikštų meluoti apie įrodymus.

Kas tai nėra

Tai nėra modelio testas
Mes modelio nezonduojame, netaikome jam red teaming ir nevertiname, kaip jis elgiasi esant spaudimui. Niekas čia nepasako, ar užklausą galima apeiti jailbreak būdu: to iš pirminio kodo nuspręsti neįmanoma, o tai tvirtinti būtų būtent toks teiginys, kurio vengti šis variklis ir egzistuoja.
Tai nėra visiškas užklausų injekcijos aptikimas
Netiesioginę injekciją pranešame ten, kur nepatikimas turinys įrodomai pasiekia užklausą. Kanalo, kurio kode nematome, nepranešame.
Tai nėra garantija dėl agento
Pranešame, kad agentui buvo suteiktas įrankis, vykdantis kodą ar komandas. Ką agentas paskui daro vykdymo metu, yra už to, ką statinė analizė gali nuspręsti.
Papildo DI saugumą vykdymo metu
Apsauginiai barjerai, vertinimo rinkiniai ir red teaming atsako į klausimus, į kuriuos tai negali, o tai atsako į klausimus, į kuriuos negali jie. Nė vienas nepakeičia kito.

Kitos LLM būdingos rizikos kode

Kiekviena iš jų buvo suaktyvinta pavyzdyje su dabartiniu varikliu prieš užrašant ją čia.

Paslaptys ir asmens duomenys, įterpti į užklausą — CWE-200
api_key, slaptažodis, IBAN ar medicininis įrašas, įdėtas į jūsų siunčiamą tekstą. Pranešama ten, kur iš tikrųjų kuriamas užklausos kontekstas, o ne prie kiekvienos f-eilutės, kurioje atsitiktinai yra raktas.
Agentas su įrankiu, vykdančiu kodą ar komandas — CWE-250
PythonREPLTool, ShellTool, kodo interpretatorius, terminalas. Suteikus vieną iš jų, kiekvienas klausimas apie užklausų injekciją virsta klausimu apie nuotolinį kodo vykdymą.
Karkaso apsauga vėl išjungta — CWE-502
allow_dangerous_deserialization=True, trust_remote_code=True, dangerouslyAllow… — karkasas ją išjungė, nes ji buvo nesaugi.
Išjungtos tiekėjo saugos kontrolės — CWE-693
BLOCK_NONE, safety_settings=None, moderation=false.
Vykdymo metu parsiunčiama užklausa ar agento apibrėžimas — CWE-829
hub.pull(…), užklausos šablonas, įkeliamas per HTTP. Kas valdo tą galinį tašką, valdo instrukcijas.
Nepatikimas turinys, įkeltas tiesiai į užklausą — CWE-77
Nuskaitytas puslapis, PDF, saugykla, wiki. Tai netiesioginės injekcijos kanalas, atpažįstamas pagal tai, iš kur tekstas atėjo, o ne pagal tai, ką jis sako.
Modelio API raktas, įrašytas pirminiame kode — CWE-798
sk-…, sk-ant-…, AIza…, hf_…, įkelti į saugyklą.
Atšauktas ar pakeistas modelis, įtvirtintas kode — CWE-1104
text-davinci-*, gpt-4-0314, claude-instant — silpnesnė instrukcijų hierarchija, be sisteminės užklausos atskyrimo.

Kodėl bent kuo iš to tikėti

Paskelbtas etalonas
Tikslumas, aprėptis ir F1 pagal CWE, pagal kalbą ir pagal analizės sluoksnį, versijuotame, rankomis pažymėtame tekstyne. Žiūrėkite skaičius.
Paskelbta apimtis
Kiekvienas sluoksnis, kurio nematuojame, yra įvardytas kartu su priežastimi. Skaitykite metodiką.
Patikrinimas su viešu kodu
Išanalizuotos saugyklos ir commitai, sutiktos kalbos, užbaigtumo rodiklis ir determinizmas — apimtys ir rodikliai, o ne teiginiai apie tikslumą. Žiūrėkite vykdymus.
Kiekviena išvada turi savo įrodymą
Failas, eilutė, rasta konstrukcija ir CWE. Išvada, kurios negalite patikrinti, yra išvada, pagal kurią neturėtumėte veikti.

Nepriklausomas nuo tiekėjo pagal savo sandarą. Analizatorius atpažįsta formą — kažkas gamina tekstą, kažkas jį suvartoja — o ne vieno konkretaus SDK rašybą. Jis įvardija karkasą, kurį pamatė, kai gali (OpenAI, Anthropic, Google, Azure OpenAI, Mistral, Bedrock, Ollama, LiteLLM, LangChain, LangGraph, LlamaIndex, Semantic Kernel, AutoGen, CrewAI, Hugging Face), kad išvada galėtų pasakyti, iš kur ji atsirado. Tai etiketė ant išvados, o ne integracija kiekvienam SDK, ir karkasas, kurio tame sąraše nėra, analizuojamas lygiai taip pat.

Pamatykite, kaip Cybseco analizuoja realią sistemą

Peržiūrėkite interaktyvią demonstraciją, tada paprašykite vadovaujamo bandomojo laikotarpio savo komandai.