Një vulnerabilitet kritik në PolKit, që lejon marrjen e aksesit root në shumicën e distribucioneve Linux

Kompania Qualys zbuloi një vulnerabilitet (CVE-2021-4034) në komponentin sistemor Polkit (i njohur ndryshe si PolicyKit), i përdorur në distribucionet për të organizuar kryerjen e veprimeve nga përdorues të pa privilegjuar që kërkojnë të drejta të rrituara aksesuale. Vulnerabiliteti lejon një përdorues lokal të pa privilegjuar të rrisë privilegjet e tij deri në përdoruesin root dhe të fitojë kontroll të plotë mbi sistemin. Problemi mori emrin kodor PwnKit dhe është i njohur për përgatitjen e një eksploiti funksional, që punon në konfigurim standard në shumicën e distribucioneve Linux.

Problemi është i pranishëm në utilitarin pkexec, që bën pjesë në PolKit dhe ofrohet me flamurin SUID root, i destinuar për të ekzekutuar komanda me privilegjet e një përdoruesi tjetër sipas rregullave të vendosura nga PolKit. Për shkak të trajtimit të papërshtatshëm të argumenteve të kaluara në pkexec, një përdorues i pa privilegjuar mund të anashkalojë autentikimin dhe të arrijë të ekzekutojë kodin e tij me të drejta root, pa marrë parasysh rregullat e vendosura për akses. Për sulmin nuk ka rëndësi cilat janë cilësimet dhe kufizimet në PolKit, mjafton që për skedarin ekzekutiv të utilitarit pkexec të jetë vendosur flamuri SUID root.

Pkexec nuk kontrollon saktësinë e numrit të argumenteve të komandës në rreshtin (argc), që kalohen gjatë nisjes së procesit. Dhe zhvilluesit e pkexec kishin parashikuar që shënimi i parë i masivës argv gjithmonë përmban emrin e procesit (pkexec), ndërsa i dyti ose është vlera NULL, ose emri i komandës që ekzekutohet përmes pkexec. Duke qenë se numri i argumenteve nuk kontrollohej për përputhshmëri me përmbajtjen e faktike të masivës dhe merrej parasysh që ai gjithmonë është më i madh se 1, në rastin e kalimit të një masive bosh argv në proces, e lejuar nga funksioni execve në Linux, pkexec e perceptonte vlerën NULL si argumentin e parë (emri i procesit), ndërsa pjesa tjetër e memorjes jashtë kufijve të masivës si përmbajtjen e mëtejshme të masivës.

Problemi është se pas masivit argv në kujtesë vendoset masivi envp, që përmban variablat e mjedisit. Kështu, nëse masivi argv është bosh, pkexec nxjerr të dhënat për komandën që ekzekutohet me privilegje të rritura nga elementi i parë i masivit të variablave të mjedisit (argv[1] bëhej i njëjtë me envp[0]), përmbajtja e të cilit mund të kontrollohet nga sulmuesi.

Pasi merr vlerën argv[1], pkexec përpiqet, duke marrë parasysh rrugët e skedarëve në PATH, të përcaktojë rrugën e plotë drejt skedarit ekzekutues dhe të shkruajë treguesin në vargun me rrugën e plotë prapa në argv[1], çka çon në mbivendosjen e vlerës së variablës së parë të mjedisit, pasi argv[1] është e njëjtë me envp[0]. Nëpërmjet manipulimit të emrit të variablës së parë të mjedisit, sulmuesi mund të zëvendësojë një variablë të tjera të mjedisit në pkexec, për shembull, të vendosë variablën e mjedisit "LD_PRELOAD", e cila nuk lejohet në programet suid, dhe të organizojë ngarkimin në proces të bibliotekës së tij të ndarë.

Në eksploitin aktiv, kryhet zëvendësimi i variablës GCONV_PATH, e cila përdoret për të përcaktuar rrugën për bibliotekën e kodit të karaktereve, e cila ngarkohet dinamikisht gjatë thirrjes së funksionit g_printerr(), në kodin e të cilit përdoret iconv_open(). Duke riemëruar rrugën në GCONV_PATH, sulmuesi mund të sigurojë ngarkimin e një biblioteke të paautorizuar iconv, ndërsa prapavijë të cilat do të ekzekutohen gjatë shfaqjes së mesazhit të gabimit në fazën kur pkexec ende ekzekutohet me të drejta root dhe para kontrollit të autorizimeve të ekzekutimit.

Vërehet se, pavarësisht se problemi shkaktohet nga dëmtimi i memories, ai mund të shfrytëzohet në mënyrë të besueshme dhe të përsëritshme pavarësisht arkitekturës harduerike të përdorur. Eksploiti i përgatitur është testuar me sukses në Ubuntu, Debian, Fedora dhe CentOS, por mund të përdoret edhe në distribucione të tjera. Eksploiti origjinal ende nuk është në dispozicion publikisht, që tregon se është trivially dhe mund të riprodhohet lehtësisht nga kërkues të tjerë, prandaj në sistemet me shumë përdorues është e rëndësishme që sa më shpejt të instalohet një azhurnim me korrigjim. Polkit gjithashtu është në dispozicion për sistemet BSD dhe Solaris, por studimi i mundësisë së shfrytëzimit për to nuk është kryer. E vetmja gjë që dihet është se sulmi nuk mund të realizohet në OpenBSD, pasi bërthama OpenBSD nuk lejon kalimin e vlerës zero argc kur thirret execve().

Problemi është i pranishëm që nga maji i vitit 2009, nga koha e shtimit të komandës pkexec. Korrigjimi i dobësisë në PolKit aktualisht është në formën e një patch-i (nuk është formuar një lëshim korrektues), por pasi që zhvilluesit e distribucioneve ishin informuar paraprakisht për problemin, shumica e distribucioneve publikuan një azhurnim njëkohësisht me zbërthimin e informacionit mbi dobësinë. Problemi është zgjidhur në RHEL 6/7/8, Debian, Ubuntu, openSUSE, SUSE, Fedora, ALT Linux, ROSA, Gentoo, Void Linux, Arch Linux dhe Manjaro. Si një masë e përkohshme për bllokimin e dobësisë, mund të hiqni flagun SUID root nga programi /usr/bin/pkexec ("chmod 0755 /usr/bin/pkexec").



Burimi: opennet.ru
Blini hostim të besueshëm për faqe interneti me mbrojtje DDoS, serverë VPS VDS 🔥 Blini hostim të besueshëm për faqe interneti me mbrojtje DDoS, serverë VPS VDS - ProHoster