IPBUF安全漏洞报告
English
CVE-2025-12758 CVSS 7.5 高危

CVE-2025-12758 validator.js isLength()函数Unicode变体选择符过滤不完整漏洞

披露日期: 2025-11-27

漏洞信息

漏洞编号
CVE-2025-12758
漏洞类型
输入验证绕过
CVSS评分
7.5 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
validator.js (validator package)

相关标签

CVE-2025-12758validator.js输入验证绕过Unicode变体选择符isLength()JavaScriptNode.jsCVSS 7.5高危漏洞Snyk

漏洞概述

validator.js是一个流行的JavaScript验证库,广泛用于Node.js和浏览器环境中对用户输入进行验证。该库的isLength()函数存在一个安全漏洞,版本低于13.15.22的受影响版本在处理包含Unicode变体选择符(\uFE0F、\uFE0E)的字符串时,未能正确计算字符串长度。Unicode变体选择符是用于修改字符显示形式的特殊符号,例如将表情符号从文字形式转换为表情符号形式。攻击者可以利用此漏洞构造包含特殊Unicode序列的输入字符串,使得isLength()函数返回错误的验证结果,导致应用程序接受超出预期长度的字符串。这可能引发多种安全问题,包括数据库字段截断、缓冲区溢出风险,以及拒绝服务攻击等。

技术细节

isLength()函数的验证逻辑存在缺陷,未能正确处理Unicode变体选择符(\uFE0F和\uFE0E)。当字符串中包含这些变体选择符时,函数可能将其视为独立字符进行计数,或者在某些情况下完全忽略它们,导致字符串的'视觉长度'与'实际长度'不一致。例如,一个包含表情符号和变体选择符的字符串可能被计算为2个字符,而实际上它包含多个代码点。攻击者可以利用这一特性绕过基于isLength()的长度验证检查,提交超出应用程序预期的超长字符串。在数据库存储场景中,这可能导致数据被意外截断;在需要精确长度控制的场景中,可能引发缓冲区处理问题;在极端情况下,大量畸形输入可能导致应用程序资源耗尽。

攻击链分析

STEP 1
1
攻击者识别目标应用程序使用validator.js的isLength()函数进行输入长度验证
STEP 2
2
攻击者构造包含Unicode变体选择符(\uFE0F或\uFE0E)与表情符号组合的恶意字符串
STEP 3
3
由于isLength()函数对变体选择符处理不当,恶意字符串的'视觉长度'与'实际长度'产生差异
STEP 4
4
应用程序的isLength()验证通过,但实际存储或处理的字符串超出了预期长度限制
STEP 5
5
超长字符串导致数据库截断、缓冲区溢出或资源耗尽等安全问题

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
const validator = require('validator'); // Normal emoji without variant selector const normalEmoji = '😀'; // U+1F600 console.log('Normal emoji length:', [...normalEmoji].length); // 1 console.log('isLength(normalEmoji, {min: 1, max: 1}):', validator.isLength(normalEmoji, {min: 1, max: 1})); // true // Emoji with variant selector U+FE0F (variation selector-16) const emojiWithVS16 = '\u{1F600}\u{FE0F}'; // Emoji + VS16 console.log('Emoji with VS16 length:', [...emojiWithVS16].length); // 2 (incorrect) console.log('isLength(emojiWithVS16, {min: 1, max: 1}):', validator.isLength(emojiWithVS16, {min: 1, max: 1})); // false (incorrect) // Emoji with variation selector U+FE0E (text variation) const emojiWithVS15 = '\u{1F600}\u{FE0E}'; // Emoji + VS15 console.log('Emoji with VS15 length:', [...emojiWithVS15].length); // 2 (incorrect) console.log('isLength(emojiWithVS15, {min: 1, max: 1}):', validator.isLength(emojiWithVS15, {min: 1, max: 1})); // false (incorrect) // Attack example: Bypass length check const maliciousInput = '\u{1F600}\u{FE0F}'.repeat(100); // Visual length: 100, actual code points: 200 const maxAllowed = 100; console.log('Malicious input visual length:', 100); console.log('Malicious input actual code points:', 200); console.log('isLength bypass check (max 100):', validator.isLength(maliciousInput, {min: 0, max: 100})); // true (bypassed)

影响范围

validator.js < 13.15.22

防御指南

临时缓解措施
如果无法立即升级到修复版本,可以采取以下临时缓解措施:1) 在应用层实现额外的长度验证逻辑,使用String.prototype.normalize('NFC')进行Unicode规范化后再计算长度;2) 对用户输入中的表情符号和特殊Unicode字符进行过滤或替换;3) 限制表情符号输入数量或完全禁用表情符号输入;4) 增加数据库字段长度限制以容纳可能的超长字符串;5) 实施输入长度的事后检查,在数据存储前再次验证实际长度。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表