首页
社区
课程
招聘
[原创]Drupal SA-CORE-2019-003 远程命令执行分析
发表于: 2019-2-22 10:22 12544

[原创]Drupal SA-CORE-2019-003 远程命令执行分析

2019-2-22 10:22
12544

0. 漏洞背景


2 月 20 日 Drupal 官方披露了一个 Drupal 的远程命令执行漏洞:0d7K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2V1M7Y4g2H3j5h3I4Q4x3X3g2G2M7X3N6Q4x3V1k6K6j5g2)9J5k6r3y4G2M7X3g2Q4x3X3b7J5x3o6p5&6i4K6u0V1x3o6l9K6i4@1g2r3i4@1u0o6i4K6S2o6漏洞的触发条件为开启了 RESTful Web Services,且允许 POST / PATCH 请求。

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

腾讯云不受该漏洞影响,此漏洞爆发后,腾讯云安全团队第一时间进行跟踪分析,且对云上客户进行预警通知。

1. 漏洞定位


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

根据 commit log ( 0b5K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6V1M7Y4g2H3j5h3I4Q4x3V1k6U0L8%4u0W2i4K6u0r3j5$3!0E0L8h3W2@1i4K6u0r3x3U0c8T1x3$3k6S2k6e0R3&6k6h3q4T1x3X3t1K6z5e0f1I4k6U0p5%4k6U0R3H3j5e0l9J5k6e0p5&6k6o6W2S2x3U0b7%4y4e0m8X3y4b7`.`. )可以定位到漏洞的触发原因在于反序列化的操作:


可以推测应该是在进行 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 为:60bK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8U0p5J5y4#2)9J5k6e0m8Q4x3X3f1H3i4K6u0W2x3g2)9J5c8Y4u0W2M7%4c8Q4x3V1k6@1P5i4m8W2i4K6u0r3M7$3S2G2M7Y4c8U0N6i4c8Q4x3V1k6V1k6h3k6S2N6h3I4@1i4K6t1$3L8X3u0K6M7q4)9K6b7W2!0q4x3#2)9^5x3q4)9^5x3R3`.`.向 /user/register 发送 POST 请求,同时在 PHPStorm 内将断点下在core\modules\hal\src\Normalizer\FieldItemNormalizer.php 的 denormalize 函数:


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

验证视频:

攻击者利用此反序列化可以在服务器上执行任意代码,利用此漏洞在服务器上弹出计算器的视频如下:


3. 安全建议

修复方案如下:

1. Drupal 8.6.x 版本升级到 8.6.10 版本

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

3. Drupal 7 暂无更新

缓解措施如下:

1. 禁用 RESTful Web Services 模块

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



本文作者:Rico @腾讯安全云鼎实验室

腾讯安全云鼎实验室 关注云主机与云内流量的安全研究和安全运营。利用机器学习与大数据技术实时监控并分析各类风险信息,帮助客户抵御高级可持续攻击;联合腾讯所有安全实验室进行安全漏洞的研究,确保云计算平台整体的安全性。相关能力通过腾讯云开放出来,为用户提供黑客入侵检测和漏洞风险预警等服务,帮助企业解决服务器安全问题。


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 42935
活跃值: (65742)
能力值: (RANK:135 )
在线值:
发帖
回帖
粉丝
2
感谢分享~
2019-2-22 10:58
0
雪    币: 351
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢分享
2019-2-22 13:05
0
游客
登录 | 注册 方可回帖
返回