php-src 官方安全公告(2026-05-07,评级 medium)披露 cve-2026-7258:urldecode() 内部把带符号的 char 直接传给 isxdigit(),违反 c11 对 ctype 函数参数的约束,在特定平台上造成越界读。修复版本为 8.2.31、8.3.31、8.4.21、8.5.6。

▲ php/php-src Security Advisories 公告页
漏洞机制
php_url_decode_ex() 在解析 %XX 转义时把 char 值直接传给 isxdigit()。C11 规定 ctype.h 函数的参数必须能以 unsigned char 表示(0-255)或等于 EOF;多数平台 char 是有符号类型,值小于 0 时经符号扩展变成负数,行为未定义。多数运行时容忍这种常见错误,但 NetBSD 的实现按负值查表,导致越界读并段错误。复现只需一行:urldecode("%\x80")。
影响与风险
影响集中在 NetBSD 等对 ctype 严格实现的平台:解码用户可控的 URL 编码数据(查询串、表单、路径)即可让进程崩溃。Linux/macOS 的 glibc 与 musl 实现通常有内置保护,同类输入不会崩溃,但代码本身的未定义行为仍应消除——新平台、新编译器下风险可能重现。
修复与升级
升级到 8.2.31 / 8.3.31 / 8.4.21 / 8.5.6 及以上。跨平台部署的应用即使当前平台无恙也应跟进,因为这是标准的未定义行为修复;NetBSD 用户应视其为高危。
修复补丁(官方提交)
该问题由官方提交 a38418777f65 修复(2026-05-03),提交说明为「GHSA-m8rr-4c36-8gq4: Consistently pass unsigned char to ctype.h functions」。改动涉及 5 个源码/测试文件,核心变更如下:
Zend/zend_compile.c
@@ -1977,7 +1977,7 @@ ZEND_API size_t zend_dirname(char *path, size_t len)
/* Note that on Win32 CWD is per drive (heritage from CP/M).
* This means dirname("c:foo") maps to "c:." or "c:" - which means CWD on C: drive.
*/
- if ((2
<p style="text-align: center; color: #888; font-size: 13px;">▲ 补丁片段摘自上述提交</p>
<p>完整补丁与测试用例可在官方提交页面查看:https://github.com/php/php-src/commit/a38418777f65780d9d622197677e90567690fc07</p>
<p style="text-align: center;">@@##@@</p><p style="text-align: center; color: #888; font-size: 13px;">▲ 官方公告</p>
<p style="text-align: center;">@@##@@</p><p style="text-align: center; color: #888; font-size: 13px;">▲ php-src 修复提交</p>
<h2>关键信息</h2>
| 项目 | 内容 |
|---|---|
| 类目 | 安全漏洞 |
| 级别 | 中 |
| 日期 | 2026-05-07 |
| 关联编号 | CVE-2026-7258 / GHSA-m8rr-4c36-8gq4 |
| 影响范围 | php-src;官方修复版本 8.2.31 / 8.3.31 / 8.4.21 / 8.5.6 |
| 核验状态 | 已官方确认 |
| 受影响与修复 | php-src 修复 8.2.31;php-src 修复 8.3.31;php-src 修复 8.4.21;php-src 修复 8.5.6 |
| 修复提交 | a38418777f65(PHP-8.2) |
来源:https://github.com/php/php-src/security/advisories/GHSA-m8rr-4c36-8gq4












