flawopen.com/Teardowns/cve-2026-102422-shell-quote-comment-line-terminator-injection
CVE-2026-102422: shell-quote में टिप्पणी टोकन इंजेक्शन
shell-quote 1.11.0 से पहले, टिप्पणी टोकन के बाद पंक्ति समाप्त करने वाला वर्ण रखने वाली स्ट्रिंग आने पर POSIX शेल को दिए गए उद्धृत आउटपुट का अर्थ बदल सकता था। इसके लिए हमलावर का टोकन पर प्रभाव, quote() का उपयोग और आउटपुट को शेल में चलाना आवश्यक है। 1.11.0 या उसके बाद के संस्करण में अपडेट करें।
किसी लेबल पर लिखी टिप्पणी उसी पंक्ति के बाकी हिस्से को छिपा सकती है। अगले भाग में पंक्ति-विराम हो तो टिप्पणी जल्दी समाप्त हो जाती है और उसके बाद का पाठ फिर दिखने लगता है। इस दोष में बाद का टोकन शेल के लिए उद्धृत आउटपुट में ऐसा कर सकता था।
इस पेज के मुख्य शब्द
shell-quote- शेल-जैसे टोकन को पार्स और उद्धृत करने वाला JavaScript पैकेज; इसका आउटपुट शेल सिंटैक्स के लिए है, सार्वभौमिक सुरक्षित स्ट्रिंग प्रारूप नहीं।
टिप्पणी टोकन- शेल टिप्पणी सिंटैक्स दर्शाने वाला टोकन, जिसका प्रभाव पंक्ति समाप्त करने वाले वर्ण तक आगे के पाठ पर रह सकता है।
पंक्ति समाप्त करने वाला वर्ण- CR, LF, U+2028 या U+2029 जैसी पंक्ति सीमा, जिसे शेल टिप्पणी का अंत मान सकता है।
CWE-78- ऑपरेटिंग सिस्टम कमांड में विशेष तत्वों को ठीक से निष्प्रभावी न करना।
फ्रेमवर्क मैपिंग
- इस गाइड में बताई गई कमजोरी के लिए CWE संदर्भ: CWE-78
मूल कारण विश्लेषण (Root Cause)
प्रभावित quote() मार्ग टिप्पणी टोकन के भीतर पंक्ति समाप्त करने वाले वर्ण को अस्वीकार करता था, लेकिन यह दर्ज नहीं करता था कि टिप्पणी पहले ही निकाली जा चुकी है। इसलिए बाद के स्ट्रिंग टोकन में ऐसा वर्ण हो सकता था। जब हमलावर-प्रभावित टोकन quote() तक पहुँचते हैं और लौटाया गया पाठ POSIX शेल में चलाया जाता है, पंक्ति सीमा टिप्पणी समाप्त कर देती है और शेल आगे के पाठ को सिंटैक्स के रूप में समझता है। अपस्ट्रीम सुधार टिप्पणी की स्थिति दर्ज करता है और उसके बाद की हर स्ट्रिंग में ऐसे वर्ण अस्वीकार करता है। यह CVE-2026-9277 से अलग है, जिसका सुधार टिप्पणी टोकन के भीतर ऐसे वर्ण रोकता था। अनुरक्षक इसे High, CVSS 3.1 8.1 मानते हैं; Ubuntu अलग से CVSS 4.0 9.2 Critical देता है। ये अलग CVSS संस्करण हैं, इसलिए स्कोर सीधे तुलनीय नहीं हैं।
हमले का चरण-दर-चरण प्रवाह
टोकन उद्धरण फ़ंक्शन तक पहुँचते हैं
ऐप टिप्पणी और बाद की स्ट्रिंग वाले टोकन बनाता है; हमलावर का उस क्रम पर प्रभाव होना आवश्यक है।
फ़ंक्शन टिप्पणी सिंटैक्स निकालता है
1.11.0 से पहले quote() टिप्पणी पाठ जाँचता था, लेकिन बाद की स्ट्रिंग याद नहीं रखता था।
बाद के टोकन में पंक्ति सीमा होती है
CR, LF, U+2028 या U+2029 शेल टिप्पणी समाप्त कर सकते हैं।
ऐप आउटपुट को शेल में चलाता है
दस्तावेज़ित व्याख्या उन कॉलर पर लागू है जो आउटपुट को POSIX शेल में भेजते हैं।
अपडेट असुरक्षित क्रम को अस्वीकार करता है
1.11.0 टिप्पणी स्थिति दर्ज करता है और बाद की स्ट्रिंग में पंक्ति समाप्त करने वाला वर्ण मिलने पर त्रुटि देता है।
सोर्स कोड: कमज़ोर बनाम सुरक्षित कार्यान्वयन
कमज़ोर कोड अंश टिप्पणी टोकन में पंक्ति समाप्त करने वाले वर्ण जाँचता है, लेकिन बाद की स्ट्रिंग की स्थिति दर्ज नहीं करता। अपस्ट्रीम बदलाव टिप्पणी निकलने की स्थिति दर्ज करता है और बाद की ऐसी स्ट्रिंग अस्वीकार करता है जिसमें पंक्ति समाप्त करने वाला वर्ण हो। यह अंश पार्सिंग और उद्धरण की सीमा समझाता है; यह exploit या shell कमांड नहीं है।
सोर्स अंश: quote.js — focused upstream diff hunks
// commit 6002b2e से पहले का quote.js — comment-token से संबंधित अंश
if ('comment' in s && typeof s.comment === 'string') {
if (LINE_TERMINATORS.test(s.comment)) {
throw new TypeError('`comment` must not contain line terminators');
}
return '#' + s.comment;
}
// commit 6002b2e के बाद का quote.js — जोड़ी गई guard और comment state का सटीक अंश
var sawComment = false;
return xs.map(function (s) {
if (sawComment && typeof s === 'string' && LINE_TERMINATORS.test(s)) {
throw new TypeError('a token after a `comment` must not contain line terminators');
}
if ('comment' in s && typeof s.comment === 'string') {
if (LINE_TERMINATORS.test(s.comment)) {
throw new TypeError('`comment` must not contain line terminators');
}
sawComment = true;
return '#' + s.comment;
}
});
इंजीनियरिंग और सिस्टम सुरक्षा चेकलिस्ट
- ✓प्रत्यक्ष और अप्रत्यक्ष
shell-quoteनिर्भरताओं को 1.11.0 या बाद के संस्करण में अपडेट करें; लॉकफ़ाइल और तैनात आर्टिफैक्ट में वास्तविक संस्करण जाँचें। - ✓
quote()को हर संदर्भ में सुरक्षित न मानें और इसे शेल चलाने से बचने के विकल्प के रूप में न लें। - ✓जहाँ संभव हो,
shell: falseऔर तर्कों की सूची के साथ निश्चित executable चलाएँ; लक्ष्य प्रोग्राम के अनुसार हर तर्क की जाँच करें। - ✓शेल आवश्यक हो तो कमांड संरचना स्थिर रखें और चलाने से पहले टिप्पणी टोकन के बाद पंक्ति-विराम वाले क्रम अस्वीकार करें।
- ✓बाद की स्ट्रिंग में CR, LF, U+2028 और U+2029 के लिए regression परीक्षण जोड़ें;
parse()से बने टोकन भी शामिल करें। - ✓उन कॉल साइट की समीक्षा करें जो हमलावर-प्रभावित टोकन
quote()को देकर परिणाम चलाती हैं; केवल पैकेज उपयोग से exploitability सिद्ध नहीं होती। - ✓npm संस्करण से Ubuntu पैकेज की स्थिति न मानें; संबंधित वितरण सलाह देखें।