paveg/rails-activestorage-vips-audit

GitHub: paveg/rails-activestorage-vips-audit

用于审计 Rails 代码库是否存在 CVE-2026-66066 Active Storage libvips 漏洞的 Agent Skill,支持只读报告和自动修复两种模式。

Stars: 0 | Forks: 0

# rails-activestorage-vips-audit 审计 一个 [Agent Skill](https://agentskills.io/specification),用于审计 Ruby on Rails 代码库是否存在 **CVE-2026-66066** (_KindaRails2Shell_) 漏洞 —— 这是一个 Active Storage 的 libvips 变体处理漏洞,允许任意文件读取,并且在 Rails 应用程序中会导致远程代码执行。 该技能是一个配置审计和修复辅助工具。它不包含任何漏洞利用代码,也不描述攻击链。 ## 漏洞详情 | | | | :------- | :-------------------------------------------------------------------------------------------- | | CVE | CVE-2026-66066 | | 严重性 | Critical, 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](https://github.com/rails/rails/security/advisories/GHSA-xr9x-r78c-5hrm) | libvips 通过操作来读取和写入格式,其中一些它被标记为 _unfuzzed_ —— 对于不受信任的内容是不安全的。Active Storage 没有禁用它们,因此能够上传恶意文件的攻击者就可以触发它们。 一个代码库只有在满足以下**全部四个**条件时才会受到威胁: 1. `activestorage` 处于受影响的版本范围内 2. 启用了 Active Storage 3. `config.active_storage.variant_processor` 解析为 `:vips` 4. 应用程序接受不受信任的用户的上传 条件 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`,这就是为什么常见的配置会受到影响。 ## 安装说明 作为 Claude Code 插件,通过本代码库中捆绑的插件市场安装: ``` /plugin marketplace add paveg/rails-activestorage-vips-audit /plugin install rails-activestorage-vips-audit@paveg-skills ``` 使用 [skills CLI](https://github.com/vercel-labs/skills),它会将相同的技能安装到 Claude Code、Codex、Cursor、Copilot CLI 和其他代理中: ``` 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 ... # read-only audit, one verdict per repository fix ... # applies remediation on a branch; never commits or pushes unprompted ``` `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 ``` 该脚本用于收集事实,并且刻意不包含任何判定逻辑。 ## 它不会告诉你的事情 - **运行时的 libvips 版本。** 这无法从代码库中得知,而且这很重要:在 libvips 8.13 以下,不安全的操作根本无法被禁用,因此仅仅升级 `activestorage` 无法解除应用程序受到的威胁。请在应用程序运行的位置使用 `vips --version` 进行确认。正因为如此,对于使用 `:vips` 的应用程序,其明确的判定结果总是被报告为“有条件的安全”,而不是“安全”。 - **缓解措施是否已生效。** Dockerfile 中的 `VIPS_BLOCK_UNTRUSTED` 并不能证明部署环境也设置了它。该技能最多只会将这些发现标记为“存在临时缓解措施,但仍需升级”,绝不允许仅凭这一点就得出完全无风险的判定。 ## 修复摘要 升级到与您的系列相匹配的 `7.2.3.2`、`8.0.5.1` 或 `8.1.3.1`,并确认运行时的 libvips 版本为 `>= 8.13`。 临时缓解措施(两者都不能替代升级): - 设置 `VIPS_BLOCK_UNTRUSTED` 环境变量(libvips `>= 8.13`) - 在初始化程序中调用 `Vips.block_untrusted(true)`(`ruby-vips >= 2.2.1`) 如果应用程序曾受到威胁,请将应用程序进程可读取的每个密钥都视为已泄露并进行轮换:`secret_key_base`、master key、Active Storage 服务凭证、数据库凭证以及第三方 token。 在这里,WAF 并不能作为一种缓解措施。它是否能看到 payload 取决于存储服务和上传方式,因此其有效性过于依赖配置,无法作为可靠的防范手段。 ## 免责声明 - 仅在您拥有或被明确授权审计的代码库上使用此技能。 - 判定结果属于尽力而为的静态分析。NOT AFFECTED(未受影响)的判定并不能证明没有暴露:代码库审计无法看到代码库外部的证据(运行时的 libvips、部署的环境变量、其他服务中的代码),这就是为什么对 `:vips` 应用程序的明确判定结果总是被报告为“有条件的安全”。 - 该技能不包含任何漏洞利用代码,也不会重构攻击链,无论请求是如何构造的。 - 在 [MIT License](LICENSE) 下提供,不提供任何形式的担保。根据报告采取的行动 —— 升级、缓解措施、密钥轮换 —— 仍由操作者自行负责。 ## 来源 - [Rails 安全通告 GHSA-xr9x-r78c-5hrm](https://github.com/rails/rails/security/advisories/GHSA-xr9x-r78c-5hrm) - [Ethiack — KindaRails2Shell: Rails RCE (CVE-2026-66066)](https://ethiack.com/info-hub/research/kindarails2shell-rails-rce-cve-2026-66066) - [Rails 指南 — 配置 Rails 应用程序](https://guides.rubyonrails.org/configuring.html) 该漏洞由 GMO Flatt Security 的 [RyotaK](https://x.com/ryotkak) 以及来自 Ethiack 的团队(成员包括 André Baptista、Bruno Mendes 和 Castilho)分别独立发现并报告,随后与 Rails 维护人员协调进行了披露。
标签:Cutter, CVE排查, Ruby on Rails, 内存转储, 安全合规, 网络代理