Nazaj na blog

Varnost GraphQL: Onkraj ranljivosti REST

September 19, 2024 8 min branja
Varnost GraphQL: Onkraj ranljivosti REST
Nazadnje posodobljeno:

GraphQL je hitro postal prevladujoca tehnologija API za sodobne aplikacije, ki odjemalcem ponuja prilagodljivost pri zahtevanju tocno tistih podatkov, ki jih potrebujejo. Vendar ta prilagodljivost prinasa edinstveno napadalno povrsino, ki se bistveno razlikuje od tradicionalnih API-jev REST. Medtem ko so koncne tocke REST fiksne in predvidljive, GraphQL izpostavlja eno samo koncno tocko z mocnim poizvedovalnim jezikom, ki ga napadalci lahko izkoristijo na nepricakovane nacine. V tem vodniku bomo pregledali najkriticnejse varnostne tezave GraphQL in predstavili strukturirano metodologijo testiranja.

Kaj naredi GraphQL drugacen od REST

Z varnostnega vidika vec znacilnosti GraphQL bistveno spremeni model grozenj. API-ji REST izpostavljajo vec koncnih tock, od katerih vsaka vraca fiksno podatkovno strukturo. GraphQL vse konsolidira za eno samo koncno tocko in sprejema prilagodljive poizvedbe, ki jih streznik dinamicno razresi. To pomeni, da tradicionalne varnostne kontrole na ravni koncnih tock, omejevanje hitrosti in pravila WAF pogosto odpovedo. Strogo tipizirana shema deluje kot prednost in slabost hkrati: uveljavlja podatkovne tipe, vendar lahko tudi razkrije celotno strukturo API prek introspekcije. Poleg tega narava poizvedb, ki jih vodi odjemalec, pomeni, da lahko napadalci oblikujejo zahteve, ki jih razvijalci med nacrtovanjem nikoli niso predvideli.

Napadi z introspekcijo

Introspekcija je vgrajena funkcija GraphQL, ki odjemalcem omogoca poizvedovanje po sami shemi. Ceprav je med razvojem neprecenljiva, njena omogocenost v produkciji dejansko napadalcem preda popoln zemljevid vasega API-ja.

S posiljanjem poizvedbe na __schema lahko napadalec pregleda vsak tip, polje, argument, mutacijo in narocnino, ki jo API izpostavlja. To vkljucuje polja, ki morda niso nikjer referencirana v uporabniskem vmesniku, vendar so se vedno dostopna, kot so administrativne mutacije ali zastarele koncne tocke s sibkejsimi varnostnimi kontrolami.

  • Odkrivanje sheme - Poizvedba { __schema { types { name fields { name type { name } } } } } razkrije celoten podatkovni model, vkljucno s skritimi ali nedokumentiranimi tipi
  • Presejanje mutacij - Napadalci lahko odkrijejo mutacije kot deleteUser, changeRole ali resetPassword, ki morda nimajo ustreznih preverjanj avtorizacije
  • Analiza argumentov - Argumenti polj razkrijejo pricakovane vhodne tipe, moznosti filtriranja in notranje konvencije poimenovanja, ki informirajo nadaljnje napade
  • Orodja za vizualizacijo - Orodja kot GraphQL Voyager generirajo interaktivne vizualne zemljevide sheme, kar olajsa prepoznavanje visoko vrednih ciljev, kot so objekti uporabnikov, polja za placila ali administrativne mutacije

Tudi ko je introspekcija onemogocena, lahko napadalci uporabijo napake s predlogi polj za rekonstrukcijo sheme z grobo silo. Mnoge implementacije GraphQL vracajo koristna sporocila o napakah, kot je "Ali ste mislili userEmail?", ko je poizvedeno neveljavno polje, kar omogoca postopno odkrivanje sheme.

Napadi z grupiranjem in vzdevki

GraphQL izvorno podpira posiljanje vec operacij v eni sami zahtevi HTTP prek grupiranja poizvedb in vzdevkov. Ta funkcija, ceprav prirocna za legitimne odjemalce, ustvarja mocne vektorje napadov.

  • Obvod omejitve hitrosti - Ce se omejevanje hitrosti uporabi na ravni zahteve HTTP in ne na ravni operacije, lahko napadalec poslje na stotine poizvedb v eni sami zahtevi, s cimer ucinkovito v celoti obvozi kontrole hitrosti
  • Groba sila poverilnic - Z uporabo vzdevkov lahko napadalec poskusi na stotine prijavnih kombinacij v eni zahtevi: a1: login(user:"admin", pass:"pass1") { token } a2: login(user:"admin", pass:"pass2") { token } in tako naprej, s cimer testira ogromno stevilo poverilnic, medtem ko se prikazuje kot ena sama zahteva
  • Obvod OTP - Kode za dvostopenjsko overitev je mogoce razbiti z grobo silo z grupiranjem na stotine poskusov preverjanja, ki se pogosto zakljucijo, preden OTP potece
  • Presejanje v velikem obsegu - Grupiranje iskanj uporabnikov ali mutacij za ponastavitev gesel za presejanje veljavnih racunov brez sprozitve pragov zaznave

