PHP 8.4.27 修复的是 CVE-2026-109618 和 CVE-2026-109619 两个严重 RCE 漏洞,源于内存耗尽处理缺陷与全局状态残留,CVSS 4.0 评分均为 9.2,与装饰器无关,PHP 本身不支持装饰器。

PHP 8.4.27 并没有修复“装饰器带来的安全漏洞”——PHP 语言本身不支持装饰器语法,也从未在任何版本(包括 8.4 系列)中引入类似 Python 的 @decorator 或 TypeScript 的装饰器特性。
你可能混淆了以下几种情况:
- 把其他语言(如 Python、TypeScript、Java)的装饰器概念误套到 PHP 上
- 将 PHP 8.4 新增的 属性(Attributes) 误称为“装饰器”
- 听说 CVE-2026-109618 / CVE-2026-109619 被称作“PHP2Shell”,进而推测与属性有关
而实际上,PHP 8.4.27 修复的是两个严重内存管理缺陷,影响 unserialize() 和某些资源释放路径,攻击者可利用它们实现远程代码执行(RCE)。这些漏洞与属性(Attributes)无关,更与“装饰器”无关。
PHP 8.4 的 Attributes 不是装饰器,也不带运行时钩子
- PHP 的
#[Attribute]是纯编译期元数据,用于标注类、方法、参数等,不执行任意代码 - 它不像 Python 装饰器那样会自动 wrap 函数逻辑,也不像 TS 装饰器那样能修改类定义或注入行为
- 属性值仅能通过
ReflectionAttribute在运行时读取,本身不触发调用、不改变控制流
所以:
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
立即学习“PHP免费学习笔记(深入)”;
- 你不能用
#[AdminOnly]自动拦截请求(那是框架层的事) - 你也不能靠写个属性就绕过鉴权或触发反序列化(漏洞不在这里)
- 框架若基于属性做权限/路由等逻辑,风险来自框架实现,而非 PHP 属性本身
CVE-2026-109618 和 CVE-2026-109619 的真实影响点
这两个漏洞的核心是:
-
unserialize()在处理恶意构造的字节流时,未正确清理某些内部对象引用,导致use-after-free - 某些扩展(如
dba、imap解耦后遗留的资源管理路径)在异常退出时跳过资源销毁步骤
它们的触发条件明确依赖:
- 开放了
unserialize()且未严格限制allowed_classes - 或使用了存在缺陷的第三方扩展(尤其旧版 PECL 扩展未适配 PHP 8.4.27 的资源模型)
升级到 PHP 8.4.27 后仍需检查的实操项
- 确认所有调用
unserialize()的地方都显式传入了白名单,例如:unserialize($data, ['allowed_classes' => ['MyDTO']] ) - 避免将用户输入(如 cookie、HTTP header、session 数据)直接喂给
unserialize() - 检查是否加载了非官方或未更新的 PECL 扩展,尤其是涉及
dba、imap、xmlrpc的旧版本 - 如果用了自定义的属性处理器(比如扫描
#[Route]并注册路由),确保反射逻辑不调用不可信对象的魔术方法(如__wakeup())
PHP 官方已明确表示:无临时缓解措施,必须升级。这不是配置问题,而是内存安全边界被突破。哪怕你完全不用属性,只要运行在未打补丁的 8.4.26 或更早版本上,且存在反序列化入口,风险就真实存在。


















