漏洞概述 漏洞名称: 验证 UTF-8 续行字节在 中的问题 漏洞描述: 函数在处理多字节 UTF-8 序列时,未验证续行字节是否存在或有效。这导致在处理截断序列(如 )时,函数会读取超出边界的堆内存,越过 NUL 终止符。这影响了所有 DOM 创建方法,如 、 、 等。 影响范围 漏洞类型: 堆内存越界读取 攻击面: 任何使用未过滤输入作为 XML 元素名、属性名或节点名的代码路径 影响: - 拒绝服务 (DoS): 高置信度,当 DOM 读取未映射内存时崩溃 - 信息泄露: 低置信度,相邻堆数据被读取并用于字符分类,但原始值未返回给 Perl 调用者,限制了信息泄露面 严重性: 高,任何允许用户控制字符串到 DOM 名称方法的程序都受到影响 修复方案 1. 添加续行字节验证: 在 中为 2 字节、3 字节和 4 字节 UTF-8 序列添加续行字节验证,匹配 libxml2 的 行为。 2. 添加截断 UTF-8 序列测试: 在 测试数组中添加截断 UTF-8 序列。 3. 添加专用安全回归测试: 添加 测试,包含 65 个测试用例,覆盖所有截断点、无效续行字节和所有 DOM 入口点。 POC 代码 ```c // 修复后的代码片段 299 + if (remaining < 4 300 + (cur[1] & 0xC0) == 0x80 301 + (cur[2