Kompania Qualys identificoi tri dobësi në utilitarin needrestart, i destinuar për riaktivizimin e proceseve në prapavijë pas përditësimit të biblioteka që përdoren nga proceset e të dhënave. Duke filluar nga Ubuntu 21.04, utilitari needrestart është i përfshirë në ambientin bazë të Ubuntu Server, ku ekzekutohet me të drejta root në fund të çdo transaksioni të menaxherit të paketave APT, skanon proceset aktive dhe riaktivizon ato që lidhen me skedarët që kanë ndryshuar pas përditësimit të paketave. Dobësitë e identifikuara lejojnë një përdorues lokal pa privilegje të fitojë të drejta root në Ubuntu Server në konfiguracionin e tij të paracaktuar.
Dobësitë janë të pranishme në needrestart që nga versioni 0.8 (viti 2014) dhe janë rregulluar në versionin e needrestart 3.8. Problemet gjithashtu janë korrigjuar tashmë në shpërndarjet Debian dhe Ubuntu. Si një zgjidhje për të bllokuar shfrytëzimin e dobësive, mund të çaktivizoni skanimin e interpretimeve duke specifikuar në skedarin e konfigurimit /etc/needrestart/needrestart.conf parametrin "$nrconf{interpscan} = 0$”.
Dobësitë janë të pranishme në kodin me zbatimin e modit të përcaktimit të përditësimit të skenareve, të ekzekutuar duke përdorur interpretorë. Problemet e identifikuara:
- CVE-2024-48990 — një përdorues lokal mund të arrijë të ekzekutojë kod me të drejta root duke krijuar kushte për të ekzekutuar interpretorin Python me variablën mjedisore PYTHONPATH të vendosur nga sulmuesi. Përveç përdorimit të Python, sulmi gjithashtu mund të kryhet (CVE-2024-48992) përmes ekzekutimit të interpretorit Ruby me variablën mjedisore RUBYLIB.
Dobësitë janë shkaktuar nga fakti se gjatë riaktivizimit të skenarit të ndryshuar, utilitari needrestart vendos variablën mjedisore PYTHONPATH bazuar në përmbajtjen e skedarit /proc/pid/environ, të cilën e përdor gjithashtu për të ekzekutuar kodin e vet Python. Për rrjedhojë, sulmuesi mund të presë aktivitetet e lidhura me funksionimin e menaxherit të paketave APT, të simulojë ndryshimin e skenarit të tij dhe të vendosë për të variablën mjedisore PYTHONPATH, e cila gjithashtu do të aplikohet gjatë ekzekutimit të kodit Python të integruar në needrestart ("import sys\n print(sys.path)") që ekzekutohet me të drejta root.
Për shembull, për të shfrytëzuar një dobësi, mund të startoni një proces Python që qëndron gjithnjë në memorje, duke i caktuar atij variablën e ambientit "PYTHONPATH=/home/test", dhe të vendosni një bibliotekë të ndarë "/home/test/importlib/__init__.so", e cila do të ekzekutohet gjatë ekzekutimit të kodit privilegjuar Python në needrestart.
- CVE-2024-48991 — një përdorues lokal mund të arrijë ekzekutimin e kodit me të drejta root përmes nxitjes së një gjendjeje garuese (race condition), në rezultatin e të cilit needrestart do të startojë një interpretues Python fals, i vendosur nga sulmuesi, në vend të interpretuesit sistemor Python. Arsyetimi i dobësisë është i ngjashëm me problemin e përmendur më lart, me ndryshimin se needrestart identifikon emrin e procesit Python (për shembull, "/usr/bin/python3") përmes leximit të " /proc/pid/exe ".
Për shfrytëzimin e dobësisë, mund të krijoni një proces "/home/test/race", i cili nëpërmjet mekanizmit inotify do të presë momentin kur needrestart fillon të lexojë përmbajtjen e "/proc/pid/exe", dhe menjëherë do të startojë interpretuesin sistemor Python përmes funksionit execve. Duke qenë se needrestart nuk bën verifikimin nëse ky është me të vërtetë Python, ai do ta konsiderojë "/home/test/race" si interpretues Python dhe do ta startojë atë për kodin e tij.
- CVE-2024-11003 — një përdorues lokal mund të arrijë të ekzekutojë komandat e rastit shell me të drejta root përmes krijimit të kushteve për përpunimin nga needrestart të emrave të skedarëve në formatin "komanda|", ku kalimi i tyre në funksionin Perl open() do të rezultojë në ekzekutimin e komandës. Në fakt, dobësia manifeston veten në modulin Perl ScanDeps (CVE-2024-10224), por shkaktohet nga kalimi i parametrave të jashtëm në këtë modul pa një verifikim të duhur.
Sulmi mund të realizohet përmes ekzekutimit të një skripti Perl me simbolin "|" në emër, për shembull, "/home/test/perl|". Gjatë ekzekutimit të funksionit scan_deps() në needrestart, ky skedar do të hapet përmes funksionit open(), i cili do ta përpunojë simbolin "|" si një flag për të startuar programin "/home/test/perl" dhe për të përdorur daljen nga ky program.
Burimi: opennet.ru
