在趋势微漏洞研究的漏洞报告中,趋势科技安全研究团队的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 团队了解最新的漏洞利用技术和安全修补程序。
本文由白帽汇整理并翻译,不代表白帽汇任何观点和立场