Уязвимости в утилитата 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 чрез иницииране на състояние на състезание (race condition), в резултат на което 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