一个 Agent Skill,用于审计 Ruby on Rails 仓库是否暴露于 CVE-2026-66066(KindaRails2Shell)——即 Active Storage 的 libvips 变体处理漏洞,该漏洞允许任意文件读取,并且在 Rails 应用中可导致远程代码执行。
该 skill 是一个配置审计与修复辅助工具。它不包含任何漏洞利用代码,也不描述攻击链。
| CVE | CVE-2026-66066 |
| 严重程度 | 严重,CVSS 9.5 |
| 软件包 | activestorage(RubyGems) |
| 受影响 | < 7.2.3.2、>= 8.0 < 8.0.5.1、>= 8.1 < 8.1.3.1 |
| 已修复 | 7.2.3.2、8.0.5.1、8.1.3.1 |
| 安全公告 | GHSA-xr9x-r78c-5hrm |
libvips 通过操作来读写各种格式,其中一些操作被标记为 unfuzzed——即对不可信内容不安全。Active Storage 未禁用这些操作,因此能够上传精心构造文件的攻击者可以触达它们。
只有当全部四个条件同时成立时,应用才会暴露:
activestorage 处于受影响的版本范围内config.active_storage.variant_processor 解析为 :vips条件 3 是区分性条件。受影响范围 < 7.2.3.2 包含所有 Rails 6.x 版本,但 6.x 默认使用 :mini_magick,因此 6.x 仅在非默认配置下才会暴露,而 6.0 之前的版本根本没有 variant_processor 设置。Rails 7.0 及更高版本通过 config.load_defaults 7.0 默认使用 :vips,这就是常见配置会暴露的原因。Rails 8.1 还接受 :disabled,这会使条件 3 不成立。
作为 Claude Code 插件,通过本仓库中捆绑的 marketplace 安装:
/plugin marketplace add paveg/rails-activestorage-vips-audit
/plugin install rails-activestorage-vips-audit@paveg-skills
通过 skills CLI,可将同一技能安装到 Claude Code、Codex、Cursor、Copilot CLI 及其他 agent 中:
npx skills add paveg/rails-activestorage-vips-audit
或手动执行:
git clone https://github.com/paveg/rails-activestorage-vips-audit.git
cp -r rails-activestorage-vips-audit/skills/rails-activestorage-vips-audit ~/.claude/skills/
~/.agents/skills/ 可作为 Codex、Copilot CLI 和 Gemini CLI 的跨运行时位置。技能中没有任何内容依赖于其安装位置——不存在绝对路径,并且 collect-evidence.sh 会相对于它所指向的应用程序根目录解析所有内容。
该技能有两种模式,且两者都接受多个应用程序路径。
report <app>... # read-only audit, one verdict per application
fix <app>... # applies remediation on a branch; never commits or pushes unprompted
作为插件安装后,每个模式也是一个命令,因此无需将模式作为参数输入:
/rails-activestorage-vips-audit:report path/to/app another/app
/rails-activestorage-vips-audit:fix path/to/app
这些命令是供你使用的入口,而不是供 agent 使用的:它们被标记为如此,以便 Claude 永远不会自行触发它们。当请求与某个技能匹配时,Claude 仍会自行调用该技能,这就是为什么在没有人类请求的情况下 fix 无法启动。
report 是默认项。fix 首先需要针对同一应用程序的 report 结论,因为正确的修复方式取决于该结论——Rails 6.x、7.0.x 和 7.1.x 没有同系列补丁,因此在那里 fix 会应用临时缓解措施,并报告需要升级框架,而不是尝试升级。
证据收集也可以单独运行:
skills/rails-activestorage-vips-audit/scripts/collect-evidence.sh path/to/app another/app
该脚本只收集事实,刻意不包含任何判定逻辑。请传入应用根目录,而不是未加区分的 monorepo 根目录。对于 monorepo,请将每个可部署的 Rails 目录(各自拥有独立的 Gemfile.lock 和 config/application.rb)作为单独参数传入。收集器会将这些嵌套的应用根目录从父级的证据流中排除,同时保留可能是挂载引擎或路径依赖的嵌套 lockfile 根目录。
vips --version 验证。报告将这一点归入运行时就绪性和修复建议,而不是让暴露判定以此为前提条件。VIPS_BLOCK_UNTRUSTED 并不能证明部署环境设置了它。该技能将此类发现的上限设为“存在临时缓解措施,仍需升级”,绝不允许其产生干净的判定。升级到 7.2.3.2、8.0.5.1 或 8.1.3.1,与你的版本系列匹配。首先确认运行时 libvips >= 8.13 且 ruby-vips >= 2.2.1:在安装了 ruby-vips 的情况下,除非两者都满足,否则已修补的 Active Storage 会在启动期间抛出异常,而且该检查同样适用于 :mini_magick 应用。
临时缓解措施,两者都不能替代升级:
VIPS_BLOCK_UNTRUSTED 环境变量(libvips >= 8.13;无需更改 gem)Vips.block_untrusted(true)(ruby-vips >= 2.2.1,外加 libvips >= 8.13)在 ruby-vips < 2.2.1 上,初始化器方式会调用一个尚不存在的方法,因此请先升级该 gem,或采用不依赖它的环境变量方式。
如果应用曾暴露,请将应用进程可读取的每个密钥都视为已泄露并轮换:secret_key_base、主密钥、Active Storage 服务凭据、数据库凭据以及第三方令牌。
WAF 在这里不是缓解措施。它能否看到载荷取决于存储服务和上传方式,因此其有效性过于依赖配置,无法依赖。
该漏洞由 GMO Flatt Security 的 RyotaK 以及 Ethiack 的 André Baptista、Bruno Mendes 和 Castilho 组成的团队独立发现并报告,随后与 Rails 维护者协调披露。