Web APIの設計大丈夫?
本記事ではセキスペ 過去問(H.31/春 午後I 問1)を例題として解説する中でWebAPIの理解を深めます。
※IPA公式サイトから実際の問題を使用しております。
1.前提知識
- クロスドメイン通信
- WebAPI
2.知識のインプット
Same-Originポリシ(同一生成元ポリシ)
あるオリジンから読み込まれた文書やスクリプトについて、そのリソースから他のオリジンのリソースにアクセスできないように制限する規約。
CSRF(クロスサイトリクエストフォージェリ)
ユーザがログイン状態を保持したまま悪意のある第三者の作成したURLをクリックした場合などに、本人が意図しない形で情報、リクエストが送信されてしまうこと。
SNS等のログイン情報を利用して、勝手に投稿されてしまう等の被害が少なくない。
CORS(Cross-Origin Resource Sharing)
Same-Originポリシの制限を解除し、指定したオリジン間に限りリソースの共有を許可するための仕組み
JSONP(JSON with padding)
クロスサイト環境で他のオリジンから、JSONデータを取得するために考案された仕組み
HTMLのスクリプトタグはSame-Originポリシの制限を受けないという点を利用して異なるオリジンのデータを取得する
あくまでテキスト(JSON)ではなくスクリプトファイルを読み込んでCallbckで指定した関数を実行してJSONデータを取得します。
3.背景
Webサービスには、Webブラウザから利用するものだけでなく、サービスの機能の一部をプログラムからWebAPIとして利用するものもある。
webサイトから読み込まれたスクリプトが異なるオリジンのWebAPIにアクセスする場合、Same-Originポリシによって制限される。CORSを利用すれば制限を回避することができるが、セキュリティを考慮して実装する必要がある。
WebAPIを設計する能力を問う
4.過去問の要約
M社は小売業を営んでおり、コーポレートサイトAと自社の特定ブランドを取り扱うECサイトを複数経営している。
WebサイトBではCookieを利用したセッション管理を行なっている。会員情報は、各ブランドサイトで個別に管理している。
WebサイトBではWebサイトAへ売れ筋情報、会員情報を連携するためにWebAPIを実装している。WebAPIで受け渡されるデータはJSON形式、会員情報の取得はWebブラウザを経由して取得する。
スクリプトZはSame-Originポリシによって、FQDN、スキーム、ポート番号のいずれかが異なるリソースへのアクセスが制限される。そこで、この制限を開始するためにJSONPを用いることを検討した。
JSONPはアクセス制限する機能をもたいので、その実装では問題がある。例えば、まず会員情報を搾取するような攻撃者がスクリプトZを変更して、攻撃者のWebサイトページに置く。次に、被害者に特定の操作をさせた上で、そのページにアクセスさせると、攻撃者が被害者の会員情報を搾取できてしまう。
次に、JSONPの代わりにCORSを用いることを検討した。
また、CROSでは通常、Webブラウザはスクリプトを読み込んだページのオリジンだけにCookieや、ベーシックの認証情報を送る。図2では設定指定ないが、XMLHttpRequestのプロパティのwithCredentialsの値がtrueに設定されている場合、図3であればⅳの動作の際に、test2.example.comから発行されたCookieが送られる
プリフライトリクエスト又はメインリクエストがWebAPIに送られてきたときに、そのリクエストの中のOriginヘッダフィールドの値を許可するオリジンのリストと突合し、一致した値があればその値をAccess-Control-Allow-Originヘッダフィールドに設定するという内容もコーディング規約に含めれば良い
5.解説
被害者に特定の操作をさせた上で
図の注記からWebサイトAへで売れ筋商品の出力はWebサイトBへのログイン状態のときにのみ出力されることがわかります。
WebサイトBではCookieを利用して認証状態のセッション管理をしているのでWebサイトBにログインする操作を被害者にさせた上で偽のWebサイトに誘導しCookieを搾取することで会員情報を搾取できてしまいます。