rails/rails-forensics-CVE-2026-66066

GitHub: rails/rails-forensics-CVE-2026-66066

针对 Rails Active Storage 与 libvips 任意文件读取漏洞 CVE-2026-66066 的取证调查工具,帮助团队判定暴露窗口期并检测是否已被实际利用。

Stars: 2 | Forks: 0

# rails-forensics-CVE_2026-66066 用于回答关于 Rails 应用程序和 CVE-2026-66066(即被称为 KindaRails2Shell 的 Active Storage 和 libvips 任意文件读取漏洞)的两个问题的工具和方法: 1. **我是否存在漏洞,以及存在了多长时间?** 2. **我是否被利用了,如果是,什么数据被窃取了?** 安全通告解释了该漏洞并指出了已修复的版本。但它并没有告诉你如何查明是否有人利用它攻击了你。这个问题决定了是否必须轮换 `secret_key_base` 及其签名的所有内容,而且它比看起来要困难得多。证据散布在你的对象存储和三个 Active Storage 表中,应用程序日志的过期时间远早于暴露窗口期,而对未附加 blob 的定时清理,恰恰会销毁决定答案的关键记录。 **如果你打算提问,请尽快。** 上述的每一项都是已经倒计时的时钟。 这是一个文档和技能仓库,而不是一个代码库。这里的内容都不会安装到你的应用程序中。代理(Agent)会读取它,并在你在其他地方检出的应用程序上运行,而唯一在生产环境中运行的脚本是一个独立的文件,你可以将其复制到容器中。 ## 一段话解释该漏洞 Rails 通过读取 `content_type` 列来决定是否可以对 blob 进行图像处理,而直接上传(direct upload)允许客户端设置该列,且期间根本不会检查文件字节。然后,libvips 通过嗅探魔术字节(magic bytes)来决定文件的实际类型。前十个字节声明为 `MATLAB 5.0` 的文件会被路由到 libvips 的 MATLAB 加载器,后者将其交给 libmatio,libmatio会根据一个*不同*的字节范围进行分发,并发现 MAT 7.3,也就是 HDF5。HDF5 的外部文件列表(External File List)允许数据集的字节驻留在另一个由路径和偏移量指定的文件中。因此,渲染该“图像”会读取服务器上由攻击者指定的文件,并将其内容作为像素返回。两次相同的混淆,发生在两个无法看到彼此字段的不同层。 `reference/the-attack.md` 追踪了整个调用链,从入站请求到 libmatio 打开目标文件的那一刻,并标记了四个关键节点。接着,`reference/the-investigation.md` 解释了为什么该攻击是可调查的:它会留下三个强度递增的痕迹,其中最强的是渲染后的变体(variant),它将窃取的字节作为像素值保存在你自己的对象存储中。 ## 从这里开始 这两个技能按顺序运行。第一个产生暴露窗口期;如果没有它,第二个就无法开始。 | 技能 | 问题 | 产出 | |---|---|---| | [`kr2s-was-i-vulnerable`](skills/kr2s-was-i-vulnerable/) | 此应用程序是否曾处于暴露状态? | 一个暴露窗口期以及排查所需的事实 | | [`kr2s-was-i-exploited`](skills/kr2s-was-i-exploited/) | 是否有人利用了它,他们得到了什么? | 一份书面的取证分析 | 两者都是为代理编写的,并且对于想要手动完成工作的人来说也是可读的。每个技能都有一个 `SKILL.md` 入口点和一个包含实际流程、其评估检查及其失败模式的 `references/guide.md`。 如果你已经打补丁并且想知道是否应该关注,请运行第一个。它的交付物是一个时间窗口,而不是简单的“是”或“否”,因为对于大多数阅读本文的人来说,现在时的答案是“不,我们打补丁了”,而真正有用的答案是调查需要涵盖哪些年份。 ### 将它们引入你的代理 克隆此仓库并保留该克隆。这两个技能共享 `reference/` 中的参考文档,并且它们的指南通过相对于仓库的路径读取这些文档,因此单独复制到某处的技能目录将无法正常工作。 最简单的方法是在克隆的目录中启动你的代理,并告诉它你的应用程序在哪里。`AGENTS.md` 会从那里为它指明方向,包括人们容易弄错的部分:即此仓库是工具,而不是调查对象。 否则,直接指向该文件并说明即可,这在任何可以读取本地文件的代理中都适用: ``` Read /path/to/rails-forensics-CVE-2026-66066/skills/kr2s-was-i-vulnerable/SKILL.md and follow it. My application is at /path/to/my-app. ``` 在 Claude Code 中,你可以转而安装它们,以便它们自动触发,这是通过创建符号链接而不是复制来实现的,从而保持它们始终指向该克隆: ``` ln -s "$PWD/skills/kr2s-was-i-vulnerable" ~/.claude/skills/ ln -s "$PWD/skills/kr2s-was-i-exploited" ~/.claude/skills/ ``` 如果你想把它们限定在单个应用程序中,请使用项目内的 `.claude/skills/` 而不是 `~/.claude/skills/`。 无论哪种方式,都要告诉代理你的应用程序在哪里。这些技能明确指出,此仓库和被调查的应用程序是两个不同的根目录,并且它们可以读取后者,但绝不能向其写入。 ## 包含的内容 ``` AGENTS.md orientation for an agent started in this directory reference/the-attack.md how the vulnerability works, traced call by call reference/the-investigation.md why an investigation is possible, and where it runs out skills/ the two skills RUNBOOK.md operator's guide to the scanner: flags, verdicts, resuming lib/crafted_mat_file.rb the detector bin/ the scanner and three analysis utilities test/ the test suite ``` 这两份参考文档是本仓库中纯英文说明的部分,并且它们可以独立存在。如果你想了解问题本身,请阅读它们;如果你想获得关于特定应用程序的答案,请运行这些技能。 `bin/kr2s_scan_active_storage_blobs.rb` 是通过 `rake build` 从 `lib/` 生成的,并已提交,因此将其在生产环境中运行不需要构建步骤,也不需要第二个文件。 ### 检测器 `lib/crafted_mat_file.rb` 用于识别此攻击所需的特制文件。它从对象的前 128 个字节中读取两个头部字段,并且不需要其他任何内容,这就是为什么扫描程序可以通过范围读取(ranged read)来对候选文件进行分类,而不是将其全部下载下来。`reference/the-attack.md` 解释了具体是哪些字段,以及为什么合法的生成器不会产生这种组合。 ### 不提供 payload 生成器 本仓库故意不提供任何用于构建特制文件的代码,也不包含特制文件。检测器的测试使用纯 Ruby 合成了它所需的 128 个字节的头部,这也是检测器所读取的全部内容。`reference/the-attack.md` 完整地描述了其结构,因此对于试图了解该攻击的读者来说,没有任何信息被隐瞒。被隐瞒的是一个可以通过更改一个参数就能针对任意路径重新定向的可用生成器。 ## 范围 **涵盖:** 在使用 `:vips` 变体处理器、且跟踪了变体记录的应用程序上使用 Active Storage 的情况。 **不涵盖:** 应用程序将用户提供的文件交给 libvips 的任何其他地方。其他上传库、直接对象存储客户端以及定制的头像或徽标系统都需要各自的排查,这里的扫描器无法做到。`kr2s-was-i-vulnerable` 会让你枚举它们,以便在结论中明确指出它们,而不是被默默忽略。 此工具得出的干净结果是强有力的证据,而非绝对的证明。这两个技能都反复且具体地说明了这一点,并且分析模板中包含一个不可选的限制部分。 ## 来源 这是在 37signals 进行的一次真实调查中产生的,对大型生产环境 Active Storage 存储进行了全面排查,覆盖了漏洞存在的整个时期。该工具正确识别了报告该漏洞的安全研究人员上传的测试文件,这是目前唯一可用的外部证据,证明该检测器能够找到它应该找到的内容。 `kr2s-was-i-exploited/references/analysis-template.md` 中的分析示例是虚构的。它是以真实的分析为原型,但其中的每个标识符、地址和日期都是捏造的。 ## 参考 - [GHSA-xr9x-r78c-5hrm](https://github.com/rails/rails/security/advisories/GHSA-xr9x-r78c-5hrm),Rails 安全通告 - [CVE-2026-66066](https://nvd.nist.gov/vuln/detail/CVE-2026-66066) - [Ethiack 的分析文章](https://ethiack.com/info-hub/research/kindarails2shell-rails-rce-cve) - [RyotaK 的分析文章](https://blog.flatt.tech/entry/kindarails2shell_rails) 请从安全通告中获取已修复的 Rails 版本号,而不是从本文档中的任何内容中获取。 ## 开发 ``` mise exec -- rake # build and test ``` ## 许可证 MIT。请参阅 [LICENSE](LICENSE)。
标签:Rails, 任意文件读取, 库, 应急响应, 数字取证, 漏洞分析, 自动化脚本, 路径探测, 防御绕过