在趋势科技漏洞研究服务的漏洞报告中,趋势科技安全研究团队的Sivathmican Sivakumaran 和Pengsu Cheng详细介绍了Ruby on Rails
中最近的代码执行漏洞。
该错误最初是由名为ooooooo_q的研究员发现和报告的,以下是他们的报告的一部分,涵盖CVE-2019-5420
,只有一些很小的修改。
Ruby on Rails
的ActiveStorage
组件中被爆出一个不安全的反序列化漏洞。此漏洞的产生原因是,在HTTP URL中反序列化一个Ruby对象时使用了Marshal.load()
却没有进行充分验证。
Rails
是一个用Ruby语言编写的开源Web应用程序模型视图控制器(MVC)框架。
Rails旨在鼓励软件工程模式和范例,例如约定优于配置(CoC)——也称为按约定编程,不重复自己(DRY)和活动记录模式。Rails作为以下单独组件发布:
Rais 5.2
还附带了Active Storage
,这是此漏洞感兴趣的组件,Active Storage
用于存储文件,并且将这些文件与Active Record
相关联。它与Amazon S3
,Google Cloud Storage
和Microsoft Azure Storage
等云存储服务兼容
Ruby
支持将对象序列化为JSON
,YAML
或Marshal
序列化格式。
其中,Marshal
序列化格式由Marshal
类实现,可以分别通过load()
和dump()
方法对对象进行序列化和反序列化。
如上所示,Marshal
序列化格式使用类型长度值表示来序列化对象。
默认情况下,Active Storage
会向Rails
应用程序添加一些路由。本报告感兴趣的是以下两条分别负责下载和上传文件的路由:
Ruby on Rails
的Active Storage
组件中存在一个不安全的反序列化漏洞,该组件用于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密钥对数据进行签名摘要。对于开发中的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.X
和5.2.X
中存在此错误。鉴于此漏洞的CVSS v3得分为9.8,Rails的用户务必尽快升级或应用缓解措施
威胁研究团队将在未来回归其他伟大的漏洞分析报告。在此之前,请关注ZDI 团队 ,获取最新的漏洞利用技术和安全补丁。