WordPress 于 9 月 22 日发布 7.1.2 安全版本,仅修复一处漏洞 CVE-2026-87902:页面模板解析环节的未认证路径遍历,可导致本地文件包含,并在特定环境下升级为远程代码执行,CVSS 评分 9.2。补丁发布不到五小时,Patchstack 就观测到针对该漏洞的探测流量,随后攻击量放大十倍并出现落盘行为。
事件概述
受影响版本为 WordPress 4.7.0 至 7.1.1。官方修复版本是 7.1.2,并回补至 7.0.6、6.9.9、6.8.10 与 4.7.37;4.6 之前不再提供修复。漏洞由研究员 Robert Ressl 报告,这是四天内第二个安全版本。
技术细节
缺陷位于 wp-includes/template.php 的 get_page_template()。WordPress 解析页面模板时,会用 pagename 参数拼出候选文件名 page-{pagename}.php;相邻的另一条代码路径调用了 validate_file() 拦截路径穿越,而这条分支漏掉了该判断。
绕过方式很精确:WordPress 的 URL 清洗会剥掉字面量点号,却保留百分号编码的点号,因此 %252e%252e 可完整穿过清洗,随后 get_page_template() 调用 urldecode() 解码得到 ../,攻击者由此跳出主题目录,把包含目标指向服务器上任意可读的 .php 文件。
走到远程代码执行还需两个条件同时成立:当前父主题或子主题必须存在以 page- 开头的顶级目录,Twenty Twelve、Twenty Fourteen 等老默认主题天然满足;被包含的文件必须可读且能承接攻击者输入。官方示例路径是 PEAR 的 pearcmd.php:当 register_argc_argv 打开时,该脚本从 $_SERVER['argv'] 读取命令,而 argv 可由查询串控制。PHP 官方 Docker 镜像默认开启该选项,默认 cPanel 配置使用 8.5 之前 PHP 版本时同样受影响。
影响评估
本地文件包含无条件成立,只要版本落在受影响区间;远程代码执行则取决于上述两个环境条件,容器化部署与 cPanel 共享主机属高风险组合。
Patchstack 观测显示,首批恶意请求出现在 9 月 22 日 17:44 UTC,距 7.1.2 发布不到五小时,请求形态与补丁差异完全对应。早期流量指向 wp-links-opml.php 等核心文件,属低成本探测:该文件返回特征明显的 OPML 文档,可作为包含成功的判断依据。随后攻击量增长十倍,载荷被写入 /tmp 与 /var/tmp。
修复建议
- 立即升级到 7.1.2;旧分支升级到 7.0.6、6.9.9、6.8.10 或 4.7.37。
- 无法立刻升级时,确认
register_argc_argv是否为 On、主题是否存在page-前缀目录。两项只要一项不成立,远程代码执行路径即被切断。关闭该选项只是缓解,不能替代补丁。 - 日志检索
pagename中的双重编码穿越串%252e%252e及其大写形式,重点关注pagename与page_id同时出现的请求。 - 已知来源 IP 可先加黑名单:169.58.48.193、169.58.48.195、2001:df1:e8c0::106b。穿越层级在 3 到 7 层之间变动。
- 在反向代理或 WAF 层拦截携带此类编码穿越串的请求,并核查站点目录是否出现异常新增文件。