任你博利用Ruby on Rails中Active Storage的反序列化漏洞RCE_HUC惠仲娱乐

任你博

本文是翻译文章,原文地址:https://www.zerodayinitiative.com/blog/2019/6/20/remote-code-execution-via-ruby-on-rails-active-storage-insecure-deserialization

在趋势科技漏洞研究服务的漏洞报告中,趋势科技安全研究团队的Sivathmican Sivakumaran 和Pengsu Cheng详细介绍了Ruby on Rails中最近的代码执行漏洞。

该错误最初是由名为ooooooo_q的研究员发现和报告的,以下是他们的报告的一部分,涵盖CVE-2019-5420,只有一些很小的修改。


Ruby on RailsActiveStorage组件中被爆出一个不安全的反序列化漏洞。此漏洞的产生原因是,在HTTP URL中反序列化一个Ruby对象时使用了Marshal.load()却没有进行充分验证。

漏洞分析

Rails是一个用Ruby语言编写的开源Web应用程序模型视图控制器(MVC)框架。

Rails旨在鼓励软件工程模式和范例,例如约定优于配置(CoC)——也称为按约定编程,不重复自己(DRY)和活动记录模式。Rails作为以下单独组件发布:

Rais 5.2还附带了Active Storage,这是此漏洞感兴趣的组件,Active Storage用于存储文件,并且将这些文件与Active Record相关联。它与Amazon S3Google Cloud StorageMicrosoft Azure Storage等云存储服务兼容

Ruby支持将对象序列化为JSONYAMLMarshal序列化格式。

其中,Marshal序列化格式由Marshal类实现,可以分别通过load()dump()方法对对象进行序列化和反序列化。

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

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

Ruby on RailsActive Storage组件中存在一个不安全的反序列化漏洞,该组件用于ActiveSupport::MessageVerifier,确保上述:encoded_key:encoded_token变量的完整性。

在正常使用中,这些变量是由MessageVerifier.generate()它们生成的,它们的结构如下:

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

GETPUT请求发送到包含/rails/active_storage/disk/URI时,将提取:encoded_key:encoded_token变量。这些变量预期将由MessageVerifier.generate()生成,因此decode_verified_keydecode_verified_token调用MessageVerifier.verified()以检查其完整性并反序列化

完整性检查通过函数调用ActiveSupport::SecurityUtils.secure_compare(digest, generate_digest(data))来实现

由于通过使用MessageVerifier密钥对数据进行签名摘要。对于开发中的Rails应用程序,此密钥始终是应用程序名称,这是公知的。

对于生产中的Rails应用程序,密钥存储在一个credentials.yml.enc文件中,该文件使用master.key中的密钥加密。

可以通过CVE-2019-5418来获取这些文件的内容。一旦完整性检查通过,已经经过base64解码,并且结果字节流作为参数,调用Marshal.load(),无需进一步验证。

攻击者可以通过嵌入危险对象(例如ActiveSupport::Deprecation::DeprecatedInstanceVariableProxy,实现远程代码执行)来利用此条件。需要将CVE-2019-5418链接到CVE-2019-5420的使用场景,以确保满足所有条件从而实现代码执行。

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

源代码演练

以下代码片段截取自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中文件内容披露的bug,以及CVE-2019-5419,一个在行动视图中的拒绝服务的bug

如果您无法立即应用修补程序,则可以通过在开发模式下指定密钥来缓解此问题。

config/environments/development.rb文件中,添加以下内容:

config.secret_key_base = SecureRandom.hex(64)

唯一的另一个显著缓解是限制对受影响端口的访问。

结论

Rails版本6.0.0.X5.2.X中存在此错误。鉴于此漏洞的CVSS v3得分为9.8,Rails的用户务必尽快升级或应用缓解措施

威胁研究团队将在未来回归其他伟大的漏洞分析报告。在此之前,请关注ZDI 团队 ,获取最新的漏洞利用技术和安全补丁。