
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
def auto_extract_uploaded_archive(received_archive):
return untar_dir(
received_archive,
intended_root,
overwrite=True
)
सत्यापित करता है कि फ़ाइलें इच्छित एक्सट्रैक्शन निर्देशिका के बाहर लिखी गई थीं।
आर्काइव-लिखित को आयात करके सेवा पुनःलोड का अनुकरण करता है:
startup_hook.py
हानिरहित स्टार्टअप हुक बनाता है:
SERVICE_RELOAD_MARKER
यह पूरी श्रृंखला प्रदर्शित करता है:
Attacker-controlled archive
↓
Path traversal during extraction
↓
Arbitrary file write
↓
Write into importable / auto-loaded location
↓
Application loads attacker-controlled file
↓
Code execution
प्रभावित पैकेज इंस्टॉल करें:
pip install fastcore
समस्या की पुष्टि की गई है:
fastcore 2.2.30
प्रदर्शन निम्न में से किसी के विरुद्ध चलाया जा सकता है:
fastcore की pip-इंस्टॉल की गई प्रति--source का उपयोग करके चयनित स्थानीय रूप से एक्सट्रैक्ट किया गया स्रोत ट्रीसभी PoC लेखन --demo-root के माध्यम से निर्दिष्ट निर्देशिका के अंदर ही रहते हैं।
किसी भी पिछले PoC आउटपुट को साफ़ करें:
python poc_fastcore_cna_demo.py --demo-root ./poc_fastcore --clean
प्रदर्शन चलाएँ:
python poc_fastcore_cna_demo.py \
--demo-root ./poc_fastcore \
--source latest \
--no-pause
संक्षिप्त उदाहरण आउटपुट:
fastcore version: 2.2.30
Outside marker exists after extraction? True
Is outside marker inside intended extraction root? False
Relative traversal marker exists after extraction? True
Is relative traversal marker inside intended extraction root? False
Service plugin file exists after extraction? True
Service reload marker exists? True
POC WORKED: fastcore extracted attacker-controlled tar members outside the intended root.
समर्थित Python संस्करणों पर, एक सुरक्षित एक्सट्रैक्शन फ़िल्टर का उपयोग करें जैसे:
filter="data"
shutil.unpack_archive() या संबंधित tarfile एक्सट्रैक्शन ऑपरेशन के साथ।
एक्सट्रैक्शन से पहले प्रत्येक आर्काइव सदस्य की जाँच की जानी चाहिए।
अस्वीकार करें:
.. वाले पथएक्सट्रैक्शन से पहले लिंक लक्ष्यों को भी हल और सत्यापित किया जाना चाहिए।
लिखने से पहले प्रत्येक गंतव्य पथ को हल करें और सत्यापित करें कि यह इच्छित एक्सट्रैक्शन रूट के नीचे ही रहता है।
संकल्पनात्मक रूप से:
resolved_member_path
↓
must remain inside
↓
resolved_extraction_root
यदि हल किया गया गंतव्य एक्सट्रैक्शन रूट से बाहर निकलता है तो एक्सट्रैक्शन विफल होना चाहिए।
रिग्रेशन टेस्ट में कम से कम शामिल होना चाहिए:
../ traversal
absolute paths
Windows drive-letter paths
UNC paths
symbolic links
hard links
स्पष्ट रूप से दस्तावेज़ित करें कि क्या untar_dir() अविश्वसनीय आर्काइव को सुरक्षित रूप से संसाधित करने के लिए है।
यदि असुरक्षित एक्सट्रैक्शन जानबूझकर समर्थित है, तो भी सुरक्षित व्यवहार डिफ़ॉल्ट होना चाहिए।
असुरक्षित व्यवहार के लिए स्पष्ट ऑप्ट-इन की आवश्यकता होनी चाहिए, न कि आर्काइव सामग्री पर चुपचाप भरोसा करना।
जब तक पैकेज-स्तरीय फ़िक्स जारी नहीं होता:
untar_dir() को न दें।अंतर्निहित तकनीकी दोष आर्काइव पाथ ट्रैवर्सल के कारण होने वाली मनमाना फ़ाइल-लेखन भेद्यता है।
हालाँकि, अंतिम गंभीरता परिनियोजन वातावरण और untar_dir() कैसे उजागर किया जाता है, पर निर्भर करती है।
एक प्रतिनिधि वेक्टर निम्न के निकट पहुँच सकता है:
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
परिणाम:
9.8 — Critical
यदि शोषण के लिए इसके बजाय एक डेवलपर को मैन्युअल रूप से आर्काइव डाउनलोड और एक्सट्रैक्ट करने की आवश्यकता होती है, तो उपयोगकर्ता इंटरैक्शन और हमला जटिलता अधिक हो सकती है।
इसलिए परिणामी CVSS स्कोर काफ़ी कम होगा।
समस्या का मूल्यांकन करते समय दो महत्वपूर्ण कारकों पर विचार किया जाना चाहिए।
यह लंबे समय से ज्ञात असुरक्षित TAR एक्सट्रैक्शन भेद्यता वर्ग का एक उदाहरण है जो संबद्ध है:
CVE-2007-4559
आधुनिक Python रिलीज़ ने अधिक सुरक्षित आर्काइव एक्सट्रैक्शन व्यवहार पेश किया है।
Python 3.14 सुरक्षित data एक्सट्रैक्शन फ़िल्टर को डिफ़ॉल्ट बनाता है।
इसलिए, प्राथमिक प्रभावित वातावरण Python < 3.14 है।
हालाँकि, वे रनटाइम व्यापक रूप से परिनियोजित बने हुए हैं।
भेद्यता तब शोषणीय हो जाती है जब कोई कॉलर untar_dir() को ऐसा आर्काइव प्रदान करता है जिसकी सामग्री हमलावर-नियंत्रित या अन्यथा अविश्वसनीय है।
इसलिए यह रिपोर्ट आर्काइव की सामग्री को अविश्वसनीय सुरक्षा सीमा के रूप में मानती है।
एक मज़बूत आर्काइव एक्सट्रैक्शन हेल्पर को आर्काइव कैसे प्राप्त किया गया, इसकी परवाह किए बिना सुरक्षित रूप से विफल होना चाहिए।
नीचे दी गई प्लेसहोल्डर तिथियों को वास्तविक प्रकटीकरण तिथियों से बदलें।
YYYY-MM-DD — अनुरक्षकों को भेद्यता की रिपोर्ट की गई।YYYY-MM-DD — विक्रेता प्रतिक्रिया / पावती / कोई प्रतिक्रिया नहीं।2.2.30) में अभी भी अपुष्ट पुष्टि की गई; एक्सट्रैक्शन कोड अपरिवर्तित रहा।Rahul Karne द्वारा खोजा और रिपोर्ट किया गया।
fastcore untar_dir() दस्तावेज़
https://fastcore.fast.ai/xtras.html
fastcore xtras.py स्रोत
https://github.com/AnswerDotAI/fastcore/blob/main/fastcore/xtras.py
PyPI पर fastcore
https://pypi.org/project/fastcore/
Python shutil.unpack_archive() दस्तावेज़
https://docs.python.org/3/library/shutil.html#shutil.unpack_archive
Python tarfile एक्सट्रैक्शन फ़िल्टर
https://docs.python.org/3/library/tarfile.html#extraction-filters
PEP 706 — tarfile.extractall के लिए फ़िल्टर
https://peps.python.org/pep-0706/
CWE-22 — किसी पथनाम का प्रतिबंधित निर्देशिका तक अनुचित सीमितीकरण
https://cwe.mitre.org/data/definitions/22.html
CVE-2007-4559 — असुरक्षित TAR एक्सट्रैक्शन भेद्यता वर्ग
https://nvd.nist.gov/vuln/detail/CVE-2007-4559
यह रिपॉज़िटरी एक समन्वित-प्रकटीकरण सुरक्षा निष्कर्ष का दस्तावेज़ीकरण करती है और एक हानिरहित, स्व-निहित प्रूफ़ ऑफ़ कॉन्सेप्ट प्रदान करती है।
PoC केवल उपयोगकर्ता द्वारा निर्दिष्ट --demo-root निर्देशिका के अंदर लिखता है और कोई विनाशकारी कार्रवाई नहीं करता है।
प्रदर्शन में शामिल कोई भी नेटवर्क कार्यक्षमता एक वैकल्पिक स्थानीय प्रदर्शन तक सीमित है।
यह सामग्री रक्षात्मक सुरक्षा अनुसंधान और शैक्षिक उद्देश्यों के लिए प्रदान की गई है।
मीडिया पूछताछ: [email protected]। पूर्ण PoC (हमलावर सर्वर, ट्रैवर्सल आर्काइव, शिकार एप्लिकेशन) और अतिरिक्त तकनीकी विवरण अनुरोध पर उपलब्ध।