Loo tasuta konto
LLM-rakenduste koodi turvalisus

Teie mudeli väljund on ebausaldusväärne sisend. Leidke kohad, kus teie kood selle unustab.

Teie LLM-i ümbritseva koodi staatiline analüüs — koodi, mis koostab viiba, kutsub mudelit ja teeb vastusega midagi. Mitte mudeli. Mitte viiba vastupidavuse jailbreak'ile. Koodi.

Tasuta pakett hõlmab 3 projekti ja 30 analüüsi kuus, ilma kasutajate arvu piiranguta ja ilma pangakaardita. See analüüs mahub sinna.

Probleem

Mudel ei ole teek. See on ebausaldusväärne tõlk: annate talle sõne ja tema annab ühe tagasi. Kõik, mis seda sõne mõjutas — kasutaja enda viip, leht, mida talle näidati, dokument, mille ta sai, mõne teise tööriista tulemus — mõjutas ka vastust.

Vastus on kahjutu seni, kuni kood annab talle võime tegutseda. Oht ei ole selles, et mudel midagi ütles, vaid selles, et programm seda uskus. Iga koht, kus programm käsitleb loodud teksti koodina, käsuna, päringuna, teena või URL-ina, on süst ühe hüppe kaugusel — ja erinevalt küsimusest, kas viipa saab jailbreak'iga mööda minna, on see hüpe lähtekoodis näha.

Mida Cybseco otsib

Seal, kus mudeli väljund jõuab millenigi, mis tegutseb. Need on mootori enda kategooriad, raskusastmed ja CWE-tunnused.

Koodi käivitamine — CWE-94
kriitiline
eval, exec, compile, new Function, pickle.loads, yaml.load — vastusest saab programm.
Kest — CWE-78
kriitiline
os.system, subprocess, child_process.exec, execSync — vastusest saab käsk.
SQL-päring — CWE-89
kõrge
execute, raw, createQuery — text-to-SQL on täpselt see muster ja DROP TABLE on usutav jätk.
Failitee — CWE-22
kõrge
open, readFile, shutil.rmtree, unlink — ../../etc/passwd on sama usutav jätk.
Väljuv päring — CWE-918
kõrge
requests, httpx, fetch, axios, urlopen — serveripoolne päringuvõltsing, mille valib mudel.

Konkreetne näide

Üheksa rida ja kogu riski kuju.

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)
Allikas
client.chat.completions.create(…) — kutse, mis tagastab mudeli väljundi. Analüsaator seob muutuja, millele see omistati, ja just see võimaldab tal väärtust funktsioonis jälgida ilma protseduuridevahelise analüüsita.
Voog
answer sisaldab teksti, mida ründaja on saanud mõjutada. Kutse ja suubla vahel ei kontrolli seda miski, ei piira seda miski ega teisenda seda kindlaks hulgaks operatsioonideks.
Suubla
exec(…) — tekstist saab programm rakenduse enda protsessis, koos selle mandaatide, võrgu ja failisüsteemiga.
Miks see loeb
Kõik, mis saab mõjutada muutujat task — otse või mudelile näidatud dokumendi kaudu — valib, mis käivitub. See on koodi kaugkäivitus ühe hüppe kaugusel.

Praeguse mootoriga käivitatuna annab see katke ühe leiu: llm-output-to-code-execution, CWE-94, raskusaste kriitiline, kindlus kõrge, real exec. Kindlus on kõrge, sest muutuja on seotud tegeliku completion-kutsega. Nimi, mis üksnes näeb välja nagu mudeli vastus — llm_response, reply — raporteeritakse hoopis keskmise kindlusega, sest see on oletus ja muud väita tähendaks tõendite kohta valetada.

Mis see ei ole

