
Ruby on Rails リポジトリが CVE-2026-66066(KindaRails2Shell)に晒されているかどうかを監査する Agent Skill です。これは 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 |
libvips は操作を通じてフォーマットの読み書きを行いますが、そのうちいくつかは unfuzzed(信頼できないコンテンツに対して安全でない)とマークされています。Active Storage はこれらを無効化していなかったため、細工されたファイルをアップロードできる攻撃者がそれらに到達できる状態でした。
アプリケーションが影響を受けるのは、4 つの条件すべてが成立する場合のみです:
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 プラグインとしてインストールします:
/plugin marketplace add paveg/rails-activestorage-vips-audit
/plugin install rails-activestorage-vips-audit@paveg-skills
skills CLI を使用すると、同じスキルを 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 は指定されたアプリケーションルートを基準にすべてを解決します。
このスキルには2つのモードがあり、どちらも複数のアプリケーションパスを受け付けます。
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
これらのコマンドはエージェントではなく、あなたのためのエントリーポイントです。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
このスクリプトは事実を収集するものであり、意図的に判定ロジックを含んでいません。渡すのはアプリケーションルートであり、未分化のモノレポルートではありません。モノレポの場合は、それぞれ独自の Gemfile.lock と config/application.rb を持つデプロイ可能な Rails ディレクトリを個別の引数として渡してください。コレクターは、親の証拠ストリームからそれらネストされたアプリケーションルートを除外しつつ、マウントされたエンジンやパス依存関係である可能性のあるネストされた 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 と、André Baptista、Bruno Mendes、Castilho からなる Ethiack のチームによって独立に発見・報告され、その後 Rails メンテナーとの調整の下で公開されました。