Zavrnitev storitve prek kompleksnosti poizvedb

Rekurzivna narava tipov GraphQL ustvarja priloznosti za napade z izcrpavanjem virov, ki nimajo neposrednega ekvivalenta v API-jih REST.

  • Globoko vgnezdene poizvedbe - Ko se tipi sklicujejo drug na drugega (npr. Uporabnik ima Objave, Objava ima Avtorja, Avtor ima Objave), lahko napadalec sestavi poizvedbe, vgnezdene na desetine ravni globoko, kar povzroci eksponentno obremenitev baze podatkov
  • Eksplozija kompleksnosti poizvedb - Tudi brez globokega gnezdenja lahko zahtevanje mnogih polj s tipi seznamov, ki vsako sprozijo drage razresevalce, izcrpa vire streznika
  • Krozne reference fragmentov - Zlonamerno oblikovani fragmenti, ki se sklicujejo drug na drugega, lahko ustvarijo neskoncne zanke, ce streznik ne implementira ustrezne validacije. Ceprav vecina zrelih implementacij to zdaj preprecuje, so lastne implementacije lahko ranljive
  • Izcrpavanje virov prek paginacije - Zahtevanje izjemno velikih velikosti strani (npr. first: 999999) na tipih povezav lahko prisili streznik, da nalozi in serializira ogromne nabore podatkov

Tezave z avtorizacijo

Avtorizacija v GraphQL je zloglasno tezka za pravilno implementacijo, ker je treba nadzor dostopa uveljavljati na ravni polj, ne le na ravni koncnih tock kot pri REST.

  • Vrzeli avtorizacije na ravni polj - Poizvedba uporabnika morda pravilno omejuje dostop do profilov drugih uporabnikov, vendar se vedno izpostavlja obcutljiva polja kot email, ssn ali salary, ko so dostopana prek drugacne poti v grafu
  • IDOR prek Relay ID-jev vozlisc - Implementacije, ki uporabljajo specifikacijo Relay, izpostavljajo globalno poizvedbo node(id: "..."). Ker so ID-ji vozlisc Relay pogosto zaporedna stevila, kodirana v base64, jih napadalci lahko dekodirajo, povecajo in dostopajo do poljubnih objektov ne glede na predvideno pot dostopa
  • Obvod avtorizacije mutacij - Dostop za branje in dostop za pisanje sta pogosto nedosledna. Uporabnik, ki ne more pregledati administrativnih nastavitev prek poizvedbe, jih morda se vedno lahko spremeni prek mutacije, ce so preverjanja avtorizacije implementirana samo na razresevalcih poizvedb
  • Avtorizacija narocnin - Narocnine na osnovi WebSocket pogosto nimajo enakih preverjanj avtorizacije, ki se uporabljajo za poizvedbe in mutacije, kar nepooblascenim uporabnikom omogoca prejemanje posodobitev v realnem casu o spremembah obcutljivih podatkov

Napadi z vbrizgavanjem

GraphQL ni imun na tradicionalne ranljivosti vbrizgavanja. Poizvedovalni jezik je zgolj transportna plast, osnovni razresevalci pa se vedno komunicirajo z bazami podatkov in drugimi sistemi.

  • SQL vbrizgavanje - Argumenti GraphQL, posredovani neposredno v poizvedbe SQL brez parametrizacije, so ranljivi. To je posebej pogosto pri argumentih za filtriranje in iskanje
  • NoSQL vbrizgavanje - Ko razresevalci komunicirajo z MongoDB ali podobnimi bazami podatkov, je mogoce manipulirati strukture argumentov na osnovi JSON za vbrizgavanje operatorjev kot $gt, $regex ali $where

Razkritje informacij

Implementacije GraphQL pogosto uhajajo obcutljive informacije prek obravnave napak in funkcij za razhroscevanje.

  • Podrobna sporocila o napakah - Podrobna sporocila o napakah lahko razkrijejo imena tabel baze podatkov, imena stolpcev, notranje URL-je storitev in informacije o tehnoloskem skladu
  • Sledi sklada - Razvojne konfiguracije, po nesreci uvedene v produkcijo, izpostavljajo celotne sledi sklada s potmi do datotek, verzijami knjiznic in podrobnostmi notranje arhitekture
  • Nacin za razhroscevanje - Nekateri strezniki GraphQL izpostavljajo nacin za razhroscevanje, ki vraca nacrte izvajanja poizvedb, casovne informacije razresevalcev in poizvedbe SQL, ki se izvajajo
  • Predlogi polj - Koristna sporocila o napakah, ki predlagajo veljavna imena polj, omogocajo rekonstrukcijo sheme tudi brez introspekcije

