こんばんわ!
世間では徳丸試験といわれている、ウェブ・セキュリティ基礎試験に挑戦しようということで、いつものごとくアウトプットで記事にまとめていきます。
今回は第二十二回目のAPI脆弱性についてまとめます。
JSONとJSONP
JSONとは、JavaScriptのオブジェクトリテラルの形式をベースに作られたデータ交換形式です。名前と値がペアになっているデータの集合体として表され、名前と値を「:」 (コロン)でペアとして記述し、データの間は「,」 (カンマ)で区切ります。これらを {}で囲んだものがJSON形式となります。
一方、JSONPは「JSON with Padding」の略で、異なるオリジン間でデータをやり取りするための手法です。JSONPは、異なるオリジン間でデータを受け渡すことができないXMLHttpRequestを使用せず、script要素を使用して外部のJavaScriptを直接実行することにより、異なるオリジン間でデータをやり取りする方法が考案されました。JSONPでは、JSON文字列そのままではscript要素でデータを受け取ることができないため、関数呼び出しの形でデータを生成します。
APIの脆弱性
APIで起こりやすい脆弱性は下記です
・JSONエスケープの不備
・JSON直接のXSS
・JSONPのコールバック関数名によるXSS
・WebAPIのクロスサイト・リクエストフォージェリ
・JSONハイジャック
・JSONPの不適切な利用
・CORSの検証不備
原因は下記です
・JSON文字列の生成時に適切なエスケープ処理などが行われていない
・JSONの評価にeval関数などを用いているか、JSONPを用いている
対策は下記です
・文字列連携によるJSONデータ生成をやめ、信頼できるライブラリを用いてJSONを生成する
・eval関数ではなく、JSON.parseなどの安全なAPIでJSONを解釈する
JSONのXSS
APIが返すレスポンスデータをブラウザで直接閲覧させることにより、攻撃が可能になる場合があります。
対策は下記です
・MINEタイプを正しく設定する
・レスポンスヘッダX-Content-Type-Options:nosniffを出力する
・Unicodeをエスケープする
・XMLHttpRequestなどCORS対策の機能だけから呼び出せるようにする
JSONPのコールバック関数のXSS
外部から指定したパラメータによって表示内容(関数名)が制御できることから、コールバック関数名によるクロスサイト・スクリプティングが可能になる場合があります。
原因は下記です
・外部から指定されたコールバック関数名を検証しないでそのまま表示している
・MINEタイプをText/JavascriptとするべきところをText/Htmlとしている
対策は下記です
・コールバック関数名の文字種と文字数を制限する
・MIMEタイプを正しく設定する
クロスサイトリクエストフォージェリ
下記原因によって、APIにてクロスサイトスクリプティングが発生する可能性があります。
・text/plain エンコードせずにそのまま送信
・application/x-www-form-urlencoded 通常のフォーム
・multipart/form-data ファイルアップロードで用いる形式
対策は下記です
・CSRFトークン
・二重送信クッキー
・カスタムリクエストヘッダによる対策
・入力データのMIMEタイプを検証
・CORSを適切に実装する
JSONハイジャック
JSONハイジャックとは、攻撃者が罠サイトを作成し、そのサイトにアクセスしたユーザーのブラウザから、本来は読み出せないはずのJSONデータを読み出す攻撃手法です。
対策は下記です
・X-Content-Type-Options:nosniffヘッダ付与
・X-Requested-with:XMLHttpRequestの確認
JSONPの利用
APIに悪意がある場合、緩和する手立てがJSONPにはありません。
従い、下記の対策を考える必要があります。
・JSONPはできるだけ、CORS+JSONに移行する
・JSONPは公開情報の提供のみに用いる
・JSONPは信頼できる提供のみを使用する
レスポンスヘッダ
X-Frame-Options
これはHTTPヘッダのフィールドの一つで、Webページを別のページ中のiframeタグやembedタグ、objectタグから参照して埋め込み表示するのを許可するか指定するものです。Webサーバ側が「X-Frame-Options: DENY」を指定すると、他のページからこれらの要素を介して埋め込み表示することは拒否されます。一方、「X-Frame-Options: SAMEORIGIN」を指定すると、同じWebサイトを構成する別のページへの埋め込みは許可され、外部の他のサイトへの埋め込みは拒否されます。
X-Content-Type-Options
これはHTTPヘッダのフィールドの一つで、Content-Typeフィールドで指定したメディアタイプを強制適用するものです。WebサーバからWebブラウザへの応答(HTTPレスポンス)の中で用いられます。ブラウザ側ではこれに従わずに伝送されてきたデータ本体を調べてメディアタイプを推測する「MIMEスニッフィング」を行なう場合がありますが、これを防止するために「X-Content-Type-Options: nosniff」と指定します。
X-XSS-Protection
これはInternet Explorer, Chrome, Safariの機能で、反射型クロスサイトスクリプティング (XSS) 攻撃を検出したときに、ページの読み込みを停止するためのHTTPレスポンスヘッダーです。
Content-Security-Policy
これはクロスサイトスクリプティング (XSS) やデータインジェクション攻撃などのような、特定の種類の攻撃を緩和するためのセキュリティレイヤーでHTTPレスポンスヘッダーに指定して利用します。このポリシーは、特定のDocumentまたはWorkerに代わって要求(およびその後埋め込みまたは実行)できるリソース、インラインスクリプトの実行、eval()および同様の構造を介した動的コード実行、インラインスタイルの適用などを制御します。
ここまでです。
読んでいただきありがとうございます