代码 PHP mbstring 编码名内嵌 %00 触发越界读取:strncasecmp 长度假设的坑

2026-09-03 21:05:08

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_ordermbstring.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)的请求体或查询参数。

参考:https://cve.xzxzc.com/zh/cve/CVE-2026-6104

复制全文 生成海报 PHP 安全 mbstring

推荐文章

程序员茄子在线接单