RailsのActive Storageの脆弱性CVE-2026-66066

カテゴリ
脆弱性の悪用
タグ
国外
目次
  1. 脆弱性の内容
    1. 攻撃の仕組み
    2. 詳細の公開の時期
  2. 時系列
  3. 対象の製品と版
  4. 悪用の状況
  5. 修正と回避策
    1. 修正後に残る経路
    2. 侵害の調査とその後の対策
  6. 未公表の事項
  7. 注
  8. 出典
  9. 更新記録

Railsの2026年7月29日のアドバイザリによると、Ruby on RailsのActive Storageはlibvipsの一部の操作を無効にしておらず、既定の構成で画像のvariantを表示するアプリでは、認証の無い攻撃者がサーバー上の任意のファイルを読み取れる可能性がある⁠[1]。The Hacker Newsは9月1日、VulnCheckがこの脆弱性の悪用を検知したと報じた⁠[16]。

脆弱性の内容

Railsはアドバイザリで、libvipsが一部の操作に「unfuzzed」(未信頼の内容には安全でない)の印を付けていると説明した⁠[1]。Active Storageはこの操作を無効にしておらず、細工したファイルをアップロードしてvariantを生成させた攻撃者が、その操作を呼び出せる可能性がある⁠[1]。読み取られるプロセスの環境は通常secret_key_baseを含み、外部システムの認証情報を含むことも多いため、リモートコード実行や外部システムへの横展開に至りうる⁠[1]。報告された攻撃の連鎖は1つだが、Railsはそれが唯一とは考えていないとした⁠[1]。

表1:脆弱性の識別と評価
項目値資料
CVECVE-2026-66066⁠[1]
通称KindaRails2Shell(Ethiackの命名)⁠[9]
CVSS9.5(CVSS v4.0、CRITICAL。NVDのレコードで、CNAはGitHub)⁠[8]
CWECWE-1188⁠[8]

Active Storageは、2018年4月9日に公開されたRails 5.2.0で導入された⁠[19]。Ethiackの説明では、同社の研究チームが最初に独立して発見・報告し、数日後にGMO Flatt Securityの研究チームの研究者も報告した⁠[9]。

攻撃の仕組み

37signalsのHot Cell v1.0の記事は、攻撃に連なった要素として7つを挙げた⁠[5]。

  • 既定で有効だったdirect uploadの経路⁠[5]
  • direct uploadがバイト列を調べず、申告のcontent typeを信じること⁠[5]
  • 署名付きのvariation keyにblobのIDが含まれないこと⁠[5]
  • RailsがVips.block_untrustedを呼んでいなかったこと⁠[5]
  • libvipsが偽のMATLABの見出しにだまされたこと⁠[5]
  • libmatioが渡されたファイルを信頼すること⁠[5]
  • secret_key_baseからリモートコード実行に至る既知のガジェット⁠[5]

Ethiackの技術分析では、攻撃の要はHDF5のexternal storageである⁠[10]。MAT v7.3の形式はHDF5で、データセットの中身を任意のパス・オフセットの別のファイルに置けるが、libmatioはそれを確かめずに読み込む⁠[10]。libvipsは見出しが「MATLAB 5.0」で始まるファイルだけをMATとしてlibmatioに渡し、libmatioはオフセット124の版の語でHDF5として読む⁠[10]。この判定の食い違いで任意のファイルを読ませられる⁠[10]。

Ethiackは、variation keyが変換だけを署名するため、公開されたキーを別のblobに使い回すと、生成された画像の画素として対象のファイルの中身が返ると説明した⁠[10]。読み取ったsecret_key_baseで変換を署名すれば、CVE-2025-24293の修正漏れ(vipsの変換器が許可リストを強制していない)を使って任意のコードを実行できる⁠[10]。Ethiackはlibvipsの読み込み処理の調査にClaude Opus 4.8を使い、24時間以上誘導して連鎖を組み立てたと書いた⁠[10]。Claudeは外部の資料に触れず、ソースコードの分析で手法を見つけたとも追記した⁠[10]。

別の研究者が7月18日に公開した「Leaky Avatar」は、HDF5のexternal datasetを使い、縮小したアバターから/proc/1/environを読む手法に独立に到達していた⁠[10]。Ethiackはこのことを後から知ったと書いた⁠[10]。

