Ingyenes fiók létrehozása
LLM-alkalmazások kódbiztonsága

A modell kimenete nem megbízható bemenet. Keresse meg, hol feledkezik meg erről a kódja.

Az LLM körüli kód statikus elemzése — azé a kódé, amely felépíti a promptot, meghívja a modellt, és kezd valamit a válasszal. Nem a modellé. Nem a prompt jailbreakkel szembeni ellenállásáé. A kódé.

Az ingyenes csomag 3 projektet és havi 30 elemzést tartalmaz, felhasználószám-korlát és bankkártya nélkül. Ez az elemzés belefér.

A probléma

A modell nem könyvtár. Nem megbízható értelmező: átad neki egy karakterláncot, és visszaad egyet. Minden, ami arra a karakterláncra hatott — a felhasználó saját promptja, egy oldal, amelyet megmutattak neki, egy dokumentum, amelyet megkapott, egy másik eszköz eredménye — hatott a válaszra is.

A válasz ártalmatlan mindaddig, amíg a kód nem ad neki cselekvési képességet. A veszély nem az, hogy a modell mondott valamit, hanem az, hogy egy program elhitte. Minden hely, ahol egy program a generált szöveget kódként, parancsként, lekérdezésként, útvonalként vagy URL-ként kezeli, egy ugrással távolabbi injektálás — és szemben azzal a kérdéssel, hogy a prompt megkerülhető-e jailbreakkel, ez az ugrás látszik a forráskódban.

Mit keres a Cybseco

Ahol a modell kimenete eléri azt, ami cselekszik. Ezek a motor saját kategóriái, súlyossági szintjei és CWE-azonosítói.

Kódfuttatás — CWE-94
kritikus
eval, exec, compile, new Function, pickle.loads, yaml.load — a válaszból program lesz.
Shell — CWE-78
kritikus
os.system, subprocess, child_process.exec, execSync — a válaszból parancs lesz.
SQL-lekérdezés — CWE-89
magas
execute, raw, createQuery — a text-to-SQL pontosan ez a minta, és a DROP TABLE hihető folytatás.
Fájlrendszerbeli útvonal — CWE-22
magas
open, readFile, shutil.rmtree, unlink — a ../../etc/passwd ugyanilyen hihető folytatás.
Kimenő kérés — CWE-918
magas
requests, httpx, fetch, axios, urlopen — kiszolgálóoldali kéréshamisítás, amelyet a modell választ.

Egy konkrét példa

Kilenc sor, és a kockázat teljes alakja.

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)
Forrás
client.chat.completions.create(…) — hívás, amely a modell kimenetét adja vissza. Az elemző megköti azt a változót, amelyhez hozzárendelték, és éppen ez teszi lehetővé, hogy az értéket interprocedurális elemzés nélkül kövesse a függvényen belül.
Folyam
Az answer támadó által befolyásolt szöveget tartalmaz. A hívás és a nyelő között semmi nem vizsgálja meg, nem korlátozza és nem képezi le rögzített műveletkészletre.
Nyelő
exec(…) — a szövegből program lesz az alkalmazás saját folyamatában, annak hitelesítő adataival, hálózatával és fájlrendszerével.
Miért számít
Bármi, ami befolyásolhatja a task értékét — közvetlenül vagy a modellnek megmutatott dokumentumon keresztül —, megválasztja, mi fut le. Ez távoli kódfuttatás egy ugrással távolabb.

A jelenlegi motoron futtatva ez a részlet egyetlen eredményt ad: llm-output-to-code-execution, CWE-94, súlyosság kritikus, megbízhatóság magas, az exec sorban. A megbízhatóság magas, mert a változó valódi completion-híváshoz kötődik. Az olyan név, amely csak hasonlít a modell válaszára — llm_response, reply —, közepes megbízhatósággal kerül jelentésre, mert az találgatás, és mást állítani hazugság lenne a bizonyítékról.

Mi nem ez

