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)能够定位到缝隙的触发原因在于反序列化的操作:


8827太阳集团(Macau)股份有限公司-Official website



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


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


8827太阳集团(Macau)股份有限公司-Official website


梳理了其整个挪用链,,,,,从 REST 要求起头,,,,,先通过用户传入的 JSON 的 _links.type 获取了其对应的 Entity,,,,,再获取 Entity 内的 Fields 列表,,,,,遍历这个列表得到 key,,,,,从用户传入的 JSON 内取出 key,,,,,拼接成为 field_item:key 的大局(过程略),,,,,最终在 getDefinition 内查找了 definitions 数组内的字段界说,,,,,得到一个对应的 Field 的事俘对象,,,,,过程大体如下:


8827太阳集团(Macau)股份有限公司-Official website


接着 FieldNormalizer 的 denormalize 步骤挪用了 Field 的 setValue 步骤 。。。 。。。 。


8827太阳集团(Macau)股份有限公司-Official website


也就是说,,,,,我们若是能够将 $field_item 节造为 LinkItem 或者 MapItem,,,,,即可触发反序列化 。。。 。。。 。


2. 触发点机关
我们在 Drupal 后盾配置好 RESTful Web Service 插件,,,,,选择一个能够进行 POST

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

作 。。。 。。。 。于情于理,,,,,用户注册处必然能够作为匿名用户来进行操作 。。。 。。。 �? ???? ??�/user/register :


8827太阳集团(Macau)股份有限公司-Official website


设置允许匿名用户利用 POST 来接见 /user/register 。。。 。。。 。


8827太阳集团(Macau)股份有限公司-Official website


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


8827太阳集团(Macau)股份有限公司-Official website


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


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


8827太阳集团(Macau)股份有限公司-Official website


能够发现,,,,,在挪用 setValue 步骤的现� 。。。 。。。 。�,,$field_item为LinkItem 。。。 。。。 。跟入setValue 步骤,,,,,凭据逻辑,,,,,若是$values为一个数组 。。。 。。。 。且$values['options']存在,,,,,那么就执行反序列化操作 。。。 。。。 。我们批改payload为即可触发反序列化 。。。 。。。 。


8827太阳集团(Macau)股份有限公司-Official website


攻击者利用此反序列化能够在服务器上执行肆意代码 。。。 。。。 。


建复建议


建复规划如下:

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