Kai „GraphQL“ naudoja „kai pakrauta ()`, tai paprastai yra būdas sąlygiškai įkelti susijusius duomenis ar asociacijas (pvz., ORM pagrįstuose „GraphQL“ rezoliajuose), gali atsirasti keletas įprastų saugumo spąstų. Šios spąstai daugiausia susiję su platesnėmis „GraphQL“ saugumo klausimais, tačiau yra ypač svarbios, nes „pakraunant ()„ dažnai apima papildomų įdėtų ar susijusių duomenų gavimą, didėjantį sudėtingumą ir riziką.
Bendrosios apsaugos spąstai su „apkrovos ()“ „Graphql“
** 1. Nenuoseklūs ar trūkstami leidimų patikrinimai
„Kai įkelta ()„ dažnai sukelia įdėtų ar susijusių duomenų pakrovimą po pradinio rezoliucijos. Jei autorizacijos logika nėra nuosekliai taikoma kiekviename sprendimo ar duomenų įkėlimo taške (įskaitant tuos, kuriuos suaktyvina „kai pakrauta ()`), neteisėti vartotojai gali gauti prieigą prie neskelbtinų duomenų. Tai yra dažnas klausimas, kai kai kurie keliai į tuos pačius duomenis yra apsaugoti, tačiau kiti (pavyzdžiui, per „Wherlowed ()`) nėra, leidžiančios užpuolikams apeiti prieigos valdiklius [4] [6]. Leidimas turi būti vykdomas tiek užklausos lygyje, tiek į visus įdėtus sprendimus ar duomenų krautuvus.
** 2. Per didelis ir sudėtingas užklausas, leidžiančias atsisakyti paslaugų (DOS)
Naudojant „apkrovos ()` “gali sukelti giliai įdėtas užklausas, kuriose pateikiama dideli susijusių duomenų kiekiai. Užpuolikai gali tai išnaudoti atlikdami užklausas, sukeliančias per didelį duomenų įkėlimą ir apdorojimą, todėl atsiranda išteklių išsekimas ir DOS. „Graphql“ galimybė gauti kelis susijusius objektus vienoje užklausoje daro sudėtinga numatyti išteklių naudojimą, o „pakraunant ()„ gali tai pagilinti, sąlygiškai įkeliant papildomus duomenis [4] [5]. Mokymosi apima užklausos gylio ribą, sudėtingumo taškus ir greičio ribojimo.
** 3. Neskelbtinų duomenų poveikis netinkamai pasirinkus lauką
Jei „įkeltas ()„ įkelia susijusius duomenis be kruopščiai kontroliuojant, kuriuos laukus veikia, neskelbtina informacija, tokia kaip slaptažodžiai, žetonai ar privati vartotojo informacija, gali būti netyčia grąžinta „GraphQL“ atsakyme [5]. Ši rizika padidėja, jei trūksta autorizacijos patikrinimų, arba jei klaidų pranešimai nutekina neskelbtiną informaciją. Kūrėjai privalo užtikrinti, kad jautrūs laukai niekada nebūtų veikiami, net kai įkeliami įdėti duomenys.
** 4. Injekcijų atakos, naudojant netinkamą įvesties patvirtinimą
Kai „pakraunant ()` naudojamas su dinaminiais argumentais ar filtrais, netinkamas įvesties patvirtinimas gali sukelti injekcijos pažeidžiamumą, pavyzdžiui, „GraphQL“ užklausos injekciją ar net SQL injekciją, jei pagrindiniai duomenų gavimas nėra tinkamai parametorizuojamas [6]. Užpuolikai gali suleisti kenkėjiškų užklausų ar komandų, kurios manipuliuoja duomenimis, gaudami logiką. Būtina tinkamas įvesties patvirtinimas ir parametrizuotų užklausų naudojimas.
** 5. Apeiti greičio ribojimo ir žiaurios jėgos apsaugos priemones
Kadangi „apkrovos ()“ „gali sukelti kelis įdėtus duomenų gavimą vienoje užklausoje, užpuolikai gali tai išnaudoti, kad apeitų tradicinį greičio ribojimą. Pvz., Jie gali nusiųsti vieną sudėtingą užklausą, kuri sukelia daugybę duomenų gavimo ar mutacijų, veiksmingai atlikdami brutalią jėgą ar išvardijimo atakas, nesukeldami užklausų ribų [4] [7]. Įkainių ribojimo strategijos turi atsižvelgti į užklausos sudėtingumą ir įdėtas operacijas.
** 6. Padidėjęs atakos paviršius dėl schemos introspekcijos ir įrankių
„Kai pakraunama ()` dažnai atspindi sudėtingą schemą su keliais įdėtais ryšiais. Užpuolikai gali naudoti „GraphQL Introspection“ ir tokius įrankius kaip „GraphiQL“, kad atrastų šiuos ryšius ir amatininkų užklausas, kurios išnaudoja „apkrovos ()“, kad būtų galima pasiekti nenumatytus duomenis [1] [8]. Išjungus introspektą gamyboje ar apribojant ją įgaliotiems vartotojams, galite sumažinti šią riziką.
Santrauka
Pagrindinės apsaugos spąstai, kai „GraphQL“ sukasi „Whloaded ()` „GraphQL“:
- Neįmanoma įgyvendinti nuoseklaus leidimo visais įdėtais duomenų įkėlimo keliais.
- leisti per daug sudėtingas ar gilias užklausas, sukeliančias DOS.
- Skenčių duomenų atskleidimas per įdėtus laukus.
- Nepakankamas įvesties patvirtinimas, sukeliantis įpurškimo atakas.
- Apskaičiuojant greičio ribas dėl sudėtingų įdėtų užklausų.
- Padidėjęs poveikis dėl schemos introspekcijos ir įrankių.
Mokymosi apima griežtus leidimo patikrinimus kiekviename rezoliucijoje, užklausos sudėtingumą ir gylio ribojimą, griežtą įvesties patvirtinimą, kruopštų schemos projektavimą, gamybos išjungimo išjungimą ir išsamią greičio ribojimą, pritaikytą „GraphQL“ užklausų struktūrai [3] [4] [5] [6] [8].
Citatos:
[1] https://portswigger.net/web-security/graphql
[2] https://www.imperva.com/blog/graphql-vulnerabilities-common-attacks/
]
[4] https://www.brightsec.com/blog/graphql-security/
[5] https://blog.convisoappsec.com/en/security-in-graphql/
[6] https://wundergraph.com/blog/the_complete_graphql_security_guide_fixing_13_fost_common_graphql_vulnerabilities_to_make_your_api_production_ready
[7] https://beaglesecurity.com/blog/article/graphql-attacks-vulnerabilities.html
[8] https://www.fastly.com/blog/exploring-the-security-implications-of-graphql