
CVE-2026-65320 का दस्तावेज़ीकरण करता है, जो fastcore के untar_dir() में एक tar-slip पथ ट्रैवर्सल है, जिसमें मनमानी फ़ाइल लेखन और कोड निष्पादन को प्रदर्शित करने वाला एक हानिरहित proof-of-concept शामिल है।
untar_dir() के माध्यम से fastcore में पाथ ट्रैवर्सल (Tar Slip)गंभीरता: क्रिटिकल, CVSS 3.1 9.8
वेक्टर (v3.1): CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
प्रभावित: fastcore <= 2.2.30
ठीक किया गया: लेखन के समय तक ठीक नहीं किया गया
CWE: CWE-22 (किसी पथनाम का प्रतिबंधित निर्देशिका तक अनुचित सीमितीकरण, 'पाथ ट्रैवर्सल')
घटक: fastcore.xtras.untar_dir() → fastcore.xtras._unpack() → shutil.unpack_archive()
उच्च-जोखिम रनटाइम: Python < 3.14 (Python 3.14 सुरक्षित data tar फ़िल्टर को डिफ़ॉल्ट बनाता है)
रिपोर्ट किया गया: Rahul Karne द्वारा
CNA: VulnCheck
fastcore.xtras.untar_dir(fname, dest) एक प्रलेखित हेल्पर है जो किसी आर्काइव को "dest में" अनटार करता है।
आंतरिक रूप से, यह आर्काइव को मानक लाइब्रेरी के shutil.unpack_archive() को बिना किसी एक्सट्रैक्शन फ़िल्टर के, आर्काइव सदस्य पथों को सत्यापित किए बिना, और बिना किसी एक्सट्रैक्शन-पश्चात कंटेनमेंट जाँच के सौंप देता है।
परिणामस्वरूप, एक TAR आर्काइव जिसके सदस्यों में ../ ट्रैवर्सल अनुक्रम या निरपेक्ष पथ होते हैं, उस निर्देशिका के बाहर फ़ाइलें लिख सकता है जिसमें कॉलर ने fastcore से एक्सट्रैक्ट करने के लिए कहा था।
एक कॉलर जो उचित रूप से अपेक्षा करता है कि untar_dir(fname, dest) सब कुछ dest तक सीमित रखेगा, उसे इसके बजाय प्रक्रिया जहाँ भी लिख सकती है वहाँ मनमाना फ़ाइल लेखन मिलता है।
untar_dir() को कॉल करने वाली प्रक्रिया के अधिकार के अंतर्गत मनमाना फ़ाइल लेखन।
इस पर निर्भर करते हुए कि क्या अधिलेखित किया जाता है, इसके परिणामस्वरूप हो सकता है:
प्रूफ़ ऑफ़ कॉन्सेप्ट पूरी write → import → code-execution श्रृंखला को शुरू से अंत तक प्रदर्शित करता है, पूरी तरह से एक हानिरहित डेमो निर्देशिका के अंदर।
fastcore पूरे fast.ai पारिस्थितिकी तंत्र में एक मूलभूत निर्भरता है, जिसमें शामिल हैं:
fastainbdevghapiइसे प्रति माह करोड़ों डाउनलोड मिलते हैं।
untar_dir() सामान्य "एक आर्काइव डाउनलोड करें, फिर उसे अनपैक करें" वर्कफ़्लो के पीछे का एक्सट्रैक्शन प्रिमिटिव है, जो fastai के untar_data के समान सामान्य पैटर्न का अनुसरण करता है।
कोई भी कोड पथ जो untar_dir() को ऐसा आर्काइव देता है जिसकी सामग्री पूरी तरह से विश्वसनीय नहीं है, उजागर है।
कमज़ोर कोड fastcore/xtras.py में मौजूद है:
def _unpack(fname, out):
import shutil
shutil.unpack_archive(str(fname), str(out)) # <-- no filter, no validation
ls = out.ls()
return ls[0] if len(ls) == 1 else out
def untar_dir(fname, dest, rename=False, overwrite=False, uid=-1, gid=-1):
"untar `file` into `dest` ..."
import tempfile, shutil
dest = Path(dest)
with tempfile.TemporaryDirectory() as d:
out = Path(d) / remove_suffix(Path(fname).stem, '.tar')
out.mkdir()
...
src = _unpack(fname, out) # extraction escapes `out` here
...
shutil.move(str(src), dest)
...
return dest
untar_dir() एक आंतरिक अस्थायी एक्सट्रैक्शन निर्देशिका बनाता है:
<tempdir>/<random>/<archive-stem>/
फिर यह _unpack() को कॉल करता है, जो आर्काइव को सीधे आगे भेजता है:
shutil.unpack_archive()
TAR आर्काइव के लिए, यह अंततः tarfile.extractall() को कॉल करता है।
Python < 3.14 पर, डिफ़ॉल्ट एक्सट्रैक्शन व्यवहार fully_trusted है, जिसका अर्थ है कि ट्रैवर्सल सदस्यों को मान्य किया जा सकता है।
उदाहरण के लिए, ऐसा आर्काइव सदस्य:
../../../some/other/dir/file
एक्सट्रैक्शन निर्देशिका के सापेक्ष लिखा जाता है और इसलिए उससे बाहर निकल सकता है।
fastcore में कुछ भी नहीं है जो:
filter="data" पास करता हो।.. पथ घटकों को अस्वीकार करता हो।untar_dir() shutil.unpack_archive() को ऐसे मानता है जैसे वह एक सुरक्षित, सैंडबॉक्स्ड आर्काइव एक्सट्रैक्टर हो।
यह नहीं है।
Python की मानक लाइब्रेरी प्रलेखन चेतावनी देता है कि अविश्वसनीय आर्काइव को एक्सट्रैक्ट करने से अनुरोधित गंतव्य के बाहर फ़ाइलें बन सकती हैं और TAR आर्काइव के लिए सुरक्षित एक्सट्रैक्शन फ़िल्टरिंग की सिफ़ारिश करता है।
fastcore न तो उपयुक्त एक्सट्रैक्शन फ़िल्टर पास करता है और न ही उन Python संस्करणों के लिए समकक्ष कंटेनमेंट गार्ड लागू करता है जिनका यह समर्थन करता है।
यह untar_dir() के कॉलरों को इस सुरक्षा-संवेदनशील व्यवहार के बारे में चेतावनी भी नहीं देता है।
TAR सदस्यों में मनमाना पथ स्ट्रिंग्स हो सकते हैं।
प्रभावित Python संस्करणों पर, tarfile.extractall() डिफ़ॉल्ट रूप से .. ट्रैवर्सल अनुक्रमों को स्वचालित रूप से निष्प्रभावी नहीं करता है।
इसलिए fastcore की अस्थायी एक्सट्रैक्शन निर्देशिका के सापेक्ष एक ट्रैवर्सल सदस्य लिखना उस निर्देशिका से बाहर निकलने और जहाँ भी प्रक्रिया को लिखने की अनुमति है वहाँ लिखने के लिए पर्याप्त है।
एक विश्वसनीय प्रिमिटिव सापेक्ष ट्रैवर्सल है जैसे:
../../../target/file
यह वह तकनीक है जिसका उपयोग प्रूफ़ ऑफ़ कॉन्सेप्ट में किया गया है।
खतरनाक इनपुट आर्काइव सामग्री है, न कि डेवलपर द्वारा चुना गया गंतव्य पथ।
आर्काइव अक्सर बाहरी या अर्ध-विश्वसनीय स्थानों से प्राप्त किए जाते हैं, जिनमें शामिल हैं:
इसलिए कोई भी सेवा या टूल जो किसी अविश्वसनीय या अर्ध-विश्वसनीय स्रोत से आर्काइव डाउनलोड करता है और बाद में untar_dir() का उपयोग करके उसे संसाधित करता है, पहुँच योग्य हो सकता है।
PoC में एक वेरिएंट भी शामिल है जो इस डिलीवरी पथ को प्रदर्शित करने के लिए हमलावर-नियंत्रित HTTP एंडपॉइंट से तैयार किए गए आर्काइव को सर्व करता है।
सफल शोषण के लिए आवश्यक है:
एप्लिकेशन ऐसे आर्काइव पर fastcore.xtras.untar_dir() को कॉल करता है जिसकी सामग्री हमलावर-प्रभावित है, जैसे कि अपलोड किया गया, डाउनलोड किया गया, या अन्यथा अविश्वसनीय आर्काइव।
रनटाइम Python < 3.14 का उपयोग करता है, या कोई अन्य कॉन्फ़िगरेशन जहाँ सुरक्षित TAR एक्सट्रैक्शन फ़िल्टर लागू नहीं किया जाता है।
मनमाना फ़ाइल लेखन से कोड निष्पादन तक बढ़ाने के लिए, प्रक्रिया बाद में ट्रैवर्सल द्वारा पहुँच योग्य स्थान से कोई फ़ाइल आयात या लोड करती है, जैसे:
मनमाना फ़ाइल लेखन और कॉन्फ़िगरेशन/डेटा संशोधन के लिए केवल शर्तें 1 और 2 आवश्यक हैं।
poc_fastcore_cna_demo.py वास्तविक fastcore.xtras.untar_dir() API को आमंत्रित करता है।
प्रदर्शन जानबूझकर हानिरहित है।
PoC द्वारा बनाई गई प्रत्येक फ़ाइल एक ही डेमो निर्देशिका के अंदर रहती है जिसे निर्दिष्ट किया गया है:
--demo-root
PoC वास्तविक सिस्टम फ़ाइलों को संशोधित नहीं करता है और क्लाउड सेवाओं या क्रेडेंशियल्स तक पहुँच नहीं करता है।
_unpack() और untar_dir() के लिए पर्यावरण विवरण और कमज़ोर स्रोत कोड प्रिंट करता है।
एक प्रदर्शन लेआउट बनाता है जिसमें शामिल हैं:
service_app/plugins/
बनाता है:
attacker_supplied_upload.tar
जिसमें इच्छित एक्सट्रैक्शन रूट के बाहर इंगित करने के लिए डिज़ाइन किए गए आर्काइव सदस्य शामिल हैं, जिनमें ट्रैवर्सल सदस्य और शामिल हैं:
service_app/plugins/startup_hook.py