Nem a modell tesztelése
Nem szondázzuk a modellt, nem végzünk rajta red teaminget, és nem értékeljük, hogyan viselkedik nyomás alatt. Semmi itt nem mondja meg, hogy a prompt megkerülhető-e jailbreakkel: ez a forráskódból nem dönthető el, és ennek állítása pontosan az a fajta kijelentés lenne, amelynek elkerüléséért ez a motor létezik.
Nem teljes körű promptinjekció-felderítés
A közvetett injektálást ott jelentjük, ahol nem megbízható tartalom bizonyíthatóan eljut egy promptig. Azt a csatornát, amelyet a kódban nem látunk, nem jelentjük.
Nem garancia egy ügynökről
Azt jelentjük, hogy egy ügynök olyan eszközt kapott, amely kódot vagy parancsokat futtat. Hogy az ügynök ezután futásidőben mit tesz, az kívül esik azon, amit a statikus elemzés eldönthet.
Kiegészíti a futásidejű MI-biztonságot
A védőkorlátok, az értékelési keretek és a red teaming olyan kérdésekre válaszolnak, amelyekre ez nem tud, ez pedig olyanokra, amelyekre azok nem. Egyik sem helyettesíti a másikat.

További, LLM-re jellemző kockázatok a kódban

Mindegyiket mintán, a jelenlegi motoron váltottuk ki, mielőtt ide leírtuk volna.

Titkok és személyes adatok promptba illesztve — CWE-200
Egy api_key, egy jelszó, egy IBAN vagy egy egészségügyi feljegyzés az Ön által küldött szövegben. Ott jelentjük, ahol valódi promptkörnyezet épül, nem minden olyan f-stringnél, amely véletlenül kulcsot tartalmaz.
Kódot vagy parancsokat futtató eszközt kapott ügynök — CWE-250
PythonREPLTool, ShellTool, kódértelmező, terminál. Bármelyik megadása minden promptinjekciós kérdést távoli kódfuttatási kérdéssé alakít.
A keretrendszer védelme újra kikapcsolva — CWE-502
allow_dangerous_deserialization=True, trust_remote_code=True, dangerouslyAllow… — a keretrendszer azért kapcsolta ki, mert nem volt biztonságos.
A szolgáltató biztonsági vezérlői kikapcsolva — CWE-693
BLOCK_NONE, safety_settings=None, moderation=false.
Futásidőben letöltött prompt vagy ügynökdefiníció — CWE-829
hub.pull(…), HTTP-n betöltött promptsablon. Aki azt a végpontot felügyeli, az felügyeli az utasításokat is.
Nem megbízható tartalom közvetlenül promptba töltve — CWE-77
Egy letöltött oldal, egy PDF, egy repository, egy wiki. Ez a közvetett injektálás csatornája, amelyet arról ismerünk fel, honnan jött a szöveg, nem arról, mit mond.
Modell API-kulcsa a forráskódba írva — CWE-798
sk-…, sk-ant-…, AIza…, hf_… a repositoryba commitolva.
Visszavont vagy leváltott modell rögzítve a kódban — CWE-1104
text-davinci-*, gpt-4-0314, claude-instant — gyengébb utasításhierarchia, nincs rendszerprompt-elkülönítés.

Miért higgyen el ebből bármit

Közzétett benchmark
Pontosság, fedés és F1 CWE-nként, nyelvenként és elemzési rétegenként, verziózott, kézzel címkézett korpuszon. Nézze meg a számokat.
Közzétett hatókör
Minden réteg, amelyet nem mérünk, meg van nevezve, az okával együtt. Olvassa el a módszertant.
Ellenőrzés nyilvános kódon
Elemzett repositoryk és commitok, előforduló nyelvek, befejezési arány és determinizmus — mennyiségek és arányok, nem pontossági állítások. Nézze meg a futásokat.
Minden eredmény hozza a bizonyítékát
A fájl, a sor, a megtalált szerkezet és a CWE. Az az eredmény, amelyet nem tud ellenőrizni, olyan eredmény, amely alapján nem kellene cselekednie.

Szolgáltatófüggetlen a felépítéséből adódóan. Az elemző az alakzatot ismeri fel — valami szöveget állít elő, valami felhasználja —, nem egyetlen SDK írásmódját. Megnevezi a keretrendszert, amelyet látott, amikor tudja (OpenAI, Anthropic, Google, Azure OpenAI, Mistral, Bedrock, Ollama, LiteLLM, LangChain, LangGraph, LlamaIndex, Semantic Kernel, AutoGen, CrewAI, Hugging Face), hogy az eredmény meg tudja mondani, honnan származik. Ez címke az eredményen, nem SDK-nkénti integráció, és a listán nem szereplő keretrendszert pontosan ugyanúgy elemezzük.

Nézze meg, ahogy a Cybseco egy valós rendszerről következtet

Nézze meg az interaktív demót, majd igényeljen vezetett próbát a csapatának.