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.
eval, exec, compile, new Function, pickle.loads, yaml.load — a válaszból program lesz.os.system, subprocess, child_process.exec, execSync — a válaszból parancs lesz.execute, raw, createQuery — a text-to-SQL pontosan ez a minta, és a DROP TABLE hihető folytatás.open, readFile, shutil.rmtree, unlink — a ../../etc/passwd ugyanilyen hihető folytatás.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)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.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.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.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
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.
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.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.allow_dangerous_deserialization=True, trust_remote_code=True, dangerouslyAllow… — a keretrendszer azért kapcsolta ki, mert nem volt biztonságos.BLOCK_NONE, safety_settings=None, moderation=false.hub.pull(…), HTTP-n betöltött promptsablon. Aki azt a végpontot felügyeli, az felügyeli az utasításokat is.sk-…, sk-ant-…, AIza…, hf_… a repositoryba commitolva.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
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.