修复CVE-2020-15148需立即升级Yii2至2.0.38+版本,删除或严格校验所有unserialize()用户输入入口,并禁用PHP危险配置、重置cookieValidationKey为强随机密钥且启用Cookie与CSRF验证。

修复 Yii2.0.37 中 CVE-2020-15148 反序列化漏洞需立即停止使用该版本,并替换为已修复的 2.0.38+ 版本,同时清理所有可能触发 unserialize() 的用户可控入口点,否则攻击者可构造恶意 payload 实现远程代码执行。
升级框架至安全版本
执行 composer update yiisoft/yii2:~2.0.38 将核心框架升级到最低修复版本。
若项目锁定了 composer.lock 中的旧版本,先运行 composer require yiisoft/yii2:~2.0.38 --update-with-dependencies 强制更新依赖树。
【必须验证 vendor/yiisoft/yii2/CHANGELOG.md 中是否包含 “Fixed potential RCE via unserialize() in BatchQueryResult” 条目】,否则说明未真正升级成功。
升级后检查 vendor/yiisoft/yii2/VERSION 文件内容是否为 2.0.38 或更高,低于此值即仍存在风险。
删除或加固反序列化入口点
方法一:直接移除危险代码
定位所有类似 unserialize(base64_decode($_GET['data'])) 或 unserialize($userInput) 的调用,彻底删除整段逻辑。
方法二:白名单校验 + 类型约束
若业务必须反序列化,改用 igbinary_unserialize() 或 json_decode() 替代;若无法避免 unserialize(),则在调用前插入严格类名白名单过滤:
if (!in_array($className, ['MySafeClass', 'AnotherTrustedClass'], true)) { throw new BadRequestHttpException(); }
注意:仅靠正则过滤类名前缀(如 ^app\models\)不可靠,攻击者可通过反射绕过。
配置项加固与权限收紧
第一步:禁用危险 PHP 配置
在 php.ini 中确认以下三项已关闭:allow_url_include = Offdisable_functions = exec,passthru,shell_exec,system,proc_open,popen,pcntl_execunserialize_callback_func = ""
第二步:重置 Cookie 密钥并启用签名验证
打开 config/web.php,确保 'cookieValidationKey' 是 32 字符以上随机字符串,且【绝不能使用默认值或测试值如 "test"】;同时添加 'enableCookieValidation' => true 和 'enableCsrfValidation' => true 到 request 组件配置中。
第三步:限制请求方法与参数长度
在 Nginx 配置中加入:if ($request_method !~ ^(GET|HEAD|POST|PUT|DELETE|OPTIONS)$ ) { return 405; }
并在 php.ini 中设 suhosin.post.max_name_length = 64、suhosin.request.max_varname_length = 64(如已安装 Suhosin)。


