Metodologija testiranja po korakih

  1. Odkrijte koncno tocko - Poiscite pogoste poti: /graphql, /gql, /api/graphql, /v1/graphql. Preverite izvorne datoteke JavaScript za reference koncnih tock
  2. Testirajte introspekcijo - Posljite polno poizvedbo introspekcije in analizirajte celotno shemo. Ce je onemogocena, poskusite z grobo silo polj z uporabo seznamov besed
  3. Preslikajte shemo - Uporabite GraphQL Voyager za vizualizacijo grafa tipov in prepoznavanje visoko vrednih ciljev: tipov uporabnikov, administrativnih mutacij, polj povezanih s placili
  4. Testirajte overitev - Preverite, da vse poizvedbe, mutacije in narocnine zahtevajo ustrezno overitev. Testirajte s poteklimi, neveljavnimi in manjkajocimi zetoni
  5. Testirajte avtorizacijo - Za vsako poizvedbo in mutacijo testirajte dostop z razlicnimi uporabniskimi vlogami. Posebno pozornost posvetite poizvedbi node in razmerjem, ki presegajo meje avtorizacije
  6. Testirajte grupiranje in vzdevke - Poskusite z grobo silo poverilnic in obvodom omejitve hitrosti z uporabo grupiranih poizvedb in operacij z vzdevki
  7. Testirajte kompleksnost poizvedb - Oblikujte globoko vgnezdene poizvedbe in merite odzivni cas streznika ter porabo virov za prepoznavanje potenciala DoS
  8. Testirajte vbrizgavanje - Vbrizgajte vsebine SQL, NoSQL in ukaznega vbrizgavanja v vse argumente, zlasti parametre za filtriranje, iskanje in razvrscanje
  9. Analizirajte obravnavo napak - Posljite napacno oblikovane poizvedbe in neveljavne vnose za preverjanje uhajanja informacij v odgovorih na napake
  10. Preglejte narocnine - Ce so na voljo narocnine WebSocket, testirajte avtorizacijo in validacijo vnosov na vseh operacijah narocnin

Bistvena orodja

  • GraphQL Voyager - Interaktivna vizualizacija sheme, ki generira vizualni graf tipov in njihovih razmerij, neprecenljiva za razumevanje kompleksnih shem
  • InQL (razsiritev za Burp Suite) - Avtomatizira introspekcijo GraphQL, generira poizvedbe za vse tipe in mutacije ter se integrira z Burp Scanner za avtomatizirano odkrivanje ranljivosti
  • Altair GraphQL Client - Zmogljivo razvojno okolje GraphQL s podporo za narocnine, nalaganje datotek in spremenljivke okolja, uporabno za rocno testiranje
  • graphql-cop - Orodje za varnostno revizijo, ki samodejno preverja pogoste napacne konfiguracije GraphQL, vkljucno z introspekcijo, predlogi polj, podporo za grupiranje in omejitvami globine poizvedb
  • CrackQL - Namensko orodje za grobo silo poverilnic GraphQL z uporabo poizvedb z vzdevki

Priporocila za odpravo

  • Onemogocite introspekcijo v produkciji - To je najpomembnejsi ukrep utrjevanja. Zagotovite, da je introspekcija onemogocena v vseh nerazvojnih okoljih
  • Implementirajte omejevanje globine poizvedb - Nastavite maksimalno globino poizvedb (obicajno 7-10 ravni) za preprecevanje napadov z globoko vgnezdenimi poizvedbami
  • Uporabite analizo kompleksnosti poizvedb - Dodelite ocene kompleksnosti poljem in nastavite maksimalno skupno kompleksnost na poizvedbo. Polja seznamov in polja z dragimi razresevalci naj imajo visje ocene
  • Uveljavljajte avtorizacijo na ravni polj - Implementirajte preverjanja avtorizacije v vsakem razresevalcu, ne le na ravni poizvedbe ali mutacije. Uporabite pristop na osnovi vmesne programske opreme ali direktiv za doslednost
  • Omejite hitrost na ravni operacije - Stejte posamezne operacije znotraj grupiranih zahtev in uporabite omejitve hitrosti na operacijo, ne na zahtevo HTTP
  • Validirajte in ocistite vse vnose - Obravnavajte argumente GraphQL z enako strogostjo kot katerikoli drug uporabniski vnos. Uporabite parametrizirane poizvedbe za vse interakcije z bazo podatkov
  • Implementirajte ustrezno obravnavo napak - V produkciji vracajte genericna sporocila o napakah. Nikoli ne izpostavljajte sledi sklada, napak baze podatkov ali notranjih podrobnosti sistema
  • Onemogocite predloge polj - Izklopite funkcijo "Ali ste mislili..." v produkciji za preprecevanje presejanja sheme brez introspekcije
Vid Grosek

Vid Grosek

Etični heker & Penetracijski tester

Pomagam slovenskim podjetjem odkriti varnostne ranljivosti, preden jih odkrijejo napadalci. Vec kot 5 let izkusenj s penetracijskim testiranjem.

Vse objave

Komentarji

Ni se komentarjev. Bodite prvi!

Dodaj komentar

Vam je bil clanek vsec?

Prijavite se na newsletter za mesecne varnostne vpoglede.

Prijavite se