flawopen.com/पथ ट्रैवर्सल/Zip Slip
Zip Slip भेद्यता क्या है?
ZIP फ़ाइल में ../../outside.txt जैसे नाम हो सकते हैं। यदि एक्सट्रैक्टर उन पर भरोसा करे, तो प्रक्रिया की अनुमतियों की सीमा तक लक्ष्य फ़ोल्डर के बाहर फ़ाइल लिखी जा सकती है।
इसे चूकना आसान क्यों है
आर्काइव खोलना सामान्य काम लगता है, लेकिन अविश्वसनीय ZIP या TAR के हर एंट्री नाम को बनाने वाला नियंत्रित करता है। पथ जाँचे बिना outputDir + entry.name जोड़ने से आर्काइव की सामग्री के ज़रिए डायरेक्टरी से बाहर पहुँचा जा सकता है।
for entry in zip_file:
dest = os.path.join(output_dir, entry.name)
write_file(dest, entry.read())
# entry.name "../../outside.txt" हो सकता है
root = os.path.realpath(output_dir)
os.makedirs(root, exist_ok=True)
for entry in zip_file:
dest = os.path.realpath(
os.path.join(root, entry.name)
)
try:
inside_root = os.path.commonpath([root, dest]) == root
except ValueError:
inside_root = False
if not inside_root:
raise ValueError("Unsafe entry path")
write_file(dest, entry.read())
यह जाँच समान टेक्स्ट प्रीफ़िक्स वाले पास-पड़ोस के पथों सहित डायरेक्टरी से बाहर जाने से रोकती है। नई निजी डायरेक्टरी में एक्सट्रैक्ट करें, symlink एंट्री अस्वीकार करें, और पहले से मौजूद symlink या साथ-साथ होने वाले फ़ाइल-सिस्टम बदलावों का ध्यान रखें; इनके लिए race-safe API या अनुरक्षित extraction library चाहिए।
अक्सर पूछे जाने वाले प्रश्न
Python archive APIs में path सुरक्षा अलग-अलग होती है
ऊपर का code pair custom extraction loop का अवधारणात्मक उदाहरण है; यह Python का built-in ZipFile.extractall() नहीं है। Python docs के अनुसार ZipFile.extract() और extractall() absolute paths तथा .. से directory escape रोकने की कोशिश करते हैं, फिर भी untrusted archives की पहले जाँच करने की चेतावनी देते हैं। zipfile.Path member names को sanitize नहीं करता, इसलिए caller को उन्हें validate करना होगा। TAR extraction filters Python 3.12 में आए; Python 3.14 में default filter="data" हो गया। जिन supported runtimes का default कम restrictive हो सकता है, वहाँ यह filter स्पष्ट रूप से सेट करें। data filter भी हर unsafe behavior या resource exhaustion को नहीं रोकता। नए private temporary directory में extract करें और archive size, member count, कुल expanded bytes तथा processing time सीमित करें।
2018 में यह तरीका चर्चित होने के बाद कुछ संस्करणों ने सुरक्षा जोड़ी, लेकिन कई डिफ़ॉल्ट रूप से पथ नहीं जाँचते। अपने संस्करण का दस्तावेज़ देखें और हर एंट्री को स्पष्ट रूप से वैलिडेट करें।