Уязвимости в утилитата needrestart, позволяващи получаване на root-достъп в Ubuntu Server

Компания Qualys откри три уязвимости в утилите needrestart, предназначенной за рестартиране на фонови процеси след ъпдейт на използваните от тях библиотеки. От Ubuntu 21.04 утилитата needrestart е включена в основната среда на Ubuntu Server, където се стартира с права на root в края на всяка транзакция на пакетния мениджър APT, сканира работещите процеси и рестартира тези, които са свързани с файлове, променени след ъпдейта на пакетите. Откритите уязвимости позволяват на локален непривилегирован потребител да получи права на root в конфигурацията по подразбиране на Ubuntu Server.

Уязвимостите присъстват в needrestart от версия 0.8 (2014 година) и са отстранени в изданието needrestart 3.8. Проблемите са вече коригирани и в дистрибуциите Debian и Ubuntu. Като обходен вариант за блокиране на експлоатацията на уязвимостите може да се изключи сканирането на интерпретатори, указвайки в конфигурационния файл /etc/needrestart/needrestart.conf параметъра "$nrconf{interpscan} = 0$".

Уязвимостите присъстват в кода с реализиране на режима за определяне на ъпдейта на скриптовете, стартирани с използване на интерпретатори. Откритите проблеми са:

  • CVE-2024-48990 — локален потребител може да постигне изпълнение на код с права на root чрез създаване на условия за стартиране на Python интерпретатора с поставена атакуваща променлива на средата PYTHONPATH. Освен с използването на Python, атаката може също да се проведе (CVE-2024-48992) чрез стартиране на интерпретатор Ruby с променлива на средата RUBYLIB.

    Уязвимостите са причинени от факта, че в процеса на рестартиране на променения скрипт, утилитата needrestart поставя променлива на средата PYTHONPATH на базата на съдържанието на файла /proc/pid/environ, която след това използва и за стартиране на собствен Python код. Съответно, атакуващият може да изчака активност, свързана с работата на пакетния мениджър APT, да симулира изменение на своя скрипт и да зададе променлива на средата PYTHONPATH, която също ще бъде приложена при стартиране на вградения в needrestart Python код ("import sys\n print(sys.path)") с права на root.

    Например, за експлоатацията на уязвимостта може да се стартира постоянно работещ Python процес в паметта, като се зададе променлива на средата „PYTHONPATH=/home/test“ и се разположи споделена библиотека „/home/test/importlib/__init__.so“, която ще бъде изпълнена при изпълнение на привилегирования Python код в needrestart.

  • CVE-2024-48991 — локален потребител може да получи изпълнение на код с root права чрез иницииране на състояние на състезание, в резултат на което needrestart ще стартира фалшив интерпретатор Python, предоставен от атакуващия, вместо системния интерпретатор Python. Същността на уязвимостта е подобна на по-горе споменатия проблем, единствената разлика е, че needrestart определя името на Python процеса (например, /usr/bin/python3) чрез четене на „/proc/pid/exe“.

    За експлоатацията на уязвимостта може да се създаде процес /home/test/race, който с помощта на механизма inotify ще изчака момента, когато needrestart започне да чете съдържанието на /proc/pid/exe, и веднага ще стартира системния интерпретатор Python чрез функцията execve. Тъй като needrestart не проверява дали това е действителен Python, той ще сметне, че /home/test/race е интерпретатор Python и ще го стартира за своя код.

  • CVE-2024-11003 — локален потребител може да постигне изпълнение на произволни shell команди с root права, като създаде условия за обработка в needrestart на имена на файлове във формат „команда|“, чието предаване на Perl функцията open() ще доведе до изпълнение на командата. Всъщност, уязвимостта се проявява в Perl модула ScanDeps (CVE-2024-10224), но е причинена от предаването на външни параметри към този модул без подходяща проверка.

    Атаката може да бъде извършена чрез стартиране на Perl скрипт с символ „|“ в името, например, „/home/test/perl|“. В процеса на изпълнение на функцията scan_deps() в needrestart, този файл ще бъде отворен чрез функцията open(), която ще обработи символа „|“ като флаг за стартиране на програмата „/home/test/perl“ и ще използва получения от тази програма изходен поток.

Източник: opennet.ru

Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри 🔥 Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри | ProHoster