FlawOpen

flawopen.com/Teardowns/cve-2026-102422-shell-quote-comment-line-terminator-injection

● CVE-2026-102422 · CVSS 8.1 · उच्च
सुरक्षा अनुसंधान · FlawOpen

CVE-2026-102422: shell-quote में टिप्पणी टोकन इंजेक्शन

shell-quote 1.11.0 से पहले, टिप्पणी टोकन के बाद पंक्ति समाप्त करने वाला वर्ण रखने वाली स्ट्रिंग आने पर POSIX शेल को दिए गए उद्धृत आउटपुट का अर्थ बदल सकता था। इसके लिए हमलावर का टोकन पर प्रभाव, quote() का उपयोग और आउटपुट को शेल में चलाना आवश्यक है। 1.11.0 या उसके बाद के संस्करण में अपडेट करें।

💡 आसान भाषा में (ELI5)

किसी लेबल पर लिखी टिप्पणी उसी पंक्ति के बाकी हिस्से को छिपा सकती है। अगले भाग में पंक्ति-विराम हो तो टिप्पणी जल्दी समाप्त हो जाती है और उसके बाद का पाठ फिर दिखने लगता है। इस दोष में बाद का टोकन शेल के लिए उद्धृत आउटपुट में ऐसा कर सकता था।

इस पेज के मुख्य शब्द

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

टोकन उद्धरण फ़ंक्शन तक पहुँचते हैं

ऐप टिप्पणी और बाद की स्ट्रिंग वाले टोकन बनाता है; हमलावर का उस क्रम पर प्रभाव होना आवश्यक है।

चरण 2

फ़ंक्शन टिप्पणी सिंटैक्स निकालता है

1.11.0 से पहले quote() टिप्पणी पाठ जाँचता था, लेकिन बाद की स्ट्रिंग याद नहीं रखता था।

चरण 3

बाद के टोकन में पंक्ति सीमा होती है

CR, LF, U+2028 या U+2029 शेल टिप्पणी समाप्त कर सकते हैं।

चरण 4

ऐप आउटपुट को शेल में चलाता है

दस्तावेज़ित व्याख्या उन कॉलर पर लागू है जो आउटपुट को POSIX शेल में भेजते हैं।

चरण 5

अपडेट असुरक्षित क्रम को अस्वीकार करता है

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;
  }
});

इंजीनियरिंग और सिस्टम सुरक्षा चेकलिस्ट

स्रोत