Creează un cont gratuit
Securitatea codului aplicațiilor LLM

Ieșirea modelului tău este intrare neîncrezută. Găsește unde codul tău uită asta.

Analiză statică a codului din jurul LLM-ului tău — codul care construiește promptul, apelează modelul și face ceva cu răspunsul. Nu modelul. Nu rezistența promptului la un jailbreak. Codul.

Planul gratuit acoperă 3 proiecte și 30 de analize pe lună, fără limită de utilizatori și fără card bancar. Această analiză intră în el.

Problema

Un model nu este o bibliotecă. Este un interpretor neîncrezut: îi dai un șir de caractere și îți întoarce altul. Tot ce a influențat acel șir — promptul utilizatorului, o pagină care i-a fost arătată, un document care i-a fost dat, rezultatul altui instrument — a influențat răspunsul.

Răspunsul este inofensiv până când codul îi dă o capacitate. Pericolul nu este că un model a spus ceva, ci că un program l-a crezut. Fiecare loc în care un program tratează textul generat drept cod, drept comandă, drept interogare, drept cale sau drept URL este o injecție la un salt distanță — și, spre deosebire de întrebarea dacă un prompt poate fi ocolit printr-un jailbreak, acel salt se vede în codul sursă.

Ce caută Cybseco

Acolo unde ieșirea modelului ajunge la ceva care acționează. Acestea sunt categoriile, severitățile și identificatorii CWE proprii motorului.

Execuție de cod — CWE-94
critică
eval, exec, compile, new Function, pickle.loads, yaml.load — răspunsul devine un program.
Un shell — CWE-78
critică
os.system, subprocess, child_process.exec, execSync — răspunsul devine o comandă.
O interogare SQL — CWE-89
ridicată
execute, raw, createQuery — text-to-SQL este exact acest tipar, iar DROP TABLE este o completare plauzibilă.
O cale în sistemul de fișiere — CWE-22
ridicată
open, readFile, shutil.rmtree, unlink — ../../etc/passwd este la fel de plauzibilă ca o completare.
O cerere de ieșire — CWE-918
ridicată
requests, httpx, fetch, axios, urlopen — falsificare de cereri pe partea de server, aleasă de model.

Un exemplu concret

Nouă linii și toată forma riscului.

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)
Sursă
client.chat.completions.create(…) — un apel care întoarce ieșirea modelului. Analizorul leagă variabila căreia i-a fost atribuită, iar tocmai asta îi permite să urmărească valoarea prin funcție fără analiză interprocedurală.
Flux
answer conține text influențat de un atacator. Între apel și punctul final nimic nu îl inspectează, nu îl constrânge și nu îl reduce la un set fix de operații.
Punct final
exec(…) — textul devine un program în chiar procesul aplicației, cu credențialele ei, rețeaua ei și sistemul ei de fișiere.
De ce contează
Orice poate influența task — direct sau printr-un document arătat modelului — alege ce se execută. Aceasta este execuție de cod la distanță, la un salt distanță.

Rulat pe motorul actual, acel fragment produce o constatare: llm-output-to-code-execution, CWE-94, severitate critică, încredere ridicată, pe linia exec. Încrederea este ridicată pentru că variabila este legată de un apel completion real. Un nume care doar seamănă cu un răspuns de model — llm_response, reply — este raportat cu încredere medie, pentru că aceea este o presupunere, iar a afirma altceva ar însemna să minți despre dovezi.

Ce nu este aceasta

