Compania Qualys a descoperit trei vulnerabilități în utilitarul needrestart, destinat repornirii proceselor de fundal după actualizarea bibliotecilor utilizate de procese. Începând cu Ubuntu 21.04, utilitarul needrestart este inclus în mediul de bază al Ubuntu Server, unde rulează cu drepturi de root la sfârșitul fiecărei tranzacții a managerului de pachete APT, scanează procesele active și repornește acele procese care sunt legate de fișierele modificate după actualizarea pachetelor. Vulnerabilitățile identificate permit unui utilizator local fără privilegii să obțină drepturi de root în Ubuntu Server în configurația implicită.
Vulnerabilitățile sunt prezente în needrestart începând cu versiunea 0.8 (anul 2014) și au fost remediate în versiunea needrestart 3.8. Problemele au fost deja corectate și în distribuțiile Debian și Ubuntu. Ca o soluție temporară pentru blocarea exploatării vulnerabilității, se poate dezactiva scanarea interpretatorilor, specificând în fișierul de configurare /etc/needrestart/needrestart.conf parametru „$nrconf{interpscan} = 0”.
Vulnerabilitățile sunt prezente în codul cu implementarea modului de determinare a actualizării scripturilor, care sunt lansate utilizând interpretatori. Problemele identificate sunt:
- CVE-2024-48990 — un utilizator local poate provoca execuția codului cu drepturi de root prin crearea condițiilor pentru lansarea interpretatorului Python cu variabila de mediu PYTHONPATH stabilită de atacator. Pe lângă utilizarea Python, atacul poate fi realizat (CVE-2024-48992) și prin lansarea interpretatorului Ruby cu variabila de mediu RUBYLIB.
Vulnerabilitățile sunt cauzate de faptul că, în timpul repornirii scriptului modificat, utilitarul needrestart stabilește variabila de mediu PYTHONPATH pe baza conținutului fișierului /proc/pid/environ, pe care o folosește și pentru a lansa propriul cod Python. Prin urmare, atacatorul poate aștepta activitatea legată de funcționarea managerului de pachete APT, poate simula modificarea scriptului său și poate stabili pentru el variabila de mediu PYTHONPATH, care va fi aplicată și la lansarea codului Python încorporat în needrestart („import sys\n print(sys.path)”), executat cu drepturi de root.
De exemplu, pentru a explora o vulnerabilitate, se poate lansa un proces Python care rămâne constant în memorie, setând pentru el variabila de mediu „PYTHONPATH=/home/test” și plasând o bibliotecă partajată „/home/test/importlib/__init__.so”, care va fi executată atunci când codul Python cu privilegii este rulat în needrestart.
- CVE-2024-48991 — un utilizator local poate obține executarea codului cu privilegii de root prin inițierea unei condiții de competiție (race condition), ca rezultat needrestart va lansa un interpret Python fals, înlocuit de atacator, în locul interpretului sistemic Python. Esența vulnerabilității este similară cu problema menționată anterior, diferența fiind că needrestart definește numele procesului Python (de exemplu, /usr/bin/python3) prin citirea „/proc/pid/exe”.
Pentru a exploata vulnerabilitatea, se poate crea un proces /home/test/race, care prin intermediul mecanismului inotify va aștepta momentul în care needrestart va începe să citească conținutul /proc/pid/exe și imediat va lansa interpretul sistemic Python prin funcția execve. Deoarece needrestart nu verifică dacă acesta este într-adevăr Python, el va considera că /home/test/race este interpretul Python și îl va lansa pentru codul său.
- CVE-2024-11003 — un utilizator local poate obține executarea de comenzi shell arbitrare cu privilegii de root prin crearea unor condiții pentru prelucrarea de către needrestart a numelui fișierelor în format „comandă|”, a căror transmitere către funcția Perl open() va duce la executarea comenzii. De fapt, vulnerabilitatea se manifestă în modulul Perl ScanDeps (CVE-2024-10224), dar este cauzată de transmiterea către acest modul a parametrilor externi fără o verificare adecvată.
Atacul poate fi realizat prin lansarea unui script Perl cu simbolul „|” în nume, de exemplu, „/home/test/perl|”. În timpul execuției funcției scan_deps() în needrestart, acest fișier va fi deschis prin funcția open(), care va trata simbolul „|” ca un flag pentru a lansa programul „/home/test/perl” și a utiliza fluxul de ieșire obținut de la acest program.
Sursa: opennet.ro
