RUBY ON RAILS的ACTIVE STORAGE 反序列化命令执行漏洞

Track-SSG   ·   发表于 2019-06-27 11:00:53   ·   漏洞文章

在趋势微漏洞研究的漏洞报告中,趋势科技安全研究团队的Sivathmican Sivakumaran和 Pengsu Cheng详细介绍了 Ruby on Rails 中最近的代码执行漏洞。该Bug最初是由被称为ooooo_q的研究人员发现和报告的。以下是他们涵盖 CVE-2019-5420 的一部分,稍作修改。

在 Rails 上的 Ruby ActiveStorage组件中报告了不安全的反序列化漏洞。此漏洞是由于使用Marshal.load()在未进行充分验证的情况下对 HTTP URL 中的 Ruby 对象进行反序列化造成的。

漏洞

Rails 是一个开源 Web 应用程序模型视图控制器 (MVC) 框架,用 Ruby 语言编写。Rails 旨在鼓励软件工程模式和范例,如配置约定 (CoC),不要重复自己 (DRY) 和活动记录模式。作为Rails以下组件单独发布:


Rails 5.2 也附带 Active Storage,这是此漏洞感兴趣的组成部分。Active Storage,用于存储文件并将这些文件与活动记录相关联。它与云存储服务(如 Amazon S3、Google 云存储和 Microsoft Azure 存储)兼容。

Ruby 支持将对象序列化为 JSON、YAML 或Marshal序列化格式。Marshal序列化格式由Marshal 类实现。对象可以通过load()和dump()方法分别进行序列化和反序列化。


如上所述,Marshal序列化格式使用类型长度值表示序列化对象。

默认情况下,Active Storage会向 Rails 应用程序添加一些路由。本报告感兴趣的是以下两个路由,分别负责下载和上传文件:


在 Rails 上的 Ruby ActiveStorage 组件中存在不安全的反序列化漏洞。此组件使用 ActiveSupport::MessageVerifier来确保上述  :encoded_key 和 :encoded_token变量的完整性。在正常使用中,这些变量由 MessageVerifier.generate()生成,其结构如下:


<base64-message>包含以下 JSON 对象的 base64 编码版本:


当 GET 或 PUT 请求发送到包含"/rails/active_storage/disk/"的 URI 时,:encoded_key和:encoded_token变量被提取。这些变量由MessageVerifier.generate()生成,因此 decode_verified_key和decode_verified_token调用 MessageVerifier.verified() 检查反序列化的完整性。通过以下调用检查完整性

 ActiveSupport::SecurityUtils.secure_compare(digest,generate_digest(data))

通过使用MessageVerifier secure对数据进行签名来生成摘要。对于开发中的 Rails 应用程序,此secure始终是公开已知的应用程序名称。对于生产环境中的 Rails 应用程序,secret存储在credentials.yml.enc 文件中,该文件使用 master.key中的密钥进行加密。

这些文件的内容可以使用CVE-2019-5418公开。一旦完整性检查通过后,base64 被解码,并且在生成的字节流上调用Marshal.load(),无需任何进一步验证。攻击者可以通过嵌入危险对象(如 ActiveSupport::Deprecation::DeprecatedInstanceVariableProxy )来利用此条件来实现远程代码执行。CVE-2019-5418 需要结合 CVE-2019-5420,以确保满足实现代码执行的所有条件。

远程未经身份验证的攻击者可以通过发送精心构造的 HTTP 请求来利用此漏洞,将恶意序列化对象嵌入到易受攻击的应用程序。成功利用将导致在受影响的 Ruby rails 应用程序的安全上下文中任意执行代码。

Source Code Walkthrough  

以下代码段取自 Rails 版本 5.2.1。趋势科技添加的注释已突出显示。

从activesupport/lib/active_support/message_verifier.rb:


从activestorage/app/controllers/active_storage/disk_controller.rb:


漏洞利用

有一个公开可用的metasploit 模块利用此漏洞。也可以使用以下独立 Python 代码。使用方法:

python poc.py <host> [<port>]


请注意,我们的 Python PoC 假定应用程序名称为"Demo::Application"。

补丁

2019 年 3 月供应商发布此漏洞补丁。除了此 Bug 之外,该补丁还提供了 CVE-2019-5418(文件内容泄露错误)和 CVE-2019-5419(操作视图中的拒绝服务 Bug)的修补程序。

如果无法立即更新补丁,可以通过在开发模式下指定密钥来缓解此问题。在配置config/environments/development.rb文件中,添加以下内容:

 config.secret_key_ba se =SecureRandom.hex(64)

其他缓解措施为限制对受影响端口的访问。

结论

此 Bug 存在于 Rails 的 6.0.0.X 和 5.2.X 版本中。鉴于此漏洞的 CVSs v3 评分为 9.8,Rails 的用户应该尽快升级或实施防范方法。

特别感谢趋势科技安全研究团队的Sivathmican Sivakumaran和 Pengsu Cheng对这一漏洞进行了如此透彻的分析。有关趋势科技安全研究服务的概述,请访问http://go.trendmicro.com/tis/。

威胁研究小组将在带来更多的其他重大漏洞分析报告。在此之前,请关注ZDI 团队了解最新的漏洞利用技术和安全修补程序。

 

本文转载自白帽汇

打赏我,让我更有动力~

0 条回复   |  直到 2019-6-27 | 1420 次浏览
登录后才可发表内容
返回顶部 投诉反馈

© 2016 - 2024 掌控者 All Rights Reserved.