See ei ole mudeli testimine
Me ei sondeeri mudelit, ei tee sellele red teaming'ut ega hinda, kuidas see surve all käitub. Miski siin ei ütle, kas viipa saab jailbreak'iga mööda minna: seda ei saa lähtekoodist otsustada ja selle väitmine oleks täpselt see väidete liik, mille vältimiseks see mootor olemas on.
See ei ole täielik viibasüsti tuvastus
Kaudset süsti raporteerime seal, kus ebausaldusväärne sisu tõendatavalt viipa jõuab. Kanalit, mida me koodis ei näe, me ei raporteeri.
See ei ole garantii agendi kohta
Raporteerime, et agendile anti tööriist, mis käivitab koodi või käske. Mida agent seejärel käitusajal teeb, jääb väljapoole seda, mida staatiline analüüs otsustada saab.
Täiendab käitusaegset tehisintellekti turvalisust
Kaitsepiirded, hindamisraamistikud ja red teaming vastavad küsimustele, millele see ei suuda, ja see vastab küsimustele, millele nemad ei suuda. Kumbki ei asenda teist.

Muud LLM-ile omased riskid koodis

Igaüks neist vallandati näidisel praeguse mootori vastu, enne kui see siia kirja pandi.

Saladused ja isikuandmed viipa põimitud — CWE-200
api_key, parool, IBAN või terviseandmed teie saadetavas tekstis. Raporteeritakse seal, kus tõepoolest ehitatakse viiba konteksti, mitte igal f-sõnel, mis juhtumisi sisaldab võtit.
Agent, kellele anti koodi või käske käivitav tööriist — CWE-250
PythonREPLTool, ShellTool, koodi tõlk, terminal. Ühe neist andmine muudab iga viibasüsti küsimuse koodi kaugkäivituse küsimuseks.
Raamistiku kaitse uuesti välja lülitatud — CWE-502
allow_dangerous_deserialization=True, trust_remote_code=True, dangerouslyAllow… — raamistik lülitas selle välja, sest see oli ohtlik.
Teenusepakkuja turvakontrollid välja lülitatud — CWE-693
BLOCK_NONE, safety_settings=None, moderation=false.
Käitusajal alla laaditud viip või agendi määratlus — CWE-829
hub.pull(…), HTTP kaudu laaditud viibamall. Kes seda lõpp-punkti kontrollib, kontrollib juhiseid.
Ebausaldusväärne sisu otse viipa laaditud — CWE-77
Kraabitud leht, PDF, hoidla, wiki. See on kaudse süsti kanal, mida tuntakse ära selle järgi, kust tekst tuli, mitte selle järgi, mida see ütleb.
Mudeli API-võti lähtekoodi kirjutatud — CWE-798
sk-…, sk-ant-…, AIza…, hf_… hoidlasse sisse kantud.
Kasutuselt kõrvaldatud või asendatud mudel koodi kinnitatud — CWE-1104
text-davinci-*, gpt-4-0314, claude-instant — nõrgem juhiste hierarhia, süsteemiviiba eraldamiseta.

Miks sellest midagi uskuda

Avaldatud võrdlusmõõdistik
Täpsus, saagis ja F1 CWE, keele ja analüüsikihi kaupa, versioonitud ja käsitsi märgendatud korpuse peal. Vaata numbreid.
Avaldatud ulatus
Iga kiht, mida me ei mõõda, on nimetatud koos põhjusega. Loe metoodikat.
Kontroll avalikul koodil
Analüüsitud hoidlad ja commitid, ettetulnud keeled, lõpetamismäär ja determinism — mahud ja määrad, mitte väited täpsuse kohta. Vaata käivitusi.
Iga leid kannab oma tõendit
Fail, rida, leitud konstruktsioon ja CWE. Leid, mida te kontrollida ei saa, on leid, mille järgi ei tasu tegutseda.

Teenusepakkujast sõltumatu juba ülesehituselt. Analüsaator tunneb ära kuju — miski toodab teksti, miski tarbib selle — mitte ühe konkreetse SDK kirjaviisi. Ta nimetab raamistiku, mida nägi, kui suudab (OpenAI, Anthropic, Google, Azure OpenAI, Mistral, Bedrock, Ollama, LiteLLM, LangChain, LangGraph, LlamaIndex, Semantic Kernel, AutoGen, CrewAI, Hugging Face), et leid saaks öelda, kust see tuli. See on silt leiul, mitte SDK-põhine lõimimine, ja raamistikku, mida selles loendis ei ole, analüüsitakse täpselt samamoodi.

Vaata, kuidas Cybseco reaalse süsteemi üle arutleb

Vaata interaktiivset demo ja seejärel taotle oma meeskonnale juhendatud prooviperioodi.