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.
eval, exec, compile, new Function, pickle.loads, yaml.load — atsakymas tampa programa.os.system, subprocess, child_process.exec, execSync — atsakymas tampa komanda.execute, raw, createQuery — text-to-SQL yra būtent šis šablonas, o DROP TABLE yra tikėtinas tęsinys.open, readFile, shutil.rmtree, unlink — ../../etc/passwd yra lygiai toks pat tikėtinas tęsinys.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)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.answer turi tekstą, kurį galėjo paveikti užpuolikas. Tarp iškvietimo ir nuotėkio niekas jo netikrina, neriboja ir nesuveda į fiksuotą operacijų rinkinį.exec(…) — tekstas tampa programa pačios programos procese, su jos prisijungimo duomenimis, jos tinklu ir jos failų sistema.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
Kitos LLM būdingos rizikos kode
Kiekviena iš jų buvo suaktyvinta pavyzdyje su dabartiniu varikliu prieš užrašant ją čia.
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.PythonREPLTool, ShellTool, kodo interpretatorius, terminalas. Suteikus vieną iš jų, kiekvienas klausimas apie užklausų injekciją virsta klausimu apie nuotolinį kodo vykdymą.allow_dangerous_deserialization=True, trust_remote_code=True, dangerouslyAllow… — karkasas ją išjungė, nes ji buvo nesaugi.BLOCK_NONE, safety_settings=None, moderation=false.hub.pull(…), užklausos šablonas, įkeliamas per HTTP. Kas valdo tą galinį tašką, valdo instrukcijas.sk-…, sk-ant-…, AIza…, hf_…, įkelti į saugyklą.text-davinci-*, gpt-4-0314, claude-instant — silpnesnė instrukcijų hierarchija, be sisteminės užklausos atskyrimo.Kodėl bent kuo iš to tikėti
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.