Yii 2.0.37 反序列化漏洞(CVE-2020-15148)本质是POP链利用的设计缺陷,根本修复需升级至2.0.38+并禁用BatchQueryResult反序列化,禁用unserialize等函数仅为临时缓解且不可禁用unserialize以免框架崩溃。

Yii 2.0.37 的反序列化漏洞(CVE-2020-15148)本质是框架设计缺陷引发的 POP 链利用问题,不是单纯靠禁用 PHP 函数就能修复的。官方修复方式是修改类行为、阻断链路起点,而非依赖函数禁用。但若在无法升级或临时缓解阶段需加强防护,可结合以下措施:
禁用高危函数(仅作辅助缓解,非根本修复)
这些函数常被 POP 链末端调用以实现 RCE,禁用后可阻断多数已知利用链:
- call_user_func
- call_user_func_array
- unserialize(需谨慎:Yii 自身大量使用,禁用将导致框架崩溃)
- system、exec、shell_exec、passthru、pcntl_exec
⚠️ 注意:直接在
php.ini中用disable_functions禁用unserialize会破坏 Yii 正常运行(如 session 反序列化、缓存、日志等),不推荐。真正该做的是避免对用户输入调用unserialize()。
关键修复动作(必须执行)
-
升级到 2.0.38 或更高版本:官方在
yii\db\BatchQueryResult中添加了__wakeup()方法,直接抛出异常,从源头禁止该类被反序列化。 -
检查并删除所有自定义的
unserialize()调用点:例如 CTF 题中常见的public function actionTest($name){ return unserialize($name); }—— 这类代码必须移除或改用安全替代方案(如 JSON)。 -
确保
cookieValidationKey已正确配置:虽不直接影响反序列化链,但缺失会导致签名失效,可能诱发其他绕过逻辑。
替代方案比禁用更可靠
- 用
json_decode()+json_encode()替代unserialize()/serialize()处理用户数据; - 对所有反序列化入口点增加白名单校验(如只允许特定类名);
- 启用 PHP 的
opcache.validate_permission=1和严格错误报告,辅助发现异常调用。
不升级版本只靠禁函数,既不能彻底阻断新链,又容易引发兼容性故障。


















