Webアプリに画像をアップロードして、リサイズや圧縮をする。この身近な機能にも、サーバーで不正な処理を実行されたり、情報を持ち出されたりするリスクがある。
実際に、画像共有サービスのGyazoは2026年9月、アップロードされた動画などの変換処理の脆弱性を悪用された。画像加工アプリを作るときにも参考になる事例なので、何が起きたのかと、設計で確認したい点を整理する。Helpfeelの公式調査報告
この記事は2026年11月4日時点で確認した公開資料に基づく。事件の記述は同年10月21日公表の第三報を根拠とし、後半の対策は一般的な設計上の解説として区別する。特定のOSには依存せず、Laravelの仕様に触れる箇所はLaravel 12を対象とする。
Gyazoでは、動画などの変換処理が侵入口になった
運営元のHelpfeelによると、画像アップロードサーバーの一部の変換処理で、外部から受け取った値がサーバー上のコマンドとして解釈されてしまった。攻撃者はそこで任意のコマンドを実行し、サーバーから接続できたデータベースの情報を読み取って、外部へ送信したと報告されている。
| 日付 | 公表されている経緯 |
|---|---|
| 2026年9月11日 | 不正アクセスが発生。同日夜に不審な動作を検知 |
| 9月12日 | 未明までに侵入経路を遮断。同日中に原因の脆弱性を修正 |
| 9月18日 | サービスを一時停止 |
| 9月27日 | 対策と点検を経てサービスを再開 |
| 10月21日 | 外部専門機関の調査を踏まえた第三報を公表 |
ここで注目したいのは、受け取ったファイルを変換する処理から、データベースへ被害が広がったこと。アップロードを受け付ける処理に加え、その後に動くプログラムと、そこに与える権限も確認する必要がある。公式報告の原因・経路と対応経緯
情報流出と、画像そのものの取得を分けて読む
運営元は、ユーザー情報や画像のメタデータの流出を公表している。メタデータは、画像ファイルに関連付けて保存される情報のことだ。外部専門機関は大量の読み取りと外部送信を確認したが、送信内容そのもののログがなく、外部に送られた項目・件数を直接確定できないという調査上の限界も示している。公式報告の調査結果
画像ファイルについては、追加調査によって133人が所有する画像432件の閲覧・取得が確認された。画像が大量に取得されたことを示す記録は確認されていないが、ほかの画像がURL経由で閲覧された可能性は完全には否定できないとされている。確認された被害と、確認しきれていない範囲を分けて受け止めたい。Gyazo公式ヘルプの第三報
画像アップロードで考える主なリスク
ここからは、Gyazoで確認された攻撃に限定しない一般的な話。OWASPのファイルアップロード対策では、ファイルを処理するプログラムへの攻撃、既存ファイルの上書き、容量の消費、公開したファイルによる閲覧者への影響などが挙げられている。
| 処理する場面 | リスクの例 |
|---|---|
| 保存 | 偽装されたプログラムが、サーバー設定によっては実行対象になる |
| 解析・変換 | 細工されたファイルが画像処理ライブラリの脆弱性を突く |
| 展開・大量受信 | メモリやディスク、処理時間を使い切る |
| ブラウザへの配信 | スクリプトを含む形式などが、配信方法によってXSSにつながる |
拡張子や送信者の申告だけでは中身を信頼できない。複数の対策を組み合わせて扱う。OWASP:File Upload Cheat Sheet
画像加工アプリで確認したい対策
形式・容量・保存先をサーバー側で制限する
JPEG・PNGなど必要な形式だけを許可し、中身から形式を検証する。保存名はアプリ側で生成し、未確認の原本は公開ディレクトリの外に置く。容量と受信頻度にも上限を設ける。画面のファイル選択制限は補助と考え、サーバー側でも条件を強制する。OWASP:ファイル形式・保存先・アップロード制限
外部入力をコマンド文字列に連結しない
変換ツールを呼び出す際、元のファイル名やフォームの値をシェルコマンドの文字列に連結すると、入力が命令の一部として解釈される危険がある。
OSコマンドを呼ばずに実現できるAPIを優先し、必要な場合はプログラムと引数を分けて渡す仕組みを使う。さらに、許可する引数や値も検証する。引数を分けても、変換ツールに危険なオプションを渡せる設計が残れば問題になる。OWASP:OS Command Injection Defense
変換処理が使える資源と機能を絞る
圧縮されたファイルの容量と、展開後に必要なメモリは異なる。画素数が非常に多い画像や、多数のフレームを持つ画像も考慮して、メモリ、作業用ディスク、処理時間、同時実行数に制限を設ける。
ImageMagickを使う場合には、許可する形式や外部処理を制限するセキュリティポリシーも確認する。導入したOSやパッケージの設定を確認し、用途に合わせて制限を決める。ImageMagick:Security Policy
再エンコードによって配信用画像を作り直す方法もあるが、その処理自体が未信頼の入力を読み込む。画像処理ライブラリの更新と、処理環境の制限を併せて行う。OWASP:File Content Validation
変換処理から触れられる情報を少なくする
Gyazoの事例を踏まえた設計上の検討点として、画像処理用のワーカーに何の権限を渡すかを確認したい。例えば、必要な入力・出力ファイルだけを扱わせ、アプリ本体のDB認証情報を渡さず、DBへの通信も制限する構成が考えられる。
これは、処理に必要な最小限の権限を与えるという考え方の具体化だ。Laravelのキューへ移すだけでは、別の権限やネットワークに隔離されたことにはならない。実行ユーザー、環境変数、ファイル権限、通信先まで確認する。OWASP:最小権限と専用アカウント
閲覧と削除にも権限確認を入れる
非公開の画像では、アップロード時に加えて、表示・ダウンロード・削除のリクエストごとに本人の権限を確認する。画像IDが推測しにくくても、アクセスしてよい人かの確認は必要になる。OWASP:Authorization Cheat Sheet
Laravelの画像検証で、どこまで確認できる?
Laravel 12では、画像アップロードの受け入れ条件を次のルールなどで設定できる。
| ルール | 確認する内容 |
|---|---|
image |
画像形式として受け付けられるか |
mimes |
ファイルの中身から推定したMIMEタイプが、指定した形式に対応するか |
max |
アップロードファイルの容量の上限 |
dimensions |
画像の幅・高さなどの条件 |
mimesは利用者が付けた拡張子そのものを検証するルールではない。また、Laravel 12のimageルールはXSSのリスクを理由にSVGを既定で拒否する。Laravel 12:ファイルの検証
これらの検証は受け入れ条件を確認するために使う。変換プログラムの脆弱性、コマンドの組み立て方、ワーカーの権限、閲覧時の認可も、それぞれ確認したい。
S3への直接アップロードを使う場合も、変換処理を確認する
ブラウザからS3へ画像を送る構成では、アプリサーバーが画像本体を受信する経路を省ける。その後、どのサーバーが画像を読み込んで変換するかは、引き続き設計する必要がある。
保存経路や署名付きURL、変換処理の分離については「画像をアプリサーバーに通さない、S3直接アップロードの設計」にまとめた。今回の事例と合わせて、受信・変換・保存・配信の各処理と、そこで触れられる情報を確認すると構成を考えやすい。