JWCrypto versijā 1.5.7 ir aizvērta kļūda, kas ļauj neautentificētam uzbrucējam izsmelt servera atmiņu ar vienu žetonu. 132 kilobaitu liels JWE žetons dekompresijā izplešas līdz aptuveni 100 megabaitiem, tātad ap 750 reižu vairāk. Kļūdai piešķirts numurs CVE-2026-39373 un CVSS 5,3 pēc v3.1 skalas.
JWCrypto ir Python bibliotēka, kas realizē JWK, JWS un JWE standartus virs python-cryptography. To uztur latchset. JWE žetonos drīkst iekļaut galveni "zip":"DEF", kas pirms šifrēšanas saspiež lietderīgo slodzi ar DEFLATE algoritmu. Saņēmējs žetonu atšifrē un pēc tam atspiež. Tieši šajā atspiešanas solī slēpjas problēma.
Kā uzbrukums darbojas
Saspiešanas bumba ir sena uzbrukuma klase. Neliels saspiests fails satur milzīgu daudzumu atkārtotu baitu, kas atspiešanā izplešas simtiem reižu. Ja programma atspiež datus, pirms pārbauda to izmēru, uzbrucējs ar dažiem kilobaitiem var piespiest to rezervēt megabaitus vai gigabaitus.
JWCrypto gadījumā uzbrucējs sagatavo derīgu JWE žetonu ar zip galveni un ieliek tajā stipri saspiestu slodzi. Žetons pa vadu ir mazs. Kad serviss to saņem un atspiež, atmiņā izpleš pilnu, simtiem reižu lielāku saturu. Vienu pieprasījumu serveris pārcieš, taču vairāki paralēli pieprasījumi resursos ierobežotā mašīnā atmiņu izsmeļ un process avarē.
Iepriekšējais labojums mērīja nepareizo skaitli
Šī ir jau otrā reize, kad JWCrypto aizver vienu un to pašu problēmu. 2024. gadā parādījās CVE-2024-28102, tā saucamais JWT bumbas uzbrukums. Tolaik labojums versijā 1.5.6 ieviesa 250 kilobaitu ierobežojumu ienākošā žetona izmēram. Pārbaude mērīja saspiestos baitus. Atspiesto apjomu tā nekontrolēja, tāpēc 132 kilobaitu žetons zem robežas joprojām varēja izplesties līdz 100 megabaitiem.
Pārbaude apstiprina saspiestos baitus, nevis atspiesto iznākumu. 132 kilobaitu žetons zem 250 kilobaitu robežas var atspiesties līdz aptuveni 100 megabaitiem bez vienas kļūdas.
Ko uzbrucējs iegūst
Uzbrukumam nav vajadzīga ne autentifikācija, ne lietotāja darbība. Pietiek nosūtīt sagatavotu JWE žetonu jebkuram galapunktam, kas tādus žetonus apstrādā ar ievainojamo JWCrypto versiju. Katrs žetons uz brīdi aizņem ap 100 megabaitiem atmiņas.
Ietekme ir tikai pieejamības zaudējums. CVSS vektors (AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L) rāda, ka dati nenoplūst un netiek mainīti. GitLab drošības apraksts precizē, ka atmiņas patēriņš nav bezgalīgs: 100 megabaitu atspiešana izdodas, bet 1 gigabaita mēģinājums pārsniedz žetona izmēra robežu un tālāk netiek. Tas nozīmē pakalpojuma atteikumu. Servera pārņemšana caur šo kļūdu nav iespējama.
Ko maina 1.5.7
Jaunā versija atspiež datus pa gabaliem un pārbauda izmēru jau atspiešanas gaitā. Agrāk kods vispirms izpleta visu buferī un tikai pēc tam mēra. Tiklīdz atspiestais apjoms pārsniedz atļauto, darbība tiek pārtraukta un atmiņa netiek iztērēta. Kļūdu ziņoja lietotājs ar segvārdu hkmj19. Labojums aprakstīts latchset publicētajā drošības aprakstā, kas atzīst, ka 1.5.6 labojums bija tikai daļējs.
Labojums jau ieceļo distributīvos. Red Hat izdeva atjauninājumu RHSA-2026:19042. Pakotņu uzturētāji citās sistēmās to pārņem. Ja tava lietojumprogramma atkarību sarakstā tur jwcrypto, pārbaudi versiju un cel to uz 1.5.7 vai jaunāku.
Kam tas attiecas
Risks skar tos servisus, kas atšifrē no ārpuses saņemtus JWE žetonus. Daudzas lietojumprogrammas JWCrypto lieto tikai parakstīšanai vai pārbaudei ar JWS, kur saspiešana nenotiek. Ja tavs serviss pieņem šifrētus JWE žetonus no klientiem vai partneriem, tas ietilpst apdraudēto lokā. JWCrypto bieži atrodas dziļi atkarību kokā zem autentifikācijas bibliotēkām, tāpēc to var nepamanīt pirmajā acu uzmetienā.
Ja atjaunināt uzreiz nevar, daļēju aizsardzību dod ienākošo pieprasījumu izmēra ierobežošana starpniekserverī un JWE žetonu ar zip galveni noraidīšana, ja lietojumam saspiešana nav vajadzīga. Tas gan neaizvieto atjauninājumu, jo 1.5.6 robeža parādīja, ka tikai ievadizmēra pārbaude neaptur uzbrukumu.
Vienkāršākā pārbaude ir palaist pip show jwcrypto un salīdzināt versiju. Viss līdz 1.5.6 ieskaitot ir ievainojams, sākot ar 1.5.7 kļūda ir aizvērta.
Avoti
- GitHub Advisory Database: CVE-2026-39373 (JWCrypto JWE ZIP dekompresijas bumba)
- latchset/jwcrypto: drošības apraksts par CVE-2024-28102 nepilno labojumu
- GitLab Advisory Database: jwcrypto CVE-2026-39373
- Red Hat: RHSA-2026:19042
- GitHub Advisory Database: CVE-2024-28102 (sākotnējais JWT bumbas caurums)
Komentāri
Šim rakstam vēl nav komentāru. Esi pirmais, kurš dalās ar savu viedokli.