Dobësi kritike në PolKit që lejon aksesin rrënjë në shumicën e shpërndarjeve Linux

Qualys ka identifikuar një dobësi (CVE-2021-4034) në komponentin e sistemit Polkit (ish PolicyKit) i përdorur në shpërndarje për të lejuar përdoruesit e paprivilegjuar të kryejnë veprime që kërkojnë të drejta të larta aksesi. Dobësia lejon një përdorues lokal të paprivilegjuar të përshkallëzojë privilegjet e tij për të rrënjosur dhe për të fituar kontrollin e plotë të sistemit. Problemi u kodua me emrin PwnKit dhe është i dukshëm për prodhimin e një shfrytëzimi pune që funksionon në konfigurimin e paracaktuar në shumicën e shpërndarjeve Linux.

Problemi është i pranishëm në programin pkexec të PolKit, i cili vjen me flamurin rrënjë SUID dhe është krijuar për të ekzekutuar komanda me privilegjet e një përdoruesi tjetër sipas rregullave të specifikuara të PolKit. Për shkak të trajtimit të gabuar të argumenteve të linjës së komandës të kaluar në pkexec, një përdorues i paprivilegjuar mund të anashkalojë vërtetimin dhe të ekzekutojë kodin e tij si rrënjë, pavarësisht nga rregullat e hyrjes të vendosura. Për një sulm, nuk ka rëndësi se cilat cilësime dhe kufizime janë specifikuar në PolKit, mjafton që atributi rrënjë SUID të vendoset për skedarin e ekzekutueshëm me mjetin pkexec.

Pkexec nuk kontrollon vlefshmërinë e numërimit të argumenteve të linjës së komandës (argc) të kaluar kur fillon një proces. Zhvilluesit e pkeexec supozuan se hyrja e parë në grupin argv përmban gjithmonë emrin e procesit (pkexec), dhe e dyta ose një vlerë NULL ose emrin e komandës së nisur përmes pkexec. Meqenëse numërimi i argumenteve nuk u kontrollua kundrejt përmbajtjes aktuale të grupit dhe supozohej të ishte gjithmonë më i madh se 1, nëse një procesi i kalonte një grup bosh argv, siç lejon funksioni execve Linux, pkexec do të trajtonte NULL si argumentin e parë ( emri i procesit) dhe tjetri si jashtë memories buffer, si përmbajtja pasuese e grupit. |———+———+——+————|———+———+——+————| | argv[0] | argv[1] | ... | argv[argc] | envp[0] | envp[1] | ... | envp[envc] | |—-|—-+—-|—-+——+——|——|—-|—-+—-|—-+——+——|——| VVVVVV "program" "-opsion" NULL "vlera" "PATH=emri" NULL

Problemi është se pas grupit argv ka një grup envp në memorie që përmban variabla të mjedisit. Kështu, nëse grupi argv është bosh, pkexec nxjerr të dhëna për komandën e ekzekutuar me privilegje të ngritura nga elementi i parë i grupit me variabla të mjedisit (argv[1] u bë identik me envp[0]), përmbajtja e së cilës mund të kontrollohet nga sulmuesi.

Pasi ka marrë vlerën e argv[1], pkexec përpiqet, duke marrë parasysh shtigjet e skedarit në PATH, të përcaktojë shtegun e plotë drejt skedarit të ekzekutueshëm dhe shkruan një tregues në vargun me rrugën e plotë të kthimit në argv[1], i cili çon në mbishkrimin e vlerës së ndryshores së parë të mjedisit, pasi argv[1] është identik me envp[0]. Duke manipuluar emrin e ndryshores së parë të mjedisit, një sulmues mund të zëvendësojë një variabël tjetër mjedisi në pkexec, për shembull, të zëvendësojë variablin mjedisor "LD_PRELOAD", i cili nuk lejohet në programet suid dhe të rregullojë që biblioteka e tyre e përbashkët të ngarkohet në procesi.

Shfrytëzimi i punës përfshin zëvendësimin e ndryshores GCONV_PATH, e cila përdoret për të përcaktuar rrugën drejt bibliotekës së transkodimit të simboleve, e ngarkuar në mënyrë dinamike kur thirret funksioni g_printerr(), kodi i të cilit përdor iconv_open(). Duke ripërcaktuar shtegun në GCONV_PATH, një sulmues mund të sigurojë që nuk është ngarkuar biblioteka standarde e iconv-ve, por biblioteka e tij, trajtuesit nga i cili do të ekzekutohen kur shfaqet një mesazh gabimi në fazën kur pkexec është ende duke ekzekutuar me të drejtat rrënjësore dhe para se të kontrollohen lejet e nisjes.

Vihet re se përkundër faktit se problemi është shkaktuar nga dëmtimi i kujtesës, ai mund të shfrytëzohet në mënyrë të besueshme dhe të përsëritur pavarësisht nga arkitektura e harduerit të përdorur. Shfrytëzimi i përgatitur është testuar me sukses në Ubuntu, Debian, Fedora dhe CentOS, por mund të përdoret edhe në shpërndarje të tjera. Shfrytëzimi origjinal nuk është ende i disponueshëm publikisht, gjë që tregon se është i parëndësishëm dhe mund të rikrijohet lehtësisht nga studiues të tjerë, ndaj është e rëndësishme të instaloni përditësimin e patch-it sa më shpejt të jetë e mundur në sistemet me shumë përdorues. Polkit është gjithashtu i disponueshëm për sistemet BSD dhe Solaris, por nuk është studiuar për përdorim në to. Ajo që dihet është se sulmi nuk mund të kryhet në OpenBSD, pasi kerneli OpenBSD nuk lejon që të kalohet një vlerë null argc kur thirret execve().

Problemi është prezent që nga maji 2009, që nga shtimi i komandës pkexec. Rregullimi për cenueshmërinë PolKit është aktualisht i disponueshëm si një korrigjues (nuk është lëshuar asnjë version), por meqenëse zhvilluesit e shpërndarjes u njoftuan për problemin paraprakisht, shumica e shpërndarjeve publikuan përditësimin njëkohësisht me zbulimin e informacionit në lidhje me cenueshmërinë. Problemi është rregulluar në RHEL 6/7/8, Debian, Ubuntu, openSUSE, SUSE, Fedora, ALT Linux, ROSA, Gentoo, Void Linux, Arch Linux dhe Manjaro. Si masë e përkohshme për të bllokuar cenueshmërinë, mund të hiqni flamurin rrënjë SUID nga programi /usr/bin/pkexec ("chmod 0755 /usr/bin/pkexec").



Burimi: opennet.ru

Shto një koment