S3とContent-type によって想定されるwebアプリケーションの脆弱性
こんにちは、とがりです。
普段はセキュリティ系の企業でセキュリティアーキテクトをしています。
本記事では、クラウドストレージ時代の"Content-type" とそれによって想定されるwebアプリケーションの脆弱性をまとめます。
背景
現在では、S3やGoogle Cloud Storageなどのクラウドストレージが頻繁に利用されています。このようなクラウドストレージでは、アップロード時にファイルの種類を指定するためのContent-Typeという情報を指定することができます。
ユーザからアップロードされたファイルをS3に保存して、そのファイルに対して何らかの処理を行っている仕組みになっているアプリケーションも多いのではないでしょうか。そのようなアプリケーションでは、Content-Typeによる脆弱性が存在しているかも知れません。
そもそもContent-typeとは
よく見るものとしては、text/html
やimage/png
, application/json
があります。
Content-typeとは送信されるデータの種類や形式を指定するためのHTTPヘッダーのフィールドです。
関連度が高いワードにMIMEタイプというものがございます。
拡張子 | 文書の種類 | MIME タイプ |
---|---|---|
.csv | カンマ区切り値 (CSV) | text/csv |
.html | ハイパーテキストマークアップ言語 (HTML) | text/html |
.jpeg | JPEG 画像 | image/jpeg |
例えば、Content-Type: text/html; charset=UTF-8
の場合は、
text/html
が、MIMEタイプで、
charset=UTF-8
が、追加パラメータで
MIMEタイプと追加パラメータを合わせて、Content-typeです。
(違っていたらご指摘ください。)
Content-type の記法
Content-typeの記法は以下のような構造になっています。
Content-Type: media-type[; parameter1=value1][; parameter2=value2]
media-type
の部分にはMIMEタイプを指定します。
必須の要素で、type/subtypeの形式で指定します。
例: text/html
, image/jpeg
, application/json
追加パラメータ(オプション)セミコロン (;) で区切ってキーバリューの形で追加情報を指定できます。
詳細は、RFC7231やWHATWGをご確認ください。
こちらの記事では、RFC7231とWHATWGの違いやそれらを踏まえたブラウザの挙動にも言及されていましたので、気になる方はご覧ください。
想定されるwebアプリケーションの脆弱性
XSS 攻撃やRCEが懸念される
webアプリケーションで想定しているファイル形式とは異なる、Content-typeをユーザ(攻撃者)が指定することで、XSS 攻撃やRCE(リモートコード実行)を行うことが可能になるケースがございます。
例えば、画像ファイルをアップロードできるwebアプリケーションを想定します。そのアプリケーションでは、ユーザからアップロードされたファイルに対してホストサーバで何らかの処理を行います。
その場合に、XSS 攻撃やRCE(リモートコード実行)によって、ホストサーバの認証情報や機密データが漏洩したり、悪意のあるコードを実行させられるリスクがあります。
webアプリケーション全体で防御することが必要
これらの脆弱性を防ぐためには、webアプリケーション全体で防御することが必要です。
ファイルをアップロードする側では、クラウドストレージでは、Content-typeを指定することができることを把握して、適切なバリデーションを行うべきです。
image/png, text/html
やimage/png text/html
、image/ png
はそれぞれ異なる挙動を示します。また挙げた例は一例なので、他の例も含めて包括的にバリデーションを行う必要があります。
ファイルを利用する側では、悪意のあるファイル(コード、スクリプト)が混入した際に、どのような影響があるかを評価し、それらを踏まえた実装を行うべきです。
最後に
JAWSの勉強会の内容をベースに改めて自身でも調べてまとめました。
皆様のセキュリティレベル向上のお役に立てましたら幸いです。
参考:
Discussion