Drupal 远程代码执行漏洞安全通告

发布时间 2019-02-22

漏洞编号和级别


CVE编号:CVE-2019-6340,危险级别:严重, CVSS分值:官方未评定


影响范围


受影响版本: 

漏洞影响Drupal 8.6.x、Drupal 8.5.x 及 Drupal 7中的部分组件。详细版本信息如下:

Drupal 8.6.9 及以下版本

Drupal 8.6.10 及以下版本

影响组件

RESTful Web Services

JSON:API

Link

Metatag

Video

Paragraphs

Translation Management Tool

Font Awesome lcons


漏洞概述


2月20日,Drupal 官方披露了一个 Drupal 的远程命令执行漏洞,漏洞是由Drupal 未对RESTful Web的数据进行严格效验造成。如果网站开启了RESTful Web服务,并且接受PATCH POST请求,或站点中开启了其他web服务模块,将会出现反序列化问题,进而造成代码执行。


根据Drupal 的配置,此漏洞可能不需要任何权限即可触发。但是如果被利用,攻击者则可以直接在Web服务器上执行任意PHP代码,造成服务器被入侵、用户信息泄露等后果。


RESTful 服务默认不开启,大大降低漏洞风险。为安全起见,建议使用Drupal 的用户及时进行版本升级。


漏洞细节


1. 漏洞定位

漏洞通告指出了 Drupal 8 在开启了 RESTful Web Services 模块,同时允许了 PATCH / POST 方法请求后,可以造成代码执行漏洞。


根据 commit log(https://github.com/drupal/core/commit/24b3fae89eab2b3951f17f80a02e19d9a24750f5)可以定位到漏洞的触发原因在于反序列化的操作:




可以推测应该是在进行 REST API 操作的过程中,options 参数的内容带入到 unserialize 函数导致的。通过 diff 可以发现 LinkItem.php 和 MapItem.php 都受到影响,这里从 LinkItem 来向上挖掘漏洞点。


查看 core\modules\link\src\Plugin\Field\FieldType\LinkItem.php:



梳理了其整个调用链,从 REST 请求开始,先通过用户传入的 JSON 的 _links.type 获取了其对应的 Entity,再获取 Entity 内的 Fields 列表,遍历这个列表得到 key,从用户传入的 JSON 内取出 key,拼接成为 field_item:key 的形式(过程略),最终在 getDefinition 内查找了 definitions 数组内的字段定义,得到一个对应的 Field 的实例对象,过程大体如下:



接着 FieldNormalizer 的 denormalize 方法调用了 Field 的 setValue 方法。



也就是说,我们如果可以将 $field_item 控制为 LinkItem 或者 MapItem,即可触发反序列化。


2. 触发点构造
我们在 Drupal 后台配置好 RESTful Web Service 插件,选择一个可以进行 POST

的操作。为了尽可能模拟网站管理员的配置,我们这里允许对于/user/register的 POST操

作。于情于理,用户注册处必然可以作为匿名用户来进行操作。开启/user/register :



设置允许匿名用户利用 POST 来访问 /user/register 。



上文中提到,我们需要一个Entity内存在LinkItem Field。通过对于Entity的查找,定位到MenuLinkContent和Shortcut使用了LinkItem,利用Shortcut来进行进一步的测试。



Shortcut 的 _links.type 为 http://127.0.0.1/rest/type/shortcut/default,可以在单步的时候找到,过程不叙。向 /user/register 发送 POST 请求,同时在 PHPStorm 内将断点下在


ore\modules\hal\src\Normalizer\FieldItemNormalizer.php 的 denormalize 函数:



可以发现,在调用 setValue 方法的现场,$field_item为LinkItem。跟入setValue 方法,根据逻辑,如果$values为一个数组。且$values['options']存在,那么就执行反序列化操作。我们修改payload为即可触发反序列化。



攻击者利用此反序列化可以在服务器上执行任意代码。


修复建议


修复方案如下:

Drupal 8.6.x版本升级到8.6.10

Drupal 8.5.x或更早期版本版本升级到8.5.11版本

Drupal 7暂无更新

缓解措施如下:

禁用RESTful Web Services模块

配置服务器不允许POST/PATCH请求


参考链接

https://www.drupal.org/sa-core-2019-003