Railsに重大な脆弱性、未認証の攻撃者がサーバー内ファイルを読み取りコード実行も可能に

Ruby on Railsに存在する重大な脆弱性(CVE-2026-66066として追跡)により、未認証の攻撃者が脆弱なサーバーから任意のファイルを読み取れることが判明しました。さらにリモートコード実行にまでエスカレーションできる可能性もあります。

この欠陥は、Active Storageの画像バリアント処理をlibvips使用に設定した場合に発生します。ユーザーがアップロードした画像を受け付けるRailsアプリケーションの多くが影響を受けます。問題の根本は、libvipsが「loader」および「saver」操作を通じてファイル形式を処理する仕組みにあります。

これらの操作の一部は、libvipsのメンテナによって明示的に「unfuzzed(ファジングテスト未実施)」とマークされています。つまり、信頼できない入力に対する耐性が確保されておらず、出所不明のファイルを処理するには安全ではないということです。

デフォルト設定のActive Storageは、これらのunfuzzed操作を無効化していませんでした。その結果、悪意を持って細工されたファイルをアップロードしてバリアント生成をトリガーした攻撃者は、これら安全でない操作の一つを呼び出せてしまいます。

Railsのセキュリティチームが確認したところ、少なくとも一つの攻撃チェーンが実際に機能し、環境変数を含むアプリケーションサーバーのファイルシステム上の任意のファイルを漏洩させられることが分かりました。

サーバー環境には通常、secret_key_base、データベースの認証情報、サードパーティサービス用のAPIキーなどが保存されているため、これは特に危険です。

アプリケーションが脆弱となる条件は、config.active_storage.variant_processor = :vipsという設定でActive Storageの画像処理にlibvipsを使用していること(Rails 7.0以降このオプションがデフォルトです)、そして信頼できない、あるいは未認証のユーザーからの画像アップロードを許可していることです。

注目すべき点として、バリアントの生成自体は別途必須の条件ではありません。この設定下で単にアップロードを受け付けているだけで、脆弱性が露呈するのに十分です。

影響を受けるバージョンは、activestorage<7.2.3.2、activestorage≥8.0かつ<8.0.5.1、およびactivestorage≥8.1かつ<8.1.3.1です。

Railsのメンテナは、影響を受ける組織に対し、Active Storageを直ちにパッチ適用済みバージョンへアップグレードし、libvipsもバージョン8.13以降へアップグレードするよう強く求めています。

これより古いバージョンではunfuzzed操作を無効化すること自体ができないためです。また、パッチ適用済みのActive Storageは、安全でない環境下では起動時に例外を発生させるようになります。

アップグレードに加えて、各チームはsecret_key_base、Railsのマスターキー、credentials.yml.encに保存されているすべての認証情報をローテーションすべきです。さらに、S3、GCS、Azureなど、Active Storageのサービスに紐づくキー、データベースの認証情報、サードパーティのAPIトークンについても同様の対応が必要です。

Railsを直ちにアップグレードできないものの、libvips ≥8.13を実行している組織は、VIPS_BLOCK_UNTRUSTED環境変数を設定するか、ruby-vips ≥2.2.1を使用している場合はイニシャライザからVips.block_untrusted(true)を呼び出すことで対処できます。libvips 8.13未満のバージョンについては、依存関係そのものを完全に取り除く以外の回避策は存在しません。

SOC調査の死角を減らし、ANY.RUNで脅威の封じ込めを早期化することで、対応コストと業務への支障を軽減しましょう。

翻訳元: https://cyberpress.org/critical-rails-flaw-read-server-files-execute-code/

ソース: cyberpress.org