Luo maksuton tili
LLM-sovellusten koodin turvallisuus

Mallisi tuloste on epäluotettavaa syötettä. Etsi kohdat, joissa koodisi unohtaa sen.

Staattinen analyysi LLM:n ympärillä olevasta koodista — koodista, joka rakentaa kehotteen, kutsuu mallia ja tekee vastauksella jotakin. Ei mallista. Ei kehotteen kestävyydestä jailbreakia vastaan. Koodista.

Maksuton taso kattaa 3 projektia ja 30 analyysia kuukaudessa, ilman käyttäjämäärän rajaa ja ilman maksukorttia. Tämä analyysi sisältyy siihen.

Ongelma

Malli ei ole kirjasto. Se on epäluotettava tulkki: annat sille merkkijonon ja se antaa yhden takaisin. Kaikki, mikä vaikutti siihen merkkijonoon — käyttäjän oma kehote, sivu joka sille näytettiin, asiakirja joka sille annettiin, toisen työkalun tulos — vaikutti vastaukseen.

Vastaus on vaaraton, kunnes koodi antaa sille kyvyn toimia. Vaara ei ole se, että malli sanoi jotakin; vaara on se, että ohjelma uskoi sen. Jokainen kohta, jossa ohjelma käsittelee tuotettua tekstiä koodina, komentona, kyselynä, polkuna tai URL-osoitteena, on injektio yhden hypyn päässä — ja toisin kuin kysymys siitä, voiko kehotteen kiertää jailbreakilla, tämä hyppy näkyy lähdekoodissa.

Mitä Cybseco etsii

Kohdat, joissa mallin tuloste päätyy johonkin, joka toimii. Nämä ovat moottorin omat kategoriat, vakavuusasteet ja CWE-tunnisteet.

Koodin suoritus — CWE-94
kriittinen
eval, exec, compile, new Function, pickle.loads, yaml.load — vastauksesta tulee ohjelma.
Komentotulkki — CWE-78
kriittinen
os.system, subprocess, child_process.exec, execSync — vastauksesta tulee komento.
SQL-kysely — CWE-89
korkea
execute, raw, createQuery — text-to-SQL on täsmälleen tämä kuvio, ja DROP TABLE on uskottava jatko.
Tiedostopolku — CWE-22
korkea
open, readFile, shutil.rmtree, unlink — ../../etc/passwd on yhtä uskottava jatko.
Ulospäin lähtevä pyyntö — CWE-918
korkea
requests, httpx, fetch, axios, urlopen — palvelinpuolen pyyntöväärennös, mallin valitsemana.

Konkreettinen esimerkki

Yhdeksän riviä, ja koko riskin muoto.

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)
Lähde
client.chat.completions.create(…) — kutsu, joka palauttaa mallin tulosteen. Analysaattori sitoo muuttujan, johon se sijoitettiin, ja juuri se antaa sen seurata arvoa funktion läpi ilman proseduurien välistä analyysia.
Kulku
answer sisältää tekstiä, johon hyökkääjä on voinut vaikuttaa. Kutsun ja nielun välissä mikään ei tarkasta sitä, rajoita sitä eikä kuvaa sitä kiinteään joukkoon operaatioita.
Nielu
exec(…) — tekstistä tulee ohjelma sovelluksen omassa prosessissa, sen tunnuksilla, sen verkolla ja sen tiedostojärjestelmällä.
Miksi sillä on merkitystä
Kaikki, mikä voi vaikuttaa muuttujaan task — suoraan tai mallille näytetyn asiakirjan kautta — valitsee, mitä suoritetaan. Tämä on koodin etäsuoritus yhden hypyn päässä.

Nykyisellä moottorilla ajettuna tuo katkelma tuottaa yhden havainnon: llm-output-to-code-execution, CWE-94, vakavuus kriittinen, varmuus korkea, rivillä exec. Varmuus on korkea, koska muuttuja on sidottu todelliseen completion-kutsuun. Nimi, joka vain näyttää mallin vastaukselta — llm_response, reply — raportoidaan sen sijaan keskitasoisella varmuudella, koska se on arvaus ja muun väittäminen olisi valehtelua näytöstä.

Mitä tämä ei ole

