セキュリティニュース
Ruby on Rails の画像アップロードに重大な欠陥(GHSA-f3w6-w445-fwh9)— 画像を1枚送るだけでサーバーの秘密の鍵が抜かれる
ひとことで言うと
- Web サービスを作る仕組みとして日本でよく使われる Ruby on Rails の、ファイルのアップロードを扱う部品 Active Storage に、重大な欠陥(GHSA-f3w6-w445-fwh9、CVSS 9.8)が見つかりました。
- 細工した画像を1枚アップロードするだけで、サーバーのファイルを書き換えたり、読み出したりできます。読み出されると、サーバーの「秘密の鍵」まで抜かれ、乗っ取りにつながります。
- 11月4日に修正版 8.1.4.1 / 8.0.5.2 が出ました。悪用の報告は、今のところありません。見つけたのは日本の研究者(ryotak 氏)です。
- 利用者が画像を投稿できる Rails のサービスは、更新を急ぎ、条件によっては秘密の鍵の入れ替えもしてください。
この記事は 11月4日時点の情報です。
何が原因か
Rails の Active Storage は、利用者がアップロードした画像を受け取ると、サイズや向きを調べたり、縮小版を作ったりするために、ImageMagick という画像処理のソフトに画像を渡します。
ImageMagick は、とても多くのファイル形式を扱える便利なソフトです。ただ、形式の中には、画像の中に「別のファイルを読め」「ここにファイルを書け」といった指示を書けるものがあります。本来は、そうした危ない形式を使わせない設定(ポリシー)で守るのが決まりです。
ところが Active Storage は、どの形式を使ってよいかを何も制限しないまま、アップロードされたファイルを ImageMagick に渡していました。しかもこの処理は、ファイルを添付した瞬間に自動で動きます。
| 項目 | 内容 |
|---|---|
| 対象 | Rails の Active Storage(8.1.4.1 / 8.0.5.2 より前) |
| 深刻度 | CVSS 9.8(緊急) |
| 攻撃の条件 | 利用者が画像などをアップロードできること。ログインの要否はサービスによる |
| できてしまうこと | サーバーのファイルの書き込み、保存先がサーバーのディスクならファイルの読み出しも |
| 見つけた人 | ryotak 氏(HackerOne 経由で報告) |
対象になる3つの条件
次の3つすべてに当てはまると、対象になります。
- 画像の処理に ImageMagick(mini_magick)を使っている(Rails 6.1 以前の初期設定で作ったアプリは、これが標準)
- サーバーの ImageMagick の設定で、危ない形式を止めていない(Debian や Ubuntu の標準の設定では止まっていません)
- 外部の利用者がファイルをアップロードできる
何が起きたか
- 11月4日:Rails の開発チームが、修正版 8.1.4.1 / 8.0.5.2 と注意喚起を公開
- 同じ日に、動画のプレビューを作る処理にも似た欠陥(GHSA-v924-7rp8-4mxh、重要)が公表されました
- 同じ修正版では、ほかにもたくさんの欠陥がまとめて直っています
開発チームは「報告された攻撃の道筋は1つだが、それだけだとは考えていない」としています。悪用の報告や、攻撃コードの公開は、11月4日時点ではありません。CVE 番号は、Rails の注意喚起にはまだ書かれていません。
中身に「命令」が仕込まれた画像だと思え!
見た目はただの画像でも、ImageMagick が読むと「このファイルを読んで、ここに書き出せ」と動いてしまう。サーバーにある秘密の鍵のファイルを、外から見える場所に書き出させることもできるわけだ。
Rails の秘密の鍵(secret_key_base)が漏れたら、ログインの仕組みごと偽造されかねない。画像の投稿を受け付けているなら、他人事じゃないぞ!
どんな問題があるか
- サーバーのファイルを書き換えられる:プログラムや設定を書き換えられると、サービスを乗っ取られるおそれがあります
- 秘密の鍵や接続情報が漏れる:Rails の秘密の鍵、データベースやクラウドの保存場所のパスワードなど、サーバーの中の大事な情報が読み出されるおそれがあります
- つながっているほかのシステムにも広がる:漏れた接続情報で、データベースや外部のサービスまで入られることがあります
- アップロードの機能はどこにでもある:プロフィール画像、商品の写真、書類の添付など、ふつうの機能が入口になります
実は「2回目」— 2016年の ImageTragick
ImageMagick の危ない形式が狙われたのは、今回が初めてではありません。2016年には、細工した画像で ImageMagick にサーバーの命令を実行させる欠陥(CVE-2016-3714、通称「ImageTragick」)が見つかり、世界中の画像アップロード機能が一斉に見直されました。そのとき広まった守り方が、「危ない形式は設定で止めておく」ことです。今回は、Rails の Active Storage がその守りを自分では入れていなかったことが問題になりました。
自社のサービスが Active Storage を使っているか見分けるには
制作会社やエンジニアに、次の点を見てもらうとすぐにわかります。
- Gemfile.lock に activestorage が入っているか(Rails の標準で入っていることが多い)
- モデルに
has_one_attachedやhas_many_attachedがあるか(ファイルを添付する機能を使っている印) config.active_storage.variant_processorの設定::mini_magickなら ImageMagick を使っています。:vipsなら今回の主な道筋からは外れますが、動画のプレビューの欠陥(GHSA-v924-7rp8-4mxh)は別に確認が必要です- ファイルの保存先:サーバーのディスク(Disk)か、クラウドの保存場所(Amazon S3 など)か。ディスクの場合は、読み出しの被害まで考える必要があります
臨時の対処(すぐ更新できないとき)
Rails の開発チームは、次の回避策を案内しています。
- ImageMagick の設定(ポリシー)で、危ない形式を止める
修正版に入っている設定ファイル(policy.xml)を、サーバーの ImageMagick の設定にコピーします。最低でも、MSL という形式と、PDF・PostScript などを扱う部分(Ghostscript)を止めます。PDF の縮小版を作っている場合は、必要なものだけ許可し直します。 - アップロードできる人やファイルの種類を絞る
受け付ける形式を画像(JPEG・PNG など)に限り、だれでも投稿できる入口を一時的に止めることも検討します。
正しい対処
- Rails(activestorage)を修正版に更新する
8.1 系は 8.1.4.1、8.0 系は 8.0.5.2 以降。修正版は mini_magick 5.1 以降が必要で、古いままだと起動時にエラーになります。 - 保存先がサーバーのディスクなら、秘密の鍵をすべて入れ替える
Rails の secret_key_base、マスターキー、credentials の中身、データベースや外部サービスのパスワードを作り直し、古いものは使えなくします。 - Rails 7.2 以前は、移行を計画する
今回の修正版は 8.0 系・8.1 系向けです。8.0 系もまもなくサポートが終わる見込みです。 - 独自の画像処理の設定をしている場合は、サーバー側の設定も直す
mini_magick の動かし方を独自に変えているアプリは、修正版の設定が効かないことがあります。
いい心がけだ! これを送れ!
「Ruby on Rails の Active Storage の脆弱性(GHSA-f3w6-w445-fwh9、11月4日公表)について確認させてください。弊社のサービスは Rails で作られていますか。その場合、利用者がファイルをアップロードできる機能があるか、画像の処理に ImageMagick を使っているか、Rails のバージョンを教えてください。対象であれば、8.1.4.1 / 8.0.5.2 への更新と、必要に応じて秘密の鍵の入れ替えをお願いします。」
「秘密の鍵の入れ替え」まで頼むのがポイントだ。更新だけでは、すでに漏れた鍵は取り戻せないからな!
まとめ
- 原因は、アップロードされたファイルを、危ない形式を止めないまま ImageMagick に渡していたこと
- 画像1枚でファイルの書き換え・読み出しができ、秘密の鍵まで抜かれるおそれ
- つなぎは ImageMagick の設定で危ない形式を止めること、正しい対処は 8.1.4.1 / 8.0.5.2 への更新
- 保存先がサーバーのディスクなら、秘密の鍵をすべて入れ替える