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