利用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等云存储服务集成。它默认添加了以下两条重要路由:

  1. 文件下载路由:/rails/active_storage/disk/:encoded_key/*filename
  2. 文件上传路由:/rails/active_storage/disk/:encoded_token

漏洞根源

漏洞存在于Active Storage的磁盘控制器(ActiveStorage::DiskController)中,具体问题如下:

  1. 不安全的反序列化:控制器在处理请求时,使用Marshal.load()对用户提供的:encoded_key:encoded_token参数进行反序列化
  2. 签名验证可绕过:虽然使用了ActiveSupport::MessageVerifier进行签名验证,但在开发模式下密钥通常是已知的应用程序名称
  3. 缺乏输入验证:反序列化前没有对数据内容进行充分验证

技术细节

  1. 序列化机制

    • Ruby支持多种序列化格式(JSON, YAML, Marshal)
    • Marshal格式通过Marshal.dump()Marshal.load()实现序列化/反序列化
    • Marshal格式使用类型-长度-值(TLV)表示法
  2. 验证流程缺陷

    # activestorage/app/controllers/active_storage/disk_controller.rb
    def decode_verified_key
      ActiveSupport::MessageVerifier.new(...).verify(encoded_key)
      # 最终会调用Marshal.load()反序列化数据
    end
    
  3. 签名密钥问题

    • 开发模式:密钥为应用程序名称(通常已知)
    • 生产模式:密钥存储在credentials.yml.enc中(可通过CVE-2019-5418获取)

漏洞利用

利用条件

  1. 获取应用程序签名密钥:

    • 开发模式:默认为应用程序名称
    • 生产模式:需要结合CVE-2019-5418获取
  2. 构造恶意序列化对象:

    • 使用ActiveSupport::Deprecation::DeprecatedInstanceVariableProxy等危险对象

利用方法

  1. Metasploit模块

    • 已有公开的Metasploit模块可自动化利用此漏洞
  2. 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}")
    
  3. 完整利用步骤

    • 确定目标Rails应用程序名称(开发模式密钥)
    • 生成包含恶意Ruby对象的Marshal序列化数据
    • 使用应用程序密钥对数据进行签名
    • 构造特制的HTTP请求发送到Active Storage端点

漏洞修复

官方补丁

  • 该漏洞已在2019年3月发布的补丁中修复
  • 建议升级到以下版本:
    • Rails 5.2.2.1
    • Rails 6.0.0.rc1

临时缓解措施

  1. 修改开发模式密钥
    config/environments/development.rb中添加:

    config.secret_key_base = SecureRandom.hex(64)
    
  2. 网络层防护

    • 限制对Active Storage端口的访问
    • 使用WAF过滤可疑请求
  3. 禁用不必要的功能

    • 如不使用Active Storage,可完全禁用该组件

漏洞影响评估

  • CVSS v3评分:9.8 (Critical)
  • 影响范围:所有使用受影响Rails版本且启用了Active Storage的应用程序
  • 攻击复杂度:低(开发模式)/中(生产模式)
  • 用户交互:不需要

防御建议

  1. 及时更新

    • 立即升级到已修复的Rails版本
  2. 安全配置

    • 生产环境使用强密钥并妥善保管master.key
    • 避免在开发环境中使用默认配置
  3. 输入验证

    • 对所有用户提供的数据进行严格验证
    • 避免使用不安全的反序列化方法
  4. 监控与日志

    • 监控对Active Storage端点的异常访问
    • 记录并分析可疑请求

总结

CVE-2019-5420是一个严重的反序列化漏洞,允许攻击者在Rails应用程序上执行任意代码。通过深入理解其原理和利用方式,开发人员和安全团队可以更好地防御此类漏洞。最重要的是保持框架和组件的及时更新,并遵循安全开发最佳实践。

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)表示法 验证流程缺陷 : 签名密钥问题 : 开发模式:密钥为应用程序名称(通常已知) 生产模式:密钥存储在 credentials.yml.enc 中(可通过CVE-2019-5418获取) 漏洞利用 利用条件 获取应用程序签名密钥: 开发模式:默认为应用程序名称 生产模式:需要结合CVE-2019-5418获取 构造恶意序列化对象: 使用 ActiveSupport::Deprecation::DeprecatedInstanceVariableProxy 等危险对象 利用方法 Metasploit模块 : 已有公开的Metasploit模块可自动化利用此漏洞 Python PoC示例 : 完整利用步骤 : 确定目标Rails应用程序名称(开发模式密钥) 生成包含恶意Ruby对象的Marshal序列化数据 使用应用程序密钥对数据进行签名 构造特制的HTTP请求发送到Active Storage端点 漏洞修复 官方补丁 该漏洞已在2019年3月发布的补丁中修复 建议升级到以下版本: Rails 5.2.2.1 Rails 6.0.0.rc1 临时缓解措施 修改开发模式密钥 : 在 config/environments/development.rb 中添加: 网络层防护 : 限制对Active Storage端口的访问 使用WAF过滤可疑请求 禁用不必要的功能 : 如不使用Active Storage,可完全禁用该组件 漏洞影响评估 CVSS v3评分:9.8 (Critical) 影响范围:所有使用受影响Rails版本且启用了Active Storage的应用程序 攻击复杂度:低(开发模式)/中(生产模式) 用户交互:不需要 防御建议 及时更新 : 立即升级到已修复的Rails版本 安全配置 : 生产环境使用强密钥并妥善保管 master.key 避免在开发环境中使用默认配置 输入验证 : 对所有用户提供的数据进行严格验证 避免使用不安全的反序列化方法 监控与日志 : 监控对Active Storage端点的异常访问 记录并分析可疑请求 总结 CVE-2019-5420是一个严重的反序列化漏洞,允许攻击者在Rails应用程序上执行任意代码。通过深入理解其原理和利用方式,开发人员和安全团队可以更好地防御此类漏洞。最重要的是保持框架和组件的及时更新,并遵循安全开发最佳实践。