Vytvoriť bezplatný účet
Bezpečnosť kódu aplikácií s LLM

Výstup vášho modelu je nedôveryhodný vstup. Nájdite miesta, kde na to váš kód zabúda.

Statická analýza kódu okolo vášho LLM — kódu, ktorý zostavuje prompt, volá model a s odpoveďou niečo robí. Nie modelu. Nie odolnosti promptu voči jailbreaku. Kódu.

Bezplatná úroveň zahŕňa 3 projekty a 30 analýz mesačne, bez obmedzenia počtu používateľov a bez platobnej karty. Táto analýza sa do nej zmestí.

Problém

Model nie je knižnica. Je to nedôveryhodný interpret: podáte mu reťazec a on vám jeden vráti. Všetko, čo ten reťazec ovplyvnilo — vlastný prompt používateľa, stránka, ktorá mu bola ukázaná, dokument, ktorý dostal, výsledok iného nástroja — ovplyvnilo aj odpoveď.

Odpoveď je neškodná, kým jej kód nedá schopnosť konať. Nebezpečenstvo nie je v tom, že model niečo povedal; je v tom, že tomu program uveril. Každé miesto, kde program zaobchádza s vygenerovaným textom ako s kódom, príkazom, dopytom, cestou alebo URL, je injektáž o jeden skok ďalej — a na rozdiel od otázky, či sa prompt dá obísť jailbreakom, tento skok vidno v zdrojovom kóde.

Čo Cybseco hľadá

Tam, kde výstup modelu dosiahne na niečo, čo koná. Toto sú vlastné kategórie, závažnosti a identifikátory CWE enginu.

Spustenie kódu — CWE-94
kritická
eval, exec, compile, new Function, pickle.loads, yaml.load — z odpovede sa stáva program.
Shell — CWE-78
kritická
os.system, subprocess, child_process.exec, execSync — z odpovede sa stáva príkaz.
SQL dopyt — CWE-89
vysoká
execute, raw, createQuery — text-to-SQL je presne tento vzor a DROP TABLE je vierohodné doplnenie.
Cesta v súborovom systéme — CWE-22
vysoká
open, readFile, shutil.rmtree, unlink — ../../etc/passwd je rovnako vierohodné doplnenie.
Odchádzajúca požiadavka — CWE-918
vysoká
requests, httpx, fetch, axios, urlopen — falšovanie požiadavky na strane servera, zvolené modelom.

Konkrétny príklad

Deväť riadkov a celý tvar 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)
Zdroj
client.chat.completions.create(…) — volanie, ktoré vracia výstup modelu. Analyzátor naviaže premennú, do ktorej bol priradený, a práve to mu umožňuje sledovať hodnotu naprieč funkciou bez medziprocedurálnej analýzy.
Tok
answer obsahuje text, ktorý mohol ovplyvniť útočník. Medzi volaním a cieľom ho nič nekontroluje, neobmedzuje ani neprevádza na pevnú množinu operácií.
Cieľ
exec(…) — text sa stáva programom vo vlastnom procese aplikácie, s jej prihlasovacími údajmi, jej sieťou a jej súborovým systémom.
Prečo na tom záleží
Čokoľvek, čo môže ovplyvniť task — priamo alebo prostredníctvom dokumentu ukázaného modelu — vyberá, čo sa spustí. Je to vzdialené spustenie kódu o jeden skok ďalej.

Spustený proti súčasnému enginu dá tento úryvok jedno zistenie: llm-output-to-code-execution, CWE-94, závažnosť kritická, spoľahlivosť vysoká, na riadku exec. Spoľahlivosť je vysoká, pretože premenná je naviazaná na skutočné volanie completion. Názov, ktorý odpoveď modelu iba pripomína — llm_response, reply — sa hlási so strednou spoľahlivosťou, lebo je to odhad a tvrdiť niečo iné by znamenalo klamať o dôkazoch.

Čo toto nie je

Nie je to test modelu
Model nesondujeme, nerobíme voči nemu red teaming a neposudzujeme, ako sa správa pod tlakom. Nič tu nehovorí, či sa prompt dá obísť jailbreakom: zo zdrojového kódu sa to rozhodnúť nedá a tvrdiť to by bol presne ten druh výroku, pre ktorého vyhnutie tento engine existuje.
Nie je to úplná detekcia prompt injection
Nepriamu injektáž hlásime tam, kde nedôveryhodný obsah preukázateľne dosiahne prompt. Kanál, ktorý v kóde nevidíme, je kanál, ktorý nehlásime.
Nie je to záruka o agentovi
Hlásime, že agentovi bol udelený nástroj, ktorý spúšťa kód alebo príkazy. Čo agent potom počas behu urobí, leží mimo toho, čo statická analýza dokáže rozhodnúť.
Doplnok k bezpečnosti AI počas behu
Guardraily, vyhodnocovacie sady a red teaming odpovedajú na otázky, na ktoré toto odpovedať nevie, a toto odpovedá na otázky, na ktoré nevedia odpovedať ony. Ani jedno nenahrádza druhé.

Ďalšie riziká špecifické pre LLM v kóde

Každé z nich bolo pred zapísaním spustené na vzorke proti súčasnému enginu.

Tajomstvá a osobné údaje vložené do promptu — CWE-200
api_key, heslo, IBAN alebo zdravotný záznam vložený do textu, ktorý odosielate. Hlásené tam, kde sa skutočne zostavuje kontext promptu, nie pri každom f-stringu, ktorý náhodou obsahuje kľúč.
Agent s nástrojom, ktorý spúšťa kód alebo príkazy — CWE-250
PythonREPLTool, ShellTool, interpret kódu, terminál. Udelenie jedného z nich mení každú otázku o prompt injection na otázku o vzdialenom spustení kódu.
Ochrana frameworku znovu vypnutá — CWE-502
allow_dangerous_deserialization=True, trust_remote_code=True, dangerouslyAllow… — framework ju vypol, pretože bola nebezpečná.
Vypnuté bezpečnostné kontroly poskytovateľa — CWE-693
BLOCK_NONE, safety_settings=None, moderation=false.
Prompt alebo definícia agenta načítané počas behu — CWE-829
hub.pull(…), šablóna promptu načítaná cez HTTP. Kto ovláda ten endpoint, ovláda inštrukcie.
Nedôveryhodný obsah načítaný priamo do promptu — CWE-77
Stiahnutá stránka, PDF, repozitár, wiki. Toto je kanál nepriamej injektáže, rozpoznaný podľa toho, odkiaľ text prišiel, nie podľa toho, čo hovorí.
API kľúč modelu zapísaný v zdrojovom kóde — CWE-798
sk-…, sk-ant-…, AIza…, hf_… zacommitované do repozitára.
Stiahnutý alebo nahradený model pevne zapísaný v kóde — CWE-1104
text-davinci-*, gpt-4-0314, claude-instant — slabšia hierarchia inštrukcií, žiadne oddelenie systémového promptu.

Prečo tomu všetkému veriť

Zverejnený benchmark
Presnosť, úplnosť a F1 podľa CWE, podľa jazyka a podľa vrstvy analýzy, nad verzovaným a ručne označeným korpusom. Zobraziť čísla.
Zverejnený rozsah
Každá vrstva, ktorú nemeriame, je pomenovaná aj s dôvodom. Prečítať metodiku.
Overenie na verejnom kóde
Analyzované repozitáre a commity, nájdené jazyky, miera dokončenia a determinizmus — objemy a podiely, nie tvrdenia o presnosti. Zobraziť behy.
Každé zistenie nesie svoj dôkaz
Súbor, riadok, nájdená konštrukcia a CWE. Zistenie, ktoré neviete overiť, je zistenie, podľa ktorého by ste nemali konať.

Nezávislé od poskytovateľa už svojou konštrukciou. Analyzátor rozpoznáva tvar — niečo vyrába text, niečo ho spotrebúva — nie zápis jedného konkrétneho SDK. Pomenuje framework, ktorý videl, keď to ide (OpenAI, Anthropic, Google, Azure OpenAI, Mistral, Bedrock, Ollama, LiteLLM, LangChain, LangGraph, LlamaIndex, Semantic Kernel, AutoGen, CrewAI, Hugging Face), aby zistenie mohlo povedať, odkiaľ pochádza. Je to štítok na zistení, nie integrácia pre každé SDK, a framework, ktorý v zozname chýba, sa analyzuje úplne rovnako.

Pozrite sa, ako Cybseco uvažuje o reálnom systéme

Pozrite si interaktívne demo a potom si vyžiadajte riadenú skúšobnú verziu pre svoj tím.