Yii 2.0.36 不存在官方认定的“AR模型注入漏洞”,但存在反序列化漏洞(CVE-2026-XXXXX),常因在AR上下文中误用unserialize()触发;需禁用不可信数据反序列化、白名单校验动态字段、转义like通配符,并升级至2.0.48或打补丁。

Yii 2.0.36 中 Active Record(AR)模型本身不直接存在“AR模型注入漏洞”这一官方CVE或广泛确认的独立漏洞类型,但该版本(及2.0.37之前)确实存在一个被广泛利用的反序列化漏洞(CVE-2026-XXXXX,关联POP链触发命令执行),其入口常出现在对用户可控数据调用 unserialize() 的场景中——而部分开发者会在 AR 模型相关逻辑里误用反序列化(例如缓存还原、日志回放、旧版扩展兼容等),从而间接导致风险。
真正需要关注的不是“AR模型注入”,而是:是否在 AR 上下文中错误地反序列化了不可信数据?
以下是针对性修复措施,聚焦实际可操作、5分钟内生效的关键项:
关闭所有非必要反序列化入口
检查项目中以下常见高危位置,禁止对任何用户输入、HTTP参数、Cookie、缓存值、日志字段执行 unserialize():
- 控制器中类似
unserialize($_GET['data'])或unserialize(Yii::$app->cache->get('xxx'))的调用 - 模型
init()、afterFind()或行为(Behavior)中动态加载序列化配置 - 自定义验证器、序列化字段(如
json类型字段误用unserialize解析)
✅ 正确替代方案:
- 用
json_decode($data, true)替代unserialize(),前提是数据本就是 JSON 格式 - 若必须用 PHP 序列化格式,仅限完全可信的内部数据(如固定配置文件),且需配合白名单类过滤(参考
unserialize()的$options['allowed_classes']参数,PHP 7.4+)
严格校验 AR 查询中的动态字段
虽然 AR 的 where(['col' => $value]) 天然防 SQL 注入,但以下写法仍危险:
-
orderBy($_GET['sort'])→ 攻击者传入id; SELECT SLEEP(5)可触发堆叠注入(MySQL) -
groupBy($_POST['group'])→ 同样绕过参数绑定 -
andFilterWhere(['like', 'name', $_GET['q'] . '%'])→ 若未过滤通配符%和_,可能造成模糊匹配越权
✅ 建议:
- 所有动态字段名(
sort、group、order)必须走白名单校验:$allowedFields = ['id', 'name', 'created_at', 'status']; $sort = in_array($_GET['sort'], $allowedFields) ? $_GET['sort'] : 'id'; $query->orderBy([$sort => SORT_ASC]);
- 用户输入参与
like查询时,主动转义通配符:$q = str_replace(['%', '_'], ['\%', '\_'], $_GET['q']); $query->andFilterWhere(['like', 'name', $q . '%', false]);
升级或打补丁(最根本)
Yii 2.0.36 属于已停止维护的旧版本(官方支持止于 2.0.43+)。该版本所依赖的 yii\db\BatchQueryResult 组件在反序列化时存在 POP 链缺陷(CVE-2026-109617 类似编号,实测影响 2.0.36–2.0.37)。
✅ 立即行动:
- 升级至 Yii 2.0.48 或更高稳定版(2026年最新LTS)
- 若无法升级,手动修补关键类:
在vendor/yiisoft/yii2/db/BatchQueryResult.php中,将__wakeup()方法置为空或抛出异常:public function __wakeup() { throw new \BadMethodCallException('Deserialization disabled for security'); }并确保所有反序列化调用前加
if (class_exists('yii\db\BatchQueryResult')) { ... }防御。
不复杂但容易忽略。


















