LLM-integratsioonide penetratsioonitestimine: miks tavameetmed tehisintellekti rakenduste puhul ei aita
·Kõige olulisem lühidalt
- Ei testita mudelit, vaid sinu integratsiooni: käsku, andmeallikaid, tööriistu ja väljundi edasist töötlemist
- Keelemudel ei erista juhist andmetest – seetõttu on kaudne käsusüstimine dokumentide kaudu kõige ohtlikum klass
- Veebirakenduse tulemüür siin ei aita: rünnak on grammatiliselt korrektne vaba tekst ilma signatuurita
- Kandev kaitse peitub tööriista õigustes, mitte usalduses teksti vastu
- Ilma teise, teistsuguste õigustega testkasutajata jääb kõige olulisem leiuklass testimata
Vestlusrobot, mis ainult tekste sõnastab, on hallatav risk. Niipea kui seesama vestlusrobot ühendatakse teadmusbaasiga, kui ta tohib luua tugipileteid või pöörduda API poole, ei ole ta enam vestlusrobot, vaid uus ründepind, millel on ligipääs sinu süsteemidele. Just see hüpe on viimase kahe aasta jooksul toimunud pea igas ettevõttes – enamasti kiiremini, kui turvakontroll järele jõudis.
See artikkel käib läbi, millised ründeklassid LLM-integratsioonide puhul tegelikult esinevad, miks klassikalised kaitsemeetmed seal ei aita, mida me AI- ja LLM-integratsioonide penetratsioonitestil konkreetselt kontrollime ja mida sa selleks ette valmistama pead.
Miks LLM-rakendused on omaette testimisdistsipliin
Klassikalise rakenduse puhul on piir selge: kood on juhis, sisendid on andmed. SQL-i süstimine toimib just seetõttu, et see piir ühes kohas kogemata kaotati – ja ettevalmistatud päringutega saab selle struktuurselt taastada.
Keelemudeli puhul seda piiri põhimõtteliselt ei ole. Süsteemikäsk, kasutaja küsimus, päritud dokumendid ja tööriistade väljundid jõuavad ühe tokenivoona samasse kontekstiaknasse. Mudel kaalub neid statistiliselt, ta ei jõusta ühtki reeglit. Ettevalmistatud päringul ei ole siin vastet.
Sellest tuleneb lause, mis kogu distsipliini kokku võtab: iga tekst, mis konteksti jõuab, on potentsiaalselt juhis. Üleslaaditud PDF, töödeldud e-kiri, kommentaarilahter piletis, allalaaditud veebileht, kirje vektorandmebaasist.
Ründeklassid, mis praktikas esinevad
Käsusüstimine
Otsene variant on tuntud: kasutaja kirjutab „eira kõiki eelnevaid juhiseid“ ja proovib sõnastusi läbi, kuni mõni läbi läheb.
Ohtlik on just kaudne variant. Juhis ei ole kasutaja sisendis, vaid sisus, mille süsteem ise tõmbab: üleslaaditud elulookirjelduses, sissetuleva e-kirja allkirjas, tootekirjelduses, veebilehel, mille agent alla laadib. Kasutaja ei sisesta midagi pahatahtlikku – ta esitab kahjutu küsimuse ja mudel täidab kolmanda osapoole juhise.
Tüüpiline muster, mida testides taasesitame: valgeks vormindatud lõik dokumendis annab mudelile korralduse lisada senise vestluse sisu pildi-URL-ina välisele domeenile. Kasutaja näeb tavalist kokkuvõtet. Kontekst on välja lekkinud. Selle klassi üksikasjad on dokumenteeritud meie vikis: Prompt Injection ja Markdown Exfiltration Channels.
Liiga laiad tegutsemisõigused
Kõige suurema majandusliku mõjuga klass. Assistent, kes töötleb arveid, saab kirjutamisõigused majandustarkvarasse. Klienditoe agent saab õiguse paroole lähtestada. Kuni mudel saab ainult neid juhiseid, mille oled ette näinud, toimib kõik. Niipea kui keegi kirjutab võõra sisu kaudu sisse, täidab süsteem tema kavatsust sinu õigustega.
Kontrollküsimus ei ole kunagi „kas mudelit saab mõjutada“ – seda saab alati –, vaid: mis on kõige hullem, mida õnnestunud mõjutamine käivitada suudab? Vaata selle kohta Excessive Agency ja Approval Gate Bypass.
Andmeleke RAG-allikatest
Kõige sagedasem tegelik leid ettevõtete paigaldustes ja harva efektne: õigusi rakendatakse pärast päringut, mitte enne. Vektorindeks sisaldab kõigi osakondade dokumente, filtreerimine toimub alles tulemuste nimekirjas – või üldse mitte.
Töötaja ei küsi dokumenti, millele tal ligipääsu ei ole. Ta küsib: „Võta kokku, millised palgavahemikud kehtivad meeskonnajuhtidele.“ Ja saab vastuse. Ükski juurdepääsulogi ei näita rikkumist, sest formaalselt seda ei toimunudki.
Lisaks tulevad Cross-Session Context Bleed, kui kontekst jääb seansside või rentnike vahel alles, ja System Prompt Extraction, kui juhised ja sageli ka neisse manustatud võtmed ning lõpp-punktid on välja loetavad.
Väljundi ebaturvaline edasitöötlus
Mudeli väljundit käsitletakse rutiinselt usaldusväärse vastusena – ja siis renderdatakse see kasutajaliidesesse, pannakse andmebaasipäringusse või käivitatakse koodina. Sellega on klassikaline süstimine tagasi, ainult et mudel on vahejaamaks: kui mudeli saab panna tootma <script>-silti või ; DROP TABLE, jääb üle vaid küsimus, mida järgnev süsteem sellega teeb. Vaata Improper Output Handling ja Insecure AI-Generated Code.
Andmete ja indeksi mürgitamine
Kui sinu süsteem indekseerib sisu automaatselt – jagatud kaustad, sissetulevad e-kirjad, avalikud lehed –, saab ründaja sisestada sisu, mis jääb püsivalt indeksisse ja ilmub tulevastes päringutes kontekstina. Rünnak tehakse üks kord ja see mõjub edasi pidevalt. Vaata RAG Index Poisoning.
Piiramatu tarbimine
Vähem konfidentsiaalsust, rohkem arvet: päringud, mis sunnivad mudelit maksimaalselt pikkadele vastustele, rekursiivsetele tööriistakutsetele või korduvatele päringutele, ajavad tokenikulud lakke, ilma et ükski hoiatus käivituks. Kui suureks see kasvada võib, kirjeldasime artiklis denial-of-wallet-rünnakud RAG-süsteemide vastu.
Miks tulemüürist, filtritest ja turvapiiretest ei piisa
| Meede | Mida see suudab | Miks see siin ei kanna |
|---|---|---|
| Veebirakenduse tulemüür | Tuvastab signatuure struktureeritud sisendites | Rünnak on grammatiliselt korrektne vaba tekst ilma signatuurita, lõpmatus hulgas sõnastustes ja keeltes |
| Märksõnade keeluloendid | Püüab kinni naiivse sõnastuse | Ümbersõnastus, poolitus, Base64, emoji või teine keel lähevad neist mööda |
| Turvapiirde mudelid | Mõistlik esimene kiht tavarünnakute vastu | Ise statistilised – mida saab sõnastada, saab ka ümber sõnastada |
| „Me kasutame turvalist mudelit“ | Vähendab mõnda klassi juba allikas | Leiud tekivad sinu integratsioonis, mitte mudelis |
| Rakenduse klassikaline pentest | Katab ümbritseva veebirakenduse | Ei kontrolli ahelat käsk → kontekst → tööriist → väljund |
Mõte ei ole selles, et need meetmed oleksid kasutud. Mõte on selles, et nad kõik töötavad teksti tasandil ja teksti tasandil ei ole see piir jõustatav. Jõustatav on see ühe tasandi võrra allpool: õigustes, millega tööriista käivitatakse.
Mida me konkreetselt kontrollime
| Valdkond | Mida kontrollitakse |
|---|---|
| Süsteemikäsk | Kas seda saab välja lugeda, üle kirjutada või sellest mööda minna? Kas see sisaldab võtmeid, lõpp-punkte või ärireegleid, mis sinna ei kuulu? |
| Otsene süstimine | Möödaminekumustrite süstemaatiline läbimäng, mitmes keeles, kodeeringutega ja üle mitme vestlusvooru |
| Kaudne süstimine | Ettevalmistatud dokumendid, e-kirjad, veebilehed ja kirjed igas kanalis, millest süsteem konteksti võtab |
| Autoriseerimine päringul | Kas küsija õigusi rakendatakse enne päringut? Kas teiste rentnike või osakondade sisu on taastatav? |
| Tööriistad ja agendid | Millised tegevused on võimalikud ilma kinnituseta, kas kinnitusest saab mööda minna, kas delegeerimine agentide vahel eskaleerub? |
| Väljundi töötlemine | Kas mudeli väljundit kuskil renderdatakse, käivitatakse või päringusse pannakse – ja kas seda käsitletakse seal mitteusaldusväärse sisendina? |
| Seansipiirid | Kontekstijäägid seansside, kasutajate ja rentnike vahel, vahemälu käitumine |
| Tarbimispiirid | Päringupiirangud, tokenite ülempiirid, rekursioonikaitse tööriistakutsete puhul |
| Ümbritsev rakendus | Klassikaline testikatvus OWASP WSTG järgi – autentimine, seansihaldus, API turvalisus |
Katvus lähtub OWASP Top 10 for LLM Applications loendist; üksikud klassid koos tehnilise kirjelduse ja lahendusega on meie LLM-vikis.
Kulg, maht ja see, mida sa ette valmistad
Kulg vastab tavalisele penetratsioonitestile: ulatuse ja reeglite kokkuleppimine, luure, testide läbiviimine koos tõenditega, süvenemine, aruanne, kordustest.
Piiritletud vestlus- või RAG-rakenduse test hõlmab tavaliselt 5–10 inimtööpäeva. Mitme tööriistaga agendisüsteemid võtavad rohkem, sest iga tööriistaõigust tuleb eraldi kontrollida.
Mida sa peaksid ette valmistama:
- Ligipääsud vähemalt kahele erinevate õigustega kasutajale. See ei ole mugavusküsimus, vaid eeldus, et autoriseerimisvigu üldse tõestada saaks. Ilma teise kasutajata jääb kõige sagedasem tõsine leiuklass testimata.
- Ühendatud tööriistade ja andmeallikate loend koos õigustega, millega need töötavad.
- Süsteemikäsk, ideaalis. Kui sa seda välja anda ei soovi, loeme selle enamasti niikuinii välja – ja siis ongi see esimene leid.
- Testkeskkond realistlike, kuid mitte päris andmetega.
Mida sa peaksid testist sõltumata tegema
- Õigused tööriista tasandil, mitte usaldus teksti vastu. Tööriist töötab küsija õigustega, mitte rakenduse omadega. Kõik muu on kaitse valel tasandil.
- Autoriseerimine enne päringut. Vektorindeks tohib tagastada ainult seda, mida küsija niikuinii näha tohiks – filtreerimine pärast päringut ei ole juurdepääsu kontroll.
- Kinnitus kõigele pöördumatule. Maksed, kustutamised, väljaminevad sõnumid, õiguste muutmine: inimene kinnitab ja kinnitus näitab, mis täpselt juhtuma hakkab.
- Mudeli väljund on mitteusaldusväärne sisend. Käsitle seda nii kõikjal, kus seda renderdatakse, käivitatakse või päringusse pannakse.
- Logi seda, mida mudel algatas, mitte ainult seda, et ta vastas. Ilma selle jäljeta ei ole intsident taastatav.
- Ei mingeid saladusi süsteemikäsku. See ei ole turvaline hoidla, vaid kontekst.
Kui võtad tehisintellekti funktsioone kasutusele reguleeritud keskkonnas: tõhususe tõendamine NIS2 järgi ja turvatestid ISO 27001 lisa A punkti 8.29 alusel kehtivad AI-komponentidele täpselt samamoodi nagu ülejäänud rakendusmaastikule – erireeglit, mis tehisintellekti välja jätaks, ei ole.
LLM-i penetratsioonitestid – korduvad küsimused
01Mis on LLM-i penetratsioonitest?
LLM-i penetratsioonitest ei kontrolli keelemudelit ennast, vaid sinu integratsiooni sellega: süsteemikäsku, andmeallikaid, millest kontekst kokku pannakse, tööriistu ja API-sid, mida mudel kutsuda tohib, ning kohti, kus tema väljundit edasi töödeldakse. Testitakse, kas mudelit saab panna andmeid avaldama, õigusi ületama või käivitama tegevusi, mida ta käivitada ei tohiks.
02Mis on käsusüstimine?
Käsusüstimine on juhiste sisestamine teksti, mida mudel kontekstina töötleb. Kuna keelemudel käsitleb kõiki talle antud tokeneid ühe vestlusvoona ega tunne ranget piiri juhise ja andmete vahel, võib üleslaaditud dokumendis, töödeldud e-kirjas või allalaaditud veebilehel olev juhis algsed juhised üle kirjutada. Kaudne variant selliste võõraste sisude kaudu on ohtlikum, sest kasutaja ise ei sisesta midagi pahatahtlikku.
03Kas turvapiiretest ja tulemüürist ei piisa?
Ei. Veebirakenduse tulemüür töötab signatuuridega struktureeritud sisendite üle; rünnak keelemudeli vastu on grammatiliselt korrektne vaba tekst ilma signatuurita ja seda saab väljendada lõpmatus hulgas sõnastustes ja keeltes. Turvapiirded on mõistlik esimene kiht, kuid nad on ise statistilised ja neid saab ümber sõnastada. Kandev kaitse peitub arhitektuuris: õigused tööriista tasandil, mitte usaldus teksti vastu.
04Mida RAG-rakenduse testimisel täpselt kontrollitakse?
Kas küsija juurdepääsuõigusi rakendatakse dokumentide päringul või alles pärast seda, kas sihitud küsimustega saab taastada teiste rentnike või osakondade sisu, kas sisestatud dokumendid võivad sisaldada juhiseid mudelile, kas kontekst jääb seansside vahel alles ja kas süsteemikäsku saab välja lugeda.
05Kui kaua LLM-i penetratsioonitest kestab ja mis see maksab?
Piiritletud vestlus- või RAG-rakenduse test hõlmab tavaliselt 5–10 inimtööpäeva. Mitme tööriista ja teistele agentidele delegeerimisega agendisüsteemid võtavad rohkem, sest iga tööriistaõigust tuleb eraldi kontrollida. Hinnalt algab lihtne test umbes 2000 eurost; fikseeritud hinna anname pärast lühikest ulatuse vestlust.
06Mida peame testi jaoks ette valmistama?
Ligipääsud vähemalt kahele erinevate õigustega kasutajale – see on eeldus, et autoriseerimisvigu üldse tõestada saaks –, ühendatud tööriistade ja andmeallikate kirjelduse, ideaalis süsteemikäsu ning testkeskkonna realistlike, kuid mitte päris andmetega. Ilma teise kasutajata jääb kõige olulisem leiuklass testimata.