Vytvořit bezplatný účet
Bezpečnost kódu aplikací s LLM

Výstup vašeho modelu je nedůvěryhodný vstup. Najděte místa, kde na to váš kód zapomíná.

Statická analýza kódu kolem vašeho LLM — kódu, který staví prompt, volá model a s odpovědí něco dělá. Ne modelu. Ne odolnosti promptu vůči jailbreaku. Kódu.

Bezplatný tarif zahrnuje 3 projekty a 30 analýz měsíčně, bez omezení počtu uživatelů a bez platební karty. Tato analýza se do něj vejde.

Problém

Model není knihovna. Je to nedůvěryhodný interpret: předáte mu řetězec a on vám jeden vrátí. Vše, co ten řetězec ovlivnilo — vlastní prompt uživatele, stránka, která mu byla ukázána, dokument, který dostal, výsledek jiného nástroje — ovlivnilo i odpověď.

Odpověď je neškodná, dokud jí kód nedá schopnost jednat. Nebezpečí není v tom, že model něco řekl; je v tom, že tomu program uvěřil. Každé místo, kde program zachází s vygenerovaným textem jako s kódem, příkazem, dotazem, cestou nebo URL, je injektáž o jeden skok dál — a na rozdíl od otázky, zda lze prompt obejít jailbreakem, je tento skok vidět ve zdrojovém kódu.

Co Cybseco hledá

Tam, kde výstup modelu dosáhne na něco, co jedná. Toto jsou vlastní kategorie, závažnosti a identifikátory CWE enginu.

Spuštění kódu — CWE-94
kritická
eval, exec, compile, new Function, pickle.loads, yaml.load — z odpovědi se stává program.
Shell — CWE-78
kritická
os.system, subprocess, child_process.exec, execSync — z odpovědi se stává příkaz.
SQL dotaz — CWE-89
vysoká
execute, raw, createQuery — text-to-SQL je přesně tento vzor a DROP TABLE je věrohodné doplnění.
Cesta v souborovém systému — CWE-22
vysoká
open, readFile, shutil.rmtree, unlink — ../../etc/passwd je stejně věrohodné doplnění.
Odchozí požadavek — CWE-918
vysoká
requests, httpx, fetch, axios, urlopen — padělání požadavku na straně serveru, zvolené modelem.

Konkrétní příklad

Devět řádků 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(…) — volání, které vrací výstup modelu. Analyzátor naváže proměnnou, do níž byl přiřazen, a právě to mu umožňuje sledovat hodnotu napříč funkcí bez meziprocedurální analýzy.
Tok
answer obsahuje text, který mohl ovlivnit útočník. Mezi voláním a cílem jej nic nekontroluje, neomezuje ani nepřevádí na pevnou množinu operací.
Cíl
exec(…) — text se stává programem ve vlastním procesu aplikace, s jejími přihlašovacími údaji, její sítí a jejím souborovým systémem.
Proč na tom záleží
Cokoli, co může ovlivnit task — přímo nebo prostřednictvím dokumentu ukázaného modelu — vybírá, co se spustí. To je vzdálené spuštění kódu o jeden skok dál.

Spuštěn proti současnému enginu dá tento úryvek jedno zjištění: llm-output-to-code-execution, CWE-94, závažnost kritická, spolehlivost vysoká, na řádku exec. Spolehlivost je vysoká, protože proměnná je navázána na skutečné volání completion. Název, který odpověď modelu jen připomíná — llm_response, reply — je hlášen se střední spolehlivostí, protože to je odhad a tvrdit něco jiného by znamenalo lhát o důkazech.

Co toto není