Nu este un test al modelului
Nu sondăm modelul, nu facem red teaming asupra lui și nu evaluăm cum se comportă sub presiune. Nimic de aici nu spune dacă un prompt poate fi ocolit printr-un jailbreak: asta nu se poate decide din codul sursă, iar a o afirma ar fi exact genul de declarație pe care acest motor există ca să o evite.
Nu este detectare completă a injecției de prompt
Injecția indirectă este raportată acolo unde conținut neîncrezut ajunge demonstrabil într-un prompt. Un canal pe care nu îl vedem în cod este un canal pe care nu îl raportăm.
Nu este o garanție despre un agent
Raportăm că unui agent i s-a acordat un instrument care execută cod sau comenzi. Ce face agentul apoi, la rulare, depășește ceea ce poate decide analiza statică.
Complementar securității IA la rulare
Barierele de siguranță, bancurile de evaluare și red teamingul răspund la întrebări la care aceasta nu poate răspunde, iar aceasta răspunde la întrebări la care ele nu pot. Niciuna nu o înlocuiește pe cealaltă.

Alte riscuri specifice LLM în cod

Fiecare a fost declanșat pe un eșantion, pe motorul actual, înainte de a fi scris aici.

Secrete și date personale interpolate într-un prompt — CWE-200
O api_key, o parolă, un IBAN sau o fișă medicală puse în textul pe care îl trimiți. Raportat acolo unde se construiește un context de prompt real, nu la orice f-string care se întâmplă să conțină o cheie.
Un agent căruia i s-a dat un instrument care execută cod sau comenzi — CWE-250
PythonREPLTool, ShellTool, un interpretor de cod, un terminal. Acordarea oricăruia dintre ele transformă orice întrebare despre injecția de prompt într-o întrebare despre execuția de cod la distanță.
O protecție a framework-ului dezactivată din nou — CWE-502
allow_dangerous_deserialization=True, trust_remote_code=True, dangerouslyAllow… — un framework a dezactivat-o pentru că nu era sigură.
Controale de siguranță ale furnizorului dezactivate — CWE-693
BLOCK_NONE, safety_settings=None, moderation=false.
Un prompt sau o definiție de agent preluate la rulare — CWE-829
hub.pull(…), un șablon de prompt încărcat prin HTTP. Cine controlează acel endpoint controlează instrucțiunile.
Conținut neîncrezut încărcat direct într-un prompt — CWE-77
O pagină extrasă, un PDF, un depozit, un wiki. Acesta este canalul injecției indirecte, recunoscut după proveniența textului, nu după ce spune el.
O cheie API de model scrisă în codul sursă — CWE-798
sk-…, sk-ant-…, AIza…, hf_… comise în depozit.
Un model retras sau înlocuit fixat în cod — CWE-1104
text-davinci-*, gpt-4-0314, claude-instant — ierarhie de instrucțiuni mai slabă, fără separarea promptului de sistem.

De ce să crezi ceva din toate acestea

Un benchmark publicat
Precizie, acoperire și F1 pe CWE, pe limbaj și pe strat de analiză, peste un corpus versionat și etichetat manual. Vezi cifrele.
Un perimetru publicat
Fiecare strat pe care nu îl măsurăm este numit, cu motivul. Citește metodologia.
Validare pe cod public
Depozite și commituri analizate, limbaje întâlnite, rată de finalizare și determinism — volume și rate, nu afirmații despre acuratețe. Vezi rulările.
Fiecare constatare își poartă dovada
Fișierul, linia, construcția identificată și CWE-ul. O constatare pe care nu o poți verifica este o constatare pe baza căreia nu ar trebui să acționezi.

Independent de furnizor prin construcție. Analizorul recunoaște forma — ceva produce text, ceva îl consumă — și nu scrierea unui anumit SDK. Numește framework-ul pe care l-a văzut atunci când poate (OpenAI, Anthropic, Google, Azure OpenAI, Mistral, Bedrock, Ollama, LiteLLM, LangChain, LangGraph, LlamaIndex, Semantic Kernel, AutoGen, CrewAI, Hugging Face), ca o constatare să poată spune de unde vine. Aceasta este o etichetă pe constatare, nu o integrare pentru fiecare SDK, iar un framework absent din listă este analizat exact la fel.

Vezi cum raționează Cybseco despre un sistem real

Urmărește demonstrația interactivă, apoi solicită o perioadă de probă ghidată pentru echipa ta.