PHP mbstring:编码名内嵌 %00 导致越界读取(CVE-2026-6104,8.4.21/8.5.6 修复)
PHP 的 mbstring 扩展在处理编码名称时存在一个高危越界读取漏洞。根因是:当传给 mb_convert_encoding() 等函数的编码名字符串中嵌入 NUL 字节(\0)时,代码错误地假设 strncasecmp() 返回 0 就意味着“两个字符串长度相同”,随后按错误的长度继续读取内存,可能导致进程崩溃或信息泄露。
触发与影响
受影响函数不止一个:
mb_convert_encoding()mb_detect_encoding()mb_convert_variables()mb_detect_order()
另外,mbstring.detect_order 和 mbstring.http_output 两个 INI 设置的处理路径也在影响范围内。
实际利用场景通常是 Web 应用直接处理用户可控的编码参数,例如把 HTTP 参数原样传给 mb_convert_encoding()。攻击者构造带 %00 的编码名即可触发。
受影响版本
- PHP 8.4.*,早于 8.4.21
- PHP 8.5.*,早于 8.5.6
PHP 8.2/8.3 不在影响范围内。
修复与缓解
- 升级到 PHP 8.4.21 或 8.5.6 及以上。
- 无法立刻升级时,在应用层严格校验传给 mbstring 函数的编码名,确保外部传入的编码参数不含 NUL 字节。
- 在日志或 WAF 层关注包含非预期 NUL(
%00)的请求体或查询参数。