Není to test modelu
Model nesondujeme, neděláme vůči němu red teaming a neposuzujeme, jak se chová pod tlakem. Nic zde neříká, zda lze prompt obejít jailbreakem: to ze zdrojového kódu rozhodnout nelze a tvrdit to by byl přesně ten druh výroku, kvůli jehož vyhnutí tento engine existuje.
Není to úplná detekce prompt injection
Nepřímou injektáž hlásíme tam, kde nedůvěryhodný obsah prokazatelně dosáhne promptu. Kanál, který v kódu nevidíme, je kanál, který nehlásíme.
Není to záruka ohledně agenta
Hlásíme, že agentovi byl udělen nástroj, který spouští kód nebo příkazy. Co agent potom za běhu udělá, leží mimo to, co statická analýza dokáže rozhodnout.
Doplněk k bezpečnosti AI za běhu
Guardraily, vyhodnocovací sady a red teaming odpovídají na otázky, na které toto odpovědět neumí, a toto odpovídá na otázky, na které neumí odpovědět ony. Ani jedno nenahrazuje druhé.

Další rizika specifická pro LLM v kódu

Každé z nich bylo před sepsáním spuštěno na vzorku proti současnému enginu.

Tajemství a osobní údaje vložené do promptu — CWE-200
api_key, heslo, IBAN nebo zdravotní záznam vložený do textu, který odesíláte. Hlášeno tam, kde se skutečně staví kontext promptu, nikoli u každého f-stringu, který náhodou obsahuje klíč.
Agent s nástrojem, který spouští kód nebo příkazy — CWE-250
PythonREPLTool, ShellTool, interpret kódu, terminál. Udělení jednoho z nich mění každou otázku o prompt injection v otázku o vzdáleném spuštění kódu.
Ochrana frameworku znovu vypnutá — CWE-502
allow_dangerous_deserialization=True, trust_remote_code=True, dangerouslyAllow… — framework ji vypnul, protože byla nebezpečná.
Vypnuté bezpečnostní kontroly poskytovatele — CWE-693
BLOCK_NONE, safety_settings=None, moderation=false.
Prompt nebo definice agenta načítané za běhu — CWE-829
hub.pull(…), šablona promptu načtená přes HTTP. Kdo ovládá ten endpoint, ovládá instrukce.
Nedůvěryhodný obsah načtený přímo do promptu — CWE-77
Stažená stránka, PDF, repozitář, wiki. Toto je kanál nepřímé injektáže, rozpoznaný podle toho, odkud text přišel, ne podle toho, co říká.
API klíč modelu zapsaný ve zdrojovém kódu — CWE-798
sk-…, sk-ant-…, AIza…, hf_… zacommitované do repozitáře.
Stažený nebo nahrazený model pevně zapsaný v kódu — CWE-1104
text-davinci-*, gpt-4-0314, claude-instant — slabší hierarchie instrukcí, žádné oddělení systémového promptu.

Proč tomu všemu věřit

Zveřejněný benchmark
Přesnost, úplnost a F1 podle CWE, podle jazyka a podle vrstvy analýzy, nad verzovaným a ručně označeným korpusem. Zobrazit čísla.
Zveřejněný rozsah
Každá vrstva, kterou neměříme, je pojmenována i s důvodem. Přečíst metodiku.
Ověření na veřejném kódu
Analyzované repozitáře a commity, nalezené jazyky, míra dokončení a determinismus — objemy a podíly, nikoli tvrzení o přesnosti. Zobrazit běhy.
Každé zjištění nese svůj důkaz
Soubor, řádek, nalezená konstrukce a CWE. Zjištění, které nemůžete ověřit, je zjištění, podle kterého byste neměli jednat.

Nezávislé na poskytovateli už svou konstrukcí. Analyzátor rozpoznává tvar — něco vyrábí text, něco jej spotřebovává — nikoli zápis jednoho konkrétního SDK. Pojmenuje framework, který viděl, když to jde (OpenAI, Anthropic, Google, Azure OpenAI, Mistral, Bedrock, Ollama, LiteLLM, LangChain, LangGraph, LlamaIndex, Semantic Kernel, AutoGen, CrewAI, Hugging Face), aby zjištění mohlo říct, odkud pochází. To je štítek na zjištění, ne integrace pro každé SDK, a framework, který v seznamu chybí, se analyzuje úplně stejně.

Podívejte se, jak Cybseco uvažuje o reálném systému

Zhlédněte interaktivní demo a poté si vyžádejte řízenou zkušební verzi pro svůj tým.