利用Ruby on Rails中Active Storage的反序列化漏洞RCE
字数 1896 2025-08-27 12:33:30
Ruby on Rails Active Storage 反序列化漏洞 (CVE-2019-5420) 深入分析与利用指南
漏洞概述
本漏洞是Ruby on Rails框架中Active Storage组件的一个高危远程代码执行(RCE)漏洞,编号为CVE-2019-5420。该漏洞源于Active Storage在处理磁盘服务请求时对用户提供的数据进行了不安全的反序列化操作,结合已知的应用程序密钥,攻击者可构造恶意序列化数据实现任意代码执行。
受影响版本
- Ruby on Rails 5.2.x系列
- Ruby on Rails 6.0.0.x系列
漏洞原理分析
Active Storage组件简介
Active Storage是Rails框架中用于管理文件上传和存储的组件,支持与Amazon S3、Google Cloud Storage等云存储服务集成。它默认添加了以下两条重要路由:
- 文件下载路由:
/rails/active_storage/disk/:encoded_key/*filename - 文件上传路由:
/rails/active_storage/disk/:encoded_token
漏洞根源
漏洞存在于Active Storage的磁盘控制器(ActiveStorage::DiskController)中,具体问题如下:
- 不安全的反序列化:控制器在处理请求时,使用
Marshal.load()对用户提供的:encoded_key和:encoded_token参数进行反序列化 - 签名验证可绕过:虽然使用了
ActiveSupport::MessageVerifier进行签名验证,但在开发模式下密钥通常是已知的应用程序名称 - 缺乏输入验证:反序列化前没有对数据内容进行充分验证
技术细节
-
序列化机制:
- Ruby支持多种序列化格式(JSON, YAML, Marshal)
- Marshal格式通过
Marshal.dump()和Marshal.load()实现序列化/反序列化 - Marshal格式使用类型-长度-值(TLV)表示法
-
验证流程缺陷:
# activestorage/app/controllers/active_storage/disk_controller.rb def decode_verified_key ActiveSupport::MessageVerifier.new(...).verify(encoded_key) # 最终会调用Marshal.load()反序列化数据 end -
签名密钥问题:
- 开发模式:密钥为应用程序名称(通常已知)
- 生产模式:密钥存储在
credentials.yml.enc中(可通过CVE-2019-5418获取)
漏洞利用
利用条件
-
获取应用程序签名密钥:
- 开发模式:默认为应用程序名称
- 生产模式:需要结合CVE-2019-5418获取
-
构造恶意序列化对象:
- 使用
ActiveSupport::Deprecation::DeprecatedInstanceVariableProxy等危险对象
- 使用
利用方法
-
Metasploit模块:
- 已有公开的Metasploit模块可自动化利用此漏洞
-
Python PoC示例:
# 示例PoC代码结构 import requests import base64 import marshal # 1. 构造恶意序列化对象 payload = generate_malicious_object() # 2. 使用已知密钥签名 signed_payload = sign_with_app_key(payload) # 3. 发送恶意请求 requests.get(f"http://target/rails/active_storage/disk/{signed_payload}") -
完整利用步骤:
- 确定目标Rails应用程序名称(开发模式密钥)
- 生成包含恶意Ruby对象的Marshal序列化数据
- 使用应用程序密钥对数据进行签名
- 构造特制的HTTP请求发送到Active Storage端点
漏洞修复
官方补丁
- 该漏洞已在2019年3月发布的补丁中修复
- 建议升级到以下版本:
- Rails 5.2.2.1
- Rails 6.0.0.rc1
临时缓解措施
-
修改开发模式密钥:
在config/environments/development.rb中添加:config.secret_key_base = SecureRandom.hex(64) -
网络层防护:
- 限制对Active Storage端口的访问
- 使用WAF过滤可疑请求
-
禁用不必要的功能:
- 如不使用Active Storage,可完全禁用该组件
漏洞影响评估
- CVSS v3评分:9.8 (Critical)
- 影响范围:所有使用受影响Rails版本且启用了Active Storage的应用程序
- 攻击复杂度:低(开发模式)/中(生产模式)
- 用户交互:不需要
防御建议
-
及时更新:
- 立即升级到已修复的Rails版本
-
安全配置:
- 生产环境使用强密钥并妥善保管
master.key - 避免在开发环境中使用默认配置
- 生产环境使用强密钥并妥善保管
-
输入验证:
- 对所有用户提供的数据进行严格验证
- 避免使用不安全的反序列化方法
-
监控与日志:
- 监控对Active Storage端点的异常访问
- 记录并分析可疑请求
总结
CVE-2019-5420是一个严重的反序列化漏洞,允许攻击者在Rails应用程序上执行任意代码。通过深入理解其原理和利用方式,开发人员和安全团队可以更好地防御此类漏洞。最重要的是保持框架和组件的及时更新,并遵循安全开发最佳实践。