Kritične ranjivosti u GitLab-u omogućavaju udaljeno izvršavanje koda
Dve memorijske ranjivosti u JSON parseru Oj omogućavaju GitLab napadačima udaljeno izvršavanje koda - odmah ažurirajte.
Šta se desilo?
Istraživači su otkrili lanac od dve kritične ranjivosti u biblioteci Oj - JSON parseru napisanom na C-u koji koristi GitLab. Ove greške u upravljanju memorijom su skrivajoće pet godina pre nego što su iskorišćene za razvoj funkcionalnog exploita. Kombinovanjem dve memorijske ranjivosti sa pažljivom manipulacijom gomile, napadači mogu steći potpunu kontrolu nad pokazivačima callback funkcija i zaobići ASLR zaštitu, što omogućava izvršavanje proizvoljnog koda na podrazumevanim GitLab instalacijama.
Koga pogađa?
Uglavnom su ugroženi operateri self-managed GitLab instance-a na pogođenim verzijama. Posebno su osetljive deljene ili multi-tenant GitLab okoline gde običan član projekta sa dozvolom za push i pregled komitovanja može pokrenuti napad bez administratorskih privilegija ili interakcije žrtve. GitLab.com korisnici nisu ugroženi jer je servis već zakrpljen pri obelodanjivanju.
Kako se zaštititi?
- Odmah ažurirajte GitLab na verzije 18.10.8, 18.11.5 ili 19.0.2 i novije
- Ažurirajte gem Oj na verziju 3.17.3 ili noviju ako ga koristite u drugim Ruby aplikacijama
- Pregledajte listu članova projekta i ograničite pristup push operacijama samo na pouzdane korisnike
- Proverite pristupe i evidencije za bilo kakvu potencijalnu zloupotrebu pre nego što primenite zakrpu
- Provjerite sve Ruby zavisnosti u vašim aplikacijama na prisutnost C ekstenzija sa memorijskim rizicima
Tehnički detalji
Exploit lanac koristi dve specifične memorijske greške iz biblioteke Oj. Prvo, nekontrolisano pisanje u nesting stack u Oj::Parser.usual.parse omogućava napadaču da preusmeri interni pokazivač bafera. Drugo, nesigurno sužavanje dužine ključa od 16 bita omogućava curenje heap pokazivača. Individualno, svaka greška ima ograničene mogućnosti - jedna omogućava samo ponavljajuće pisanje jednog bajta, druga otkriva fiksni 29-bajtni memorijski deo. Međutim, kada se kombinuju sa pažljivom manipulacijom alokatora gomile, omogućavaju napadaču putu kontrolu nad callback pokazivačem i porazu ASLR zaštite.
Napad počinje sa izvršavanjem koda u kontekstu obrade Jupyter Notebook (.ipynb) datoteka. GitLab koristi interni gem ipynbdiff za prikaz čitljivih razlika, što zahteva parsiranje svake revizije notebook-a pomoću Oj parsera za validaciju JSON strukture. Autentifikovani korisnik koji može da gura komitove i pregeda razlike između verzija može ubaciti zlonamerne JSON strukture u ovaj poziv.
Konkretno, napadač gura dve posebno izrađene notebook datoteke u jednom zahtevkom za prikaz razlika. Prva datoteka sa pretporučenom dubinom ugneždavanja zloupotrebljava nekontrolisano pisanje u stack kako bi preusmeriola interni bafer pokazivač. Kasnije heap operacije uzrokuju da se memorija Ruby Array-a preklapa sa parser callback pokazivačem, omogućavajući napadaču da unese željenu adresu. Druga curenja heap pokazivača, prikrivena u preoversized JSON objektu ključ i prikazana u HTML izlazu diff-a, daje napadaču potrebnu adresu za izračunavanje lokacije osnovnih biblioteka poput libc i libruby, čime se porazi ASLR.
Puma - Ruby aplikacijski server koji koristi GitLab - pokreće više niti koje dele jedan nativni parser po worker-u. Obe izrađene datoteke se obrađuju od strane istog vulnerabilnog parsera unutar jednog zahtevka, omogućavajući drugoj datoteci da izazove korumpirani callback i izvrši shell komandu kroz system() funkciju.
Ranjivost je otkrijena kao deo Open Defense Initiative programa. Istraživač Yuhang Wu iz Depthfirst tima koristio je automatizirani sistem analize da skenirap biblioteku Oj i otkrio 18 prioritizovanih ranjivosti, od kojih su sedam bile memorijske greške. Dve od tih memorijskih grešaka su bile deo ovog exploita.
Preporuka Sajber Radara
Operateri self-managed GitLab instalacija trebaju odmah da ažuriraju na fiksne verzije. Preporuka je hitna jer obični članovi projekta mogu da pokrenu napad bez bilo kakvih posebnih privilegija. Paralelno sa ažuriranjem, preporučujemo da provjerite sve Ruby zavisnosti i C ekstenzije u vašim sistemima jer je memorijska nebezbednost u poverenim bibliotekama rizik koji može kompromitovati čitav Ruby stack.