詳細の公開の時期

Railsは当初、攻撃の連鎖の技術的な詳細をアドバイザリから意図して省き、遅くとも8月28日までにRails Security Announcementsのフォーラムで公開するとしていた⁠[1]。その後、複数の研究者がすぐに攻撃を解析して概念実証を公開したため、詳細とツールを前倒しで公開したと説明した⁠[3]。37signalsの記事は、複数の研究者が告知から数時間で攻撃を導き出し、詳細を伏せた意味が無くなったと書いた⁠[5]。GMO Flatt Securityは、記事を公開した際にはPoCを公開していないが、事前の検証ではAIなどを使えば数時間以内にPoCが作られる可能性が高いと判断したと書いた⁠[11]。

目次へ

時系列

時系列
日付主体内容資料
2026年7月21日Ethiack最初の動くPoCを完成させた⁠[15]
2026年7月22日EthiackRailsに脆弱性を報告した⁠[15]
2026年7月23日Rails報告を受領した⁠[15]
2026年7月29日Rails修正版とセキュリティアドバイザリを公開した⁠[1、2]
2026年7月29日EthiackKindaRails2Shellの概要の記事を公開した⁠[9]
2026年7月30日GMO Flatt Security概要と対応指針の記事を公開した⁠[11]
2026年7月30日JPCERT/CC注意喚起を出した⁠[7]
2026年7月30日NVDCVEのレコードを公開した⁠[8]
2026年7月31日Rails攻撃の詳細とフォレンジック調査用のツールを公開した⁠[3]
2026年7月31日Ethiack技術分析を公開した⁠[10]
2026年8月3日Rapid7根本原因の技術分析とMetasploitのモジュールを公開した⁠[12]
2026年8月3日JPCERT/CC注意喚起を更新し、侵害の検出方法を加えた⁠[7]
2026年10月5日37signalsActive Storageの処理を分離するHot Cell v1.0を公開した⁠[5]

目次へ

対象の製品と版

Railsのアドバイザリによると、影響を受けるのは、Active Storageの画像処理にlibvipsを使い、未信頼の利用者からの画像のアップロードを許すアプリである⁠[1]。libvipsを使う設定はconfig.active_storage.variant_processorにvipsを指定するもので、load_defaults 7.0が設定し、以後の既定も変えていない⁠[1]。variantの生成は別の要件ではないとした⁠[1]。

表2:影響を受けるactivestorageの版と修正版
製品影響を受ける版修正版資料
activestorage(7.2系まで)7.2.3.2未満〔注1〕7.2.3.2⁠[1]
activestorage(8.0系)8.0以上8.0.5.1未満8.0.5.1⁠[1]
activestorage(8.1系)8.1以上8.1.3.1未満8.1.3.1⁠[1]

Ethiackは、影響はVipsの処理系だけで、Magickを使うアプリはこの経路では影響を受けないと説明した⁠[9]。GMO Flatt Securityは、DebianやUbuntu、rails newなどで生成されるDockerfileを用いた環境は既定で影響を受けると書いた⁠[11]。JPCERT/CCは注意喚起で、direct uploadは既定で有効で、標準ではアプリ固有の認証・認可が無いため、利用者向けのアップロード機能を持たないアプリでも対象となる可能性があるとした⁠[7]。

Rapid7の試験では、通常のサーバー側の添付ではこの連鎖が成り立たなかった(Railsが細工したファイルをMATLABのデータとして判定し直す)⁠[12]。Rapid7は、direct uploadの経路は、Active Storageのルートを載せていればアプリが使っていなくても既定で存在すると説明した⁠[12]。

表3:配布元と関連ライブラリの対応
配布元状態修正版・アドバイザリ資料
Debian(bookworm)修正版あり2:6.1.7.10+dfsg-1~deb12u3(DLA-4829-1)⁠[6]
Debian(trixie)修正版あり2:7.2.2.2+dfsg-2~deb13u2(DSA-6546-1)⁠[6]
Debian(unstable)修正版あり2:7.2.3.2+dfsg-1(Debian Bug 1143080)⁠[6]
libvips(MATLABの見出しの判定)修正済み、CVEは公開されていないlibvips 8.18.5⁠[5]
libmatio修正しない(Won't fix)-⁠[5]

37signalsの記事は、libvipsが偽のMATLABの見出しにだまされたことを実際の欠陥とし、libmatioの保守者はlibvips側の問題と指摘したと書いた⁠[5]。

目次へ

悪用の状況

Rapid7は、7月30日現在、実環境での悪用を把握していないと書いた⁠[12]。The Hacker Newsの記事によると、Rails Security Teamは同誌に、公表の前後で悪用も悪用の試みも把握していないと述べた⁠[15]。同じ記事は、7月29日17時30分(UTC)の確認ではこのCVEはCISAのKnown Exploited Vulnerabilitiesカタログの版2026.07.27に無く、その後に公開された第三者のGitHubリポジトリが、ファイル読み取りからリモートコード実行までの連鎖を再現すると主張したと報じた⁠[15]。The Hacker Newsはこのリポジトリを検証していない⁠[15]。

VulnCheckは8月1日〜7日の報告で、この脆弱性のエクスプロイトを作成し、露出した脆弱なRailsのインスタンスを7,100以上〔注2〕数えたと書いた⁠[14]。その報告の範囲では、悪用の報告は無かった⁠[14]。

SecurityWeekは、VulnCheckによると、攻撃者は修正版の公開から約1か月後に当たる前週にこの脆弱性の悪用を始めたと報じた⁠[17]。

The Hacker Newsは、VulnCheckが悪用を検知したのはシンガポール・イスラエル・英国に置いたcanaryだと報じた⁠[16]。VulnCheckの研究者はLinkedInで、活動はフランスの単一のIPアドレスから来てイスラエルのホストへC2を張ると述べた⁠[16]。NVDのレコード(9月10日更新)にも、KEVへの登録の項目は無い⁠[8]。

目次へ

修正と回避策

Railsはアドバイザリで、対策として次の手順を示した⁠[1]。

  1. activestorageの修正版に更新する⁠[1]。
  2. libvipsを8.13以上に更新する(8.13未満はunfuzzedの操作を無効にできず、その環境ではActive Storageが起動時に例外を出す)⁠[1]。
  3. secret_key_baseと、アプリの環境から読める秘密情報を変更する⁠[1]。

Railsのアドバイザリによると、更新は脆弱性を塞ぐが、すでに持ち出された秘密情報は元に戻らない⁠[1]。影響を受けたアプリは、プロセスから読めるすべての秘密情報を漏えいしたものとして扱い、変更するよう求めた⁠[1]。対象にはsecret_key_base、マスターキーとcredentials.yml.encの中身、S3・GCS・Azureなどのストレージの鍵、データベースの認証情報、外部サービスのトークンと鍵を挙げた⁠[1]。

Railsは、secret_key_baseを変えるとセッションが失効し、利用者は再ログインが要ると説明した⁠[1]。暗号化・署名付きのCookie、署名付きのglobal ID、Active StorageのURLにも影響する⁠[1]。鍵の切り替え(rotation)は必要なときの中間段階に限り、漏えいした秘密情報を予備として残さないよう求めた⁠[1]。

Railsのアドバイザリによると、libvips 8.13未満では、libvipsへの依存を外す以外の回避策は無い⁠[1]。画像の解析のためだけにruby-vipsを入れているアプリは、Gemfileから外せる場合がある⁠[1]。libvips 8.13以上なら、Railsを更新せずに環境変数VIPS_BLOCK_UNTRUSTEDでunfuzzedの操作を無効にでき、ruby-vips 2.2.1以上ならinitializerでVips.block_untrusted(true)を呼ぶこともできる⁠[1]。

Railsは修正版の告知で、できるだけ早い更新を強く勧め、古い版はサポート外なので少なくとも7.2系に更新するよう勧めた⁠[2]。Rails Security TeamはThe Hacker Newsに、Rails 7.1以前はサポート終了でバックポートしないため、7.2.3.2以降への更新が要ると説明した⁠[15]。Ethiackの技術分析では、Railsの修正はvipsの使用時に信頼できない読み込みを止めるもので、BMP・ICO・PSDの変換は「Vips::Error」になり、SVG・JPEG XL・JPEG 2000・Netpbmの画像の解析では幅と高さを記録しなくなる⁠[10]。

JPCERT/CCの注意喚起によると、同センターはエクスプロイトコードの公開を確認しており、今後この脆弱性を悪用する攻撃が広く行われる可能性がある⁠[7]。影響を受ける可能性がある環境では侵害を前提に、読み取り可能なすべての認証情報を漏えい済みとして扱い、変更することを推奨した⁠[7]。

EthiackはWAFについて、一部の構成で時間を稼げるかもしれないが修正ではないと書いた⁠[9]。GMO Flatt Securityも、WAFによる緩和策の有効性は「極めて限定的」で、修正版への更新の代わりにしないよう求めた⁠[11]。Help Net Securityは、AkamaiがEthiackと公開前に調整し、KindaRails2Shell向けのWAFのルールを配備したと説明したと報じた⁠[18]。

修正後に残る経路

VulnCheckは修正版8.1.3.1のサーバーで試し、修正はlibvipsのファイル読み取りを止めるが、variation keyのMarshalの逆シリアル化は止めず、有効な署名があればリモートコード実行のガジェットは修正済みのサーバーでも動くとした⁠[14]。Rapid7は、同社が示したリモートコード実行の経路はMarshalのオブジェクトのガジェットに依存しないと書いた⁠[13]。

侵害の調査とその後の対策

Railsが公開したリポジトリrails/rails-forensics-CVE-2026-66066には、次のものが入っている⁠[3]。

  • 攻撃の手順の説明(reference/the-attack.md)⁠[3]
  • データベースとオブジェクトストアに残る痕跡の説明(reference/the-investigation.md)⁠[3]
  • 脆弱だったか、その期間を調べるagent skill(kr2s-was-i-vulnerable)⁠[3]
  • 細工したファイルを探し、何が読まれたかを調べるagent skill(kr2s-was-i-exploited)⁠[3]

投稿者は、これらのツールを37signalsで自社のアプリをフォレンジック分析した作業から取り出したと書いた⁠[3]。JPCERT/CCは更新した注意喚起で、開発者が公開したフォレンジック調査用のツールとガイドで影響の有無を調べるよう加えた⁠[7]。Rapid7は、未使用のblobを消す定期処理が証拠を消しうるため、フォレンジックの調査を早く始めるよう勧めた⁠[12]。

37signalsは、Active Storageの画像・動画・PDFの処理を権限の無いサイドカーのコンテナに移すHot Cell v1.0を、Basecamp・HEY・Fizzyの本番で動かしていると書いた⁠[5]。Railsは同じ内容のセキュリティアドバイザリを、GitHubのrails/railsのリポジトリにも掲載した⁠[4]。

目次へ

未公表の事項

  • 悪用を受けた組織・アプリの数と名前
  • 影響を受けるアプリの数(Rails Security TeamはThe Hacker Newsに、Vipsで使うアプリの数のテレメトリも妥当な推計も無いと述べた⁠[15])
  • 悪用した攻撃者の帰属
  • 持ち出された秘密情報による二次被害

注

  • 〔注1〕Ethiackは6.0.0〜6.1.7.10も既定外の設定なら影響を受けうるとし⁠[9]、Rapid7はその構成で攻撃が成り立つと確かめた⁠[12]。GMO Flatt Securityは6.0.0未満を対象外とした⁠[11]。
  • 〔注2〕SecurityWeekは、VulnCheckが8月初めに確認した脆弱なRailsのインスタンスを約7,000と報じた⁠[17]。

出典

当事者

関係組織

公的機関

調査・観測

報道機関

背景資料

更新記録

  • 2026年8月13日:公開した。
  • 2026年8月31日:SecurityWeekの8月31日の記事(出典17)が伝えたVulnCheckによる悪用の開始を「悪用の状況」に、インスタンス数の差を「注」に加えた。
  • 2026年9月1日:The Hacker Newsの9月1日の記事(出典16)が伝えたVulnCheckのcanaryでの悪用の検知と発信元を、リードと「悪用の状況」に加えた。
  • 2026年9月10日:NVDのレコードの9月10日の更新(出典8)にKEVへの登録の項目が無いことを「悪用の状況」に加えた。
  • 2026年10月5日:37signalsの10月5日の記事(出典5)を加え、攻撃を構成する要素を「脆弱性の内容」に、libvipsとlibmatioの対応を「対象の製品と版」に、Hot Cell v1.0を「修正と回避策」に加えた。

目次へ