FixVibe
Covered by FixVibehigh

JWT Sauga: neužtikrintų žetonų rizika ir trūkstamas paraiškos patvirtinimas

JSON žiniatinklio prieigos raktai (JWT) yra reikalavimų perdavimo standartas, tačiau saugumas priklauso nuo griežto patvirtinimo. Nepatvirtinus parašų, galiojimo laiko ar numatytų auditorijų, užpuolikai gali apeiti autentifikavimą arba pakartoti žetonus.

CWE-347CWE-287CWE-613

Užpuoliko poveikis

Netinkamas JWT patvirtinimas leidžia užpuolikams apeiti autentifikavimo mechanizmus suklastojus pretenzijas arba pakartotinai naudojant pasibaigusio galiojimo prieigos raktus [S1]. Jei serveris priima prieigos raktus be galiojančio parašo, užpuolikas gali modifikuoti naudingą apkrovą, kad padidintų privilegijas arba apsimesti bet kuriuo vartotoju [S1]. Be to, nepavykus įvykdyti reikalavimo dėl galiojimo pabaigos (exp), užpuolikas gali neribotą laiką naudoti pažeistą prieigos raktą [S1].

Pagrindinė priežastis

JSON žiniatinklio prieigos raktas (JWT) yra JSON pagrindu sukurta struktūra, naudojama skaitmeniniu parašu arba vientisumu apsaugotoms pretenzijoms pateikti [S1]. Saugos gedimai paprastai kyla dėl dviejų pagrindinių diegimo spragų:

  • Neapsaugotų JWT priėmimas: jei paslauga griežtai netaiko parašo tikrinimo, ji gali apdoroti „neapsaugotus JWT“, kai parašo nėra, o algoritmas nustatytas į „nėra“ [S1]. Pagal šį scenarijų serveris pasitiki naudingos apkrovos pretenzijomis, nepatikrindamas jų vientisumo [S1].
  • Trūksta pretenzijos patvirtinimo: paraiškoje exp (galiojimo laikas) nurodomas laikas, kuriam pasibaigus, JWT negali būti priimtas apdoroti [S1]. aud (auditorijos) paraiškoje nurodomi numatomi prieigos rakto [S1] gavėjai. Jei jie nepažymėti, serveris gali priimti žetonus, kurių galiojimo laikas pasibaigęs arba kurie buvo skirti kitai programai [S1].

Betoniniai pataisymai

  • Įgyvendinti kriptografinius parašus: sukonfigūruokite programą, kad ji atmestų bet kokį JWT, kuris nenaudoja iš anksto patvirtinto tvirto pasirašymo algoritmo (pvz., RS256).
  • Patvirtinti galiojimo pabaigą: atlikite privalomą patikrinimą, kad įsitikintumėte, jog dabartinė data ir laikas yra ankstesni nei exp paraiškoje [S1] nurodytas laikas.
  • Patikrinti auditoriją: įsitikinkite, kad paraiškoje aud yra reikšmė, identifikuojanti vietinę paslaugą; jei paslauga nenurodyta pretenzijoje aud, žetonas turi būti atmestas [S1].
  • Užkirsti kelią atkūrimui: naudokite paraišką jti (JWT ID), kad kiekvienam prieigos raktui priskirtumėte unikalų identifikatorių, leidžiantį serveriui sekti ir atmesti pakartotinai naudojamus prieigos raktus [S1].

Aptikimo strategija

JWT tvarkymo spragas galima nustatyti išanalizavus prieigos rakto struktūrą ir serverio atsako elgesį:

  • Antraštės patikrinimas: tikrinama alg (algoritmo) antraštė, kad įsitikintumėte, jog ji nenustatyta į „nėra“ ir naudoja numatytus kriptografinius standartus [S1].
  • Paraiškos patvirtinimas: patvirtinama, kad exp (galiojimo laikas) ir aud (auditorijos) paraiškos yra JSON naudingojoje apkrovoje [S1].
  • Patvirtinimo testavimas: tikrinama, ar serveris teisingai atmeta prieigos raktus, kurių galiojimo laikas pasibaigęs pagal paraišką exp arba yra skirtas kitai auditorijai, kaip apibrėžta aud paraiškoje [S1].