最有效修复方式是升级至Yii 2.0.38+,该版本在yii\db\BatchQueryResult类中新增__wakeup()方法强制抛异常,阻断CVE-2020-15148反序列化利用链。

直接升级到 Yii 2.0.38 或更高版本是最有效、最推荐的应急修复方式。该版本已官方修复 CVE-2020-15148,核心改动是在 yii\db\BatchQueryResult 类中新增了 __wakeup() 方法,强制在反序列化开始时抛出异常,彻底阻断利用链起点。
立即停用不安全的 unserialize 调用
全项目搜索 unserialize(,尤其关注以下位置:
- 控制器中直接处理用户输入(如
$_GET['data']、$_POST['payload'])后调用unserialize - Cookie 或 Session 数据解码逻辑(例如手动解析加密后的 cookie 值)
- 缓存反取后未校验直接反序列化的场景(如 Redis/Memcached 中存储的 PHP 序列化字符串)
一律替换为更安全的替代方案:
优先使用 JSON:改用 json_encode() / json_decode($str, true),它不执行代码、无魔术方法风险;
若必须用 PHP 序列化,则需配合白名单类过滤(如使用 unserialize($data, ['allowed_classes' => ['MySafeClass']])),严禁设为 true 或空数组。
临时缓解:拦截高危反序列化入口
在应用入口(如 web/index.php)或基控制器中添加前置检查:
- 对所有含
unserialize的 action,增加参数校验:拒绝 Base64 编码后包含O:(对象标识)、C:(自定义类)、a:(数组但结构异常)等特征的输入 - 记录并告警所有触发
unserialize的请求(含 IP、URI、参数摘要),便于溯源和攻击感知 - Web 服务器层(Nginx/Apache)可配置规则,拦截 URL 或 POST body 中出现
%4F%3A(URL 编码的O:)等典型 payload 特征
验证修复是否生效
完成修复后,务必验证:
- 访问原漏洞触发点(如
/index.php?r=test/xixi&aaa=TzoyMDoieWlpXGRiXEJhdGNoUXVlcnlSZXN1bHQiOjE6e3M6MjQ6IgB5aWlcZGJcQmF0Y2hRdWVyeVJlc3VsdAAkX2RhdGFSZWFkZXIiO086MTU6IkZha2VyXEdlbmVyYXRvciI6MDp7fX0=)应返回 500 错误或明确提示,而非执行 phpinfo 或命令 - 确认
yii\db\BatchQueryResult::__wakeup已存在且逻辑为throw new \BadMethodCallException('Deserialization is not allowed.'); - 运行
composer show yiisoft/yii2确认版本 ≥ 2.0.38
修复不复杂但容易忽略细节,关键是切断入口、升级版本、验证行为三者缺一不可。


