Ei mallin testaus
Emme luotaa mallia, emme tee sille red teamingia emmekä arvioi, miten se käyttäytyy paineessa. Mikään tässä ei kerro, voiko kehotteen kiertää jailbreakilla: sitä ei voi päätellä lähdekoodista, ja sen väittäminen olisi juuri sellainen väite, jonka välttämiseksi tämä moottori on olemassa.
Ei täydellinen kehoteinjektion tunnistus
Epäsuora injektio raportoidaan siellä, missä epäluotettava sisältö todistettavasti päätyy kehotteeseen. Kanavaa, jota emme näe koodissa, emme raportoi.
Ei takuu agentista
Raportoimme, että agentille on annettu työkalu, joka suorittaa koodia tai komentoja. Se, mitä agentti sitten ajonaikana tekee, on staattisen analyysin ratkaisukyvyn ulkopuolella.
Täydentää ajonaikaista tekoälyturvallisuutta
Suojakaiteet, arviointikehikot ja red teaming vastaavat kysymyksiin, joihin tämä ei pysty, ja tämä vastaa kysymyksiin, joihin ne eivät pysty. Kumpikaan ei korvaa toista.

Muita LLM-kohtaisia riskejä koodissa

Jokainen niistä laukaistiin näytteellä nykyistä moottoria vasten ennen kuin se kirjoitettiin tähän.

Salaisuuksia ja henkilötietoja upotettu kehotteeseen — CWE-200
api_key, salasana, IBAN tai potilastieto lähettämäsi tekstin sisällä. Raportoidaan siellä, missä todellista kehotekontekstia rakennetaan, ei jokaisesta f-merkkijonosta, joka sattuu sisältämään avaimen.
Agentti, jolle annettiin koodia tai komentoja suorittava työkalu — CWE-250
PythonREPLTool, ShellTool, koodintulkki, pääte. Yhdenkin niistä antaminen muuttaa jokaisen kehoteinjektiokysymyksen koodin etäsuorituskysymykseksi.
Kehyksen suojaus kytketty takaisin pois päältä — CWE-502
allow_dangerous_deserialization=True, trust_remote_code=True, dangerouslyAllow… — kehys oli kytkenyt sen pois, koska se oli turvatonta.
Palveluntarjoajan turvakontrollit poistettu käytöstä — CWE-693
BLOCK_NONE, safety_settings=None, moderation=false.
Ajonaikana haettu kehote tai agenttimääritys — CWE-829
hub.pull(…), HTTP:n yli ladattu kehotepohja. Se, joka hallitsee tuota päätepistettä, hallitsee ohjeita.
Epäluotettavaa sisältöä ladattu suoraan kehotteeseen — CWE-77
Kaavittu sivu, PDF, repositorio, wiki. Tämä on epäsuoran injektion kanava, tunnistettuna siitä, mistä teksti tuli, eikä siitä, mitä se sanoo.
Mallin API-avain kirjoitettu lähdekoodiin — CWE-798
sk-…, sk-ant-…, AIza…, hf_… viety repositorioon.
Poistettu tai korvattu malli lukittuna koodiin — CWE-1104
text-davinci-*, gpt-4-0314, claude-instant — heikompi ohjehierarkia, ei järjestelmäkehotteen erottelua.

Miksi uskoa mitään tästä

Julkaistu vertailuaineisto
Tarkkuus, saanti ja F1 CWE:ittäin, kielittäin ja analyysikerroksittain, versioidun ja käsin merkityn korpuksen yli. Katso luvut.
Julkaistu rajaus
Jokainen kerros, jota emme mittaa, on nimetty perusteluineen. Lue menetelmä.
Validointi julkisella koodilla
Analysoidut repositoriot ja commitit, vastaan tulleet kielet, valmistumisaste ja determinismi — määriä ja osuuksia, ei väitteitä tarkkuudesta. Katso ajot.
Jokainen havainto kantaa näyttönsä
Tiedosto, rivi, osunut rakenne ja CWE. Havainto, jota et voi tarkistaa, on havainto, jonka perusteella ei pidä toimia.

Palveluntarjoajariippumaton rakenteeltaan. Analysaattori tunnistaa muodon — jokin tuottaa tekstiä, jokin kuluttaa sen — eikä yhden SDK:n kirjoitusasua. Se nimeää näkemänsä kehyksen kun voi (OpenAI, Anthropic, Google, Azure OpenAI, Mistral, Bedrock, Ollama, LiteLLM, LangChain, LangGraph, LlamaIndex, Semantic Kernel, AutoGen, CrewAI, Hugging Face), jotta havainto voi kertoa mistä se tuli. Se on merkintä havainnossa, ei SDK-kohtainen integraatio, ja listalta puuttuva kehys analysoidaan täsmälleen samalla tavalla.

Näe Cybseco päättelemässä todellisesta järjestelmästä

Katso interaktiivinen demo ja pyydä sitten opastettu kokeilu tiimillesi.