yii 2.0.39无官方“权限绕过”cve,但存在典型配置缺陷:accesscontrol规则缺默认拒绝、rbac缓存未刷新、beforeaction遗漏父类调用、url别名绕过校验,需显式加固。

Yii 2.0.39 本身不是官方发布的正式版本,Yii 2 的最后一个稳定版是 2.0.48(发布于 2023 年 11 月),而 2.0.39 发布于 2021 年 4 月,属于较旧版本,已停止维护。该版本中未被 Yii 官方披露存在名为“权限绕过”的 CVE 或安全公告。
但实践中,部分基于 Yii 2.0.39 的定制化系统(尤其是未及时升级、自行修改 RBAC 实现或覆盖 AccessControl/yii\filters\AccessControl 行为的项目)曾出现以下典型配置型权限缺陷,常被误称为“权限绕过漏洞”:
常见成因与修复操作
-
AccessControl规则未显式声明deny或缺少else分支
若控制器中仅写['allow' => true, 'actions' => ['view']],却未对其他 action 设置 deny,默认可能放行——尤其当except或only使用不当、或规则顺序错乱时。
✅ 修复:明确限制默认行为,例如:public function behaviors() { return [ 'access' => [ 'class' => AccessControl::className(), 'only' => ['view', 'update', 'delete'], 'rules' => [ [ 'allow' => true, 'actions' => ['view'], 'roles' => ['?'], // 匿名可访问 ], [ 'allow' => true, 'actions' => ['update', 'delete'], 'roles' => ['@'], // 登录用户 ], ], // 关键:添加默认拒绝 'denyCallback' => function ($rule, $action) { throw new ForbiddenHttpException('You are not allowed to perform this action.'); }, ], ]; } -
RBAC 数据库缓存未刷新导致角色权限未生效
使用DbManager时,若手动插入权限项但未调用Yii::$app->authManager->invalidateCache(),旧缓存可能导致新权限不生效,看似“绕过”。
✅ 修复:每次更新权限后执行缓存清理:php yii rbac/flush-cache
或在代码中调用:
Yii::$app->authManager->invalidateCache();
-
beforeAction()中遗漏父类调用或逻辑短路
自定义控制器重写了beforeAction()却忘记return parent::beforeAction($action);,导致AccessControl等行为过滤器被跳过。
✅ 修复:确保显式调用父方法,且返回值正确传递:public function beforeAction($action) { if (!parent::beforeAction($action)) { return false; // 必须返回 false 阻断执行 } // 自定义逻辑... return true; } URL 路由别名或
urlManager规则绕过 controller/action 校验
如配置了'<alias:>' => 'site/<alias>'</alias></alias:>类型规则,但未在目标 action 中做权限校验,可能使/admin被映射为/site/admin而逃逸原访问控制。
✅ 修复:所有路由终点(包括别名映射的目标 action)必须独立声明访问规则,不可依赖路径结构做权限假设。
不复杂但容易忽略











