【复现】php2shell(CVE-2026-109618/109619)PHP 远程代码执行漏洞
启明星辰
启明星辰
ADLab
2026年10月22日 17:17
北京
去阅读
更多安全资讯和分析文章请关注启明星辰ADLab微信公众号及官方网站(adlab.venustech.com.cn)
-
漏洞描述
2026年10月21日,PHP官方发布紧急安全更新,覆盖8.2.35、8.3.36、8.4.27与8.5.12四个版本分支,修复了两个高危远程代码执行漏洞:CVE-2026-109618与CVE-2026-109619,被称为“php2shell”。漏洞无需任何身份认证,攻击者仅需构造恶意HTTP请求即可远程触发,进而在受影响的Web服务进程权限下执行任意代码。
目前该漏洞PoC和技术细节已公开。鉴于漏洞影响范围较大,建议相关用户立即升级至对应的修复版本。
-
影响范围
| 分支 | 受影响版本 | 修复版本 | 说明 |
| PHP 8.5 | 8.5.0 – 8.5.11 | 8.5.12 | 官方修复 |
| PHP 8.4 | 8.4.0 – 8.4.26 | 8.4.27 | 官方修复 |
| PHP 8.3 | 8.3.x 全部 | 8.3.36 | 官方修复 |
| PHP 8.2 | 8.2.x 全部 | 8.2.35 | 官方修复 |
| PHP 5.x / 6.x / 7.x | 5.4 及以上全部 | 无(分支 EOL) | 理论上永久暴露,无官方补丁 |
-
漏洞原理
(1)CVE-2026-109618:OOM异常导致请求状态损坏
在PHP处理HTTP请求的过程中,multipart/form-data解析及相关的会话上传进度处理逻辑可能在请求内部状态尚未完成初始化时执行内存分配操作。当内存分配失败触发OOM处理时,PHP通过longjmp ()及相关的 zend\_bailout ()异常退出机制中断当前执行路径。由于该退出方式跳过了本应执行的清理与复位逻辑,部分请求内部结构会停留在未初始化或状态不一致的状态。攻击者可以通过构造具有较高内部内存开销的请求提高触发内存分配失败的概率,例如大量multipart分段、分段头部及复杂的字段结构,会使PHP为解析请求分配的内部内存显著超过请求体本身的体积;post\_max\_size等请求体大小限制并不能单独保证此类分配不会失败,尤其是请求大小无法通过有效的 Content-Length预先确定时,相关预检会被跳过。当OOM中断执行而状态未被正确清理时,该请求随后的关闭流程(shutdown)会将无效或未初始化的数据当作有效结构读取、判断或处理。即便请求启动已经失败,Apache mod\_php仍会无条件执行关闭流程,由此造成内存损坏。
(2)CVE-2026-109619:残留内部状态导致释放后使用(UAF)
PHP的部分内部状态由跨请求存活的工作进程持有,而这些状态引用的数据却分配在单个请求的内存生命周期内。正常情况下,PHP必须在释放请求内存之前,正确复位或清除所有可能继续引用这些内存的内部状态;当致命错误、OOM或其他非正常控制流打断复位流程时,部分跨请求保留的内部状态将继续指向已释放的请求内存,形成悬垂指针。由于工作进程继续处理后续请求,这些残留状态不会随单个请求结束而消失。当同一工作进程处理下一个请求时,若请求初始化、启动期错误诊断(如经.htaccess/php\_value或FPM的PHP\_VALUE逐请求下发配置引发的警告)或会话上传进度处理等路径在残留状态被复位之前访问这些引用,就会发生释放后使用(Use-After-Free):已释放内存若被攻击者可控的数据重新占据,后续读取、写入与控制流判断都将基于失效对象进行,可进一步实现以PHP工作进程权限执行任意代码。
两个漏洞在完整利用链中互为条件、缺一不可。CVE-2026-109618提供状态污染的入口:攻击者以高内存开销的multipart请求在初始化中途触发OOM,经longjmp逃逸跳过复位,使进程级会话全局变量(PS(id)、PS(http\\_session\\_vars))残留指向已释放内存;CVE-2026-109619则提供脏状态的消费出口:后续请求的会话上传进度处理会在正常初始化之前对这些悬垂引用执行析构,攻击者借此以受控的表单字段值精确重占被释放内存、伪造内部结构。先借越界读取泄露进程基址以绕过ASLR,再将析构路径中的函数指针导向zif\\_system,以Web服务权限执行任意命令。
-
漏洞复现
在PHP 8.4.26版本下完成该漏洞复现,成功实现远程代码执行。
-
安全建议
(1)正式防护方案
升级至修复版本:8.5.12 / 8.4.27 / 8.3.36 / 8.2.35,升级后必须重启全部PHP worker、FPM pool与 Apache/mod\_php进程。
(2)临时防护措施
- 关闭上传进度功能,设置:session.upload\_progress.enabled = 0,写在php.ini或FPM pool配置中,改完重启全部worker。
- 取消内存软限制,设置:memory\_limit = -1,经php\_admin\_value在FPM pool/Apache层强制(防止应用自行覆盖),资源上限交给cgroup / 容器限额兜底。
- 进程一次一换,设置:FPM池pm.max\_requests = 1;mod\_php对应Apache的MaxRequestsPerChild = 1。
- 收紧multipart,设置:WAF / 反向代理限制multipart请求的part数量、单个part的头部数量、请求体总大小。
参考链接:
[1] https://github.com/php/php-src/security/advisories/GHSA-w8hw-w9fx-j79w
[2] https://github.com/php/php-src/security/advisories/GHSA-6wmf-4rv5-p3rp
启明星辰积极防御实验室(ADLab)
ADLab成立于1999年,是中国安全行业最早成立的攻防技术研究实验室之一,微软MAPP计划核心成员,“黑雀攻击”概念首推者。截至目前,ADLab已通过 CNVD/CNNVD/NVDB/CVE累计发布安全漏洞7000余个,持续保持国际网络安全领域一流水准。实验室研究方向涵盖基础安全研究、电信运营商基础设施安全研究、移动终端安全研究、云安全研究、信创安全研究、物联网安全研究、车联网安全研究、工控安全研究、数据安全研究、5G安全研究、AI安全研究、卫星安全研究、低空安全研究、高级威胁研究、攻防体系建设。研究成果应用于产品核心技术研究、国家重点科技项目攻关、专业安全服务等。
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论