Drupal 8.4.x 访问控制绕过漏洞

Posted by JenI on 2018-04-08 00:00:00+08:00

前言

Drupal是使用PHP语言编写的开源内容管理框架(CMF),它由内容管理系统(CMS)和PHP开发框架(Framework)共同构成。连续多年荣获全球最佳CMS大奖,是基于PHP语言最著名的WEB应用程序。近期,著名的Drupal CMS网站爆出 7 个漏洞,在 Drupal 8.4.5 之前的 8.4.x 存在一个严重的访问控制绕过漏洞(CVE-2017-6926),具有发表评论权限的用户可以查看他们无权访问的文章评论,并且还可以回复该评论。

漏洞分析

漏洞出现在 /core/modules/comment/src/Controller/CommentController.php 文件内,此文件为 Drupal 的评论控制器,其中 replyFormAccess 函数在处理 entity 实体时没有对 entity 实体的权限进行判断,造成了用户可以访问本来没有权限查看的评论页面,并可以对评论进行回复,从而导致了越权的发生。这里需要注意的是此漏洞中的 entity 实体并不是指文章的评论,而是文章本身。

drupal_acl_pass_1

使用一个简单的实例来说明漏洞。假设 admin 用户公开发表了一篇文章,并作了评论,如下:

drupal_acl_pass_2

此时访问 http://127.0.0.1/drupal/comment/reply/node/1/comment/1 可以对 Hello World 这篇文章的第一个评论进行回复,其中 node 后面的 1 代表第一篇文章,comment 后的 1 代表第 1 条评论。

drupal_acl_pass_3

使用 admin 用户将这篇文章的 Published 状态去掉。

drupal_acl_pass_4

然后使用 attacker 用户(具有评论权限)登录,访问 node 页面时是看不到 Hello World 这篇文章的,因为它被 admin 用户隐藏了。

drupal_acl_pass_5

这时尝试直接访问 http://127.0.0.1/drupal/comment/reply/node/1/comment/1,发现可以访问,尝试评论:

drupal_acl_pass_6

评论后会跳转到 http://127.0.0.1/drupal/node/1#comment-2 页面,由于该页面被隐藏,所以会返回 Access denied,但同时会提示 Your comment has been posted。

drupal_acl_pass_7

这时使用 admin 用户登录,查看 Hello World 文章的评论,发现 attacker 用户在无法查看文章的情况下成功回复了第一条评论。

drupal_acl_pass_8

Drupal 在 2 月份的 commit 中修复了这一漏洞,在原来的基础上针对 entity 实体进行了权限判断:

drupal_acl_pass_9

allowedIf 函数返回 True 或 False。当一个普通用户无法查看某一篇文章时,allowedIf 函数对 $entity->access(‘view’); 的判断结果则为 False,此时这个用户则无法查看文章评论。补丁代码相当于在用户回复某篇文章的评论之前判断了其是否有权限访问这篇文章。

参考

http://blog.nsfocus.net/drupal8-cve-2017-6926/


作者:   JenI   转载请注明出处,谢谢


Comments !