Kompania Qualys identifikoi një vulnerabilitet (CVE-2021-4034) në komponentin sistemor Polkit (ndryshe PolicyKit), i cili përdoret në shpërndarjet për të organizuar kryerjen e veprimeve nga përdoruesit e pa privilegjuar që kërkojnë të drejta të larta. Vulnerabiliteti lejon një përdorues lokal të pa privilegjuar të rrisë privilegjet e tij në nivelin e përdoruesit root dhe të marrë kontroll të plotë mbi sistemin. Problemi mori emrin kodor PwnKit dhe është i njohur për përgatitjen e një eksploituesi funksional, i cili punon në konfigurimin e paracaktuar në shumicën e shpërndarjeve Linux.
Problemi ekziston në utilitarin pkexec që është pjesë e PolKit, i cili distribuohet me flamurin SUID root dhe është i destinuar për të ekzekutuar komanda me privilegje të një përdoruesi tjetër sipas rregullave të caktuara të PolKit. Për shkak të trajtimit të papërshtatshëm të argumenteve të komandës së kaluara në pkexec, një përdorues i pa privilegjuar mund të kalojë autentikimin dhe të arrijë të ekzekutojë kodin e tij me të drejtat root, pa marrë parasysh rregullat e aksesit të vendosura. Për sulmin nuk ka rëndësi cilat janë cilësimet dhe kufizimet e vendosura në PolKit, mjafton që skedari ekzekutiv me utilitarin pkexec të ketë emrin SUID root.
Pkexec nuk kontrollon saktësinë e numrit të argumenteve të komandës (argc) që kalohen gjatë nisjes së procesit. Zhvilluesit e pkexec e kishin parashikuar që shënimi i parë i masës argv gjithmonë të përmbajë emrin e procesit (pkexec), ndërsa i dyti të jetë ose një vlerë NULL, ose emri i komandës që ekzekutohet përmes pkexec. Duke qenë se numri i argumenteve nuk u kontrollua në përputhje me përmbajtjen reale të masës, dhe u supozua se ai gjithmonë është më i madh se 1, në rastin e kalimit të një mase të zbrazët argv, gjë që lejohet nga funksioni execve në Linux, pkexec e perceptonte vlerën NULL si argumentin e parë (emri i procesit), dhe memorien jashtë kufijve si përmbajtjen e mëtejshme të masës.
Problemi është se pas masës argv në memorial është vendosur një masë envp, që përmban variablat e ambientit. Pra, në rastin e një masë argv të zbrazët, pkexec nxjerr të dhënat e komandës që ekzekutohet me privilegje të larta nga elementi i parë i masës me variablat e ambientit (argv[1] bëhej identik me envp[0]), përmbajtja e së cilës mund të kontrollohet nga sulmuesi.
Duke marrë vlerën argv[1], pkexec përpiqet të identifikojë rrugën e plotë të skedarit ekzekutiv duke marrë parasysh rrugët e skedarëve në PATH dhe të shënojë treguesin në vargun e plotë të rrugës përsëri në argv[1], gjë që shkakton mbishkrimin e vlerës së variablës së parë të ambientit, pasi argv[1] është identik me envp[0]. Përmes manipulimit të emrit të variablës së parë të ambientit, sulmuesi mund të bëjë nënshtrimin e një variabli tjetër të ambientit në pkexec, për shembull, të nënshkruajë variablin e ambientit "LD_PRELOAD", i cili nuk lejohet në programet suid, dhe të organizojë ngarkimin në procesin e tij të bibliotekës së ndarë.
Në eksploituesin e punës, realizohet nënshtrimi i variablës GCONV_PATH, e cila përdoret për të përcaktuar rrugën për bibliotekën e shndërrimit të simboleve, e cila ngarkohet dinamikisht gjatë thirrjes së funksionit g_printerr(), në kodin e të cilit përdoret iconv_open(). Duke rishkruar rrugën në GCONV_PATH, sulmuesi mund të arrijë ngarkimin e një biblioteke iconv jo standarde, dhe procesorët e saj do të ekzekutohen gjatë shfaqjes së mesazheve mbi gabim në fazën kur pkexec akoma ekzekutohet me të drejta root dhe para kontrollit të autorizimeve të nisjes.
Shënohet se megjithëse problemi shkaktohet nga dëmtimi i memorjes, ai mund të eksploatohet në mënyrë të besueshme dhe të përsëritshme, pavarësisht nga arkitektura hardware që përdoret. Eksploituesi i përgatitur është testuar me sukses në Ubuntu, Debian, Fedora dhe CentOS, por gjithashtu mund të përdoret dhe në shpërndarje të tjera. Eksploituesi origjinal aktualisht nuk është në dispozicion publik, gjë që tregon se ai është trivial dhe mund të riprodhohet lehtësisht nga kërkues të tjerë, prandaj është shumë e rëndësishme që në sistemet multi-përdorues të instalohet sa më shpejt një përditësim që përmban rregullimin. Polkit është gjithashtu i disponueshëm për sistemet BSD dhe Solaris, por nuk është kryer ndonjë studim për mundësinë e eksploatimit në to. E vetmja gjë e njohur është se sulmi nuk mund të realizohet në OpenBSD, pasi bërthama e OpenBSD nuk lejon kalimin e një vlerë NULL argc gjatë thirrjes execve().
Problemi ka qenë i pranishëm që nga maji 2009, kur u shtua komandë pkexec. Një rregullim për dobësinë në PolKit është aktualisht në formën e një patch-i (nuk është formuar një lëshim korrigjues), megjithatë, pasi zhvilluesit e distribucioneve ishin informuar për problemin paraprakisht, shumica e distribucioneve publikuan një përditësim në të njëjtën kohë me zbulimin e dobësisë. 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ë përkohëse për të bllokuar dobësinë, mund të hiqet flamuri SUID root nga programi /usr/bin/pkexec ("chmod 0755 /usr/bin/pkexec").
Burimi: opennet.ru
