← コラム一覧

ファイルアップロードの脆弱性対策|Content-Type を信じない・保存先と公開範囲

アップロード機能で確かめるべきことを整理。宣言された Content-Type や拡張子を信じてはならない理由、保存先と公開範囲の分け方、実行させないための設定、情報処理安全確保支援士試験での問われ方まで解説します。

アップロード機能は、外部から受け取ったものを自分たちのサーバに置く、という点で特殊です。入力欄に文字を入れさせるのとは危険の質が違います。置いた場所、置いたときの名前、そしてそれを後からどう返すか——この三つで、影響の大きさが決まります。

宣言を信じない

最初に押さえるべき原則です。ファイル名の拡張子も、要求に付いてくる Content-Type も、どちらも送る側が自由に決められます。画像ですと名乗ってはいるが中身は別物、という状態はいくらでも作れます。受け取った側が、実際の中身を確かめる必要があります。

見るもの誰が決めるか信用してよいか
ファイル名の拡張子送信側いいえ
要求の Content-Type送信側いいえ
実際の中身(先頭の並びなど)受信側で検査はい(検査すれば)
再エンコードして通るか受信側で処理はい(より確実)

画像であれば、いったん読み込んで再エンコードしてしまうのが確実です。画像として解釈できないものはそこで落ちますし、余計な情報も落とせます。処理が重い場合は、少なくとも中身の先頭を確かめて、許可した形式の一覧と照合します。ここでも、危ない拡張子を弾く(拒否リスト)より、許す形式だけを通す(許可リスト)方が漏れが出ません。

保存先と公開範囲を分ける

受け取ったファイルを、そのまま公開ディレクトリに置かないことが基本です。公開領域に置くと、URL さえ分かれば誰でも取得できます。第三者に見せる必要がないものまで外から取れる状態になり、情報を外へ運び出す経路として使われることもあります。

元のファイル名をそのまま使わないのには、複数の理由があります。相対経路が含まれていれば別の場所に書かれる恐れがありますし、同じ名前で上書きされる事故も防げます。サーバ側で識別子を発行し、対応表で元の名前と結び付けておけば、利用者に見せる名前は保ったまま安全に扱えます。

返すときの扱い

保存だけでなく、返すときにも注意が要ります。ブラウザは、返された内容を推測して解釈することがあります。画像のつもりで返したものが HTML として解釈されると、そのサイトの一部としてスクリプトが動きかねません。Content-Type を明示し、推測を止める指定を添え、必要なら「保存する」扱いで返します。

# 返すときの応答ヘッダ(考え方)
Content-Type: image/png                 # 内容に応じて自分で付ける
X-Content-Type-Options: nosniff         # 推測させない
Content-Disposition: attachment         # 表示ではなく保存にする(必要なら)

容量と件数の制限

見落とされがちですが、可用性の観点も要ります。大きなファイルや大量のアップロードで保存領域を使い切られると、業務が止まります。一件あたりの上限、利用者あたりの件数や合計容量、単位時間あたりの回数を決めておきます。展開すると膨れ上がる形式の扱いにも注意が要ります。

検査してから置く、という順序

手順の順序も守るべき点です。まず一時的な領域へ受け取り、そこで中身の検査とマルウェアの検査を済ませ、通ったものだけを本来の保存先へ移す。先に保存先へ置いてから検査すると、検査が終わる前に取得されてしまう隙が生まれます。一時領域は公開せず、外部から到達できない場所にしておきます。

マルウェアの検査は、それだけに頼らない前提で入れます。既知のものは弾けますが、新しいものは通り抜けます。だから「検査したから安全」ではなく、実行させない設定、保存先の分離、取得時の権限確認と組み合わせて、どれか一つが破られても被害が広がらない形にします。多層で守るという考え方は、ここでも同じです。

受け取ったものを後から取り出す機能にも同じ注意が要ります。保存したファイルを識別子で指定して返す作りにしていても、その識別子が連番なら、順に指定するだけで他人のファイルへ辿り着けます。推測しにくい値を使い、そのうえで「この利用者がこのファイルを取得してよいか」をサーバ側で必ず確かめます。保存の設計と、取り出しの設計は対で考えます。

情報処理安全確保支援士 試験での問われ方

午後問題では、アップロードの記録や実装を示して「なぜ画像でないものが受け入れられたか」「対策」を書かせる形が出ます。対策を書くときは、中身を確かめること・公開領域に置かないこと・実行させないこと、の三点を分けて書くと観点を満たせます。「拡張子を確認する」だけでは不十分と判断されます。令和5年度 秋期の午後問1 でも、アップロード機能が持ち出しの経路として扱われました。

IPA 公式:過去問題(情報処理安全確保支援士試験) ↗各年度の問題冊子・解答例・採点講評の PDF を、公式サイトで確認できます。

確認しておきたいこと

演習(支援士日誌)で手を動かす →