平成31年度 春期試験 午後Ⅰ問題対策① ―問1
はじめに
昨今では、多くのサービスがWebサービスとして提供されています。Webサイトの脆弱性を狙った攻撃は後を絶たず、Webサイトの適切なセキュリティ対策は必要不可欠と言えます。
情報処理安全確保支援士試験でも、Webシステムに関するセキュリティの問題は頻出です。そこで、過去問題からどのような知識が必要とされているのかを見ていきましょう。
今回は、平成31年度 春期試験 午後Ⅰ問題 問1について解説します。
平成31年度 春期試験 午後Ⅰ問題 問1の解説
平成31年度 春期 情報処理安全確保支援士試験 解答例の出題趣旨に、「本問では, 小売業が運営しているWebサイトでの情報連携を題材に, WebAPIを設計する能力を問う」とあり、Webサイト間の情報連携におけるセキュリティがテーマとなっています。
本問題で押さえておきたい重要な用語は次の通りです。
オリジン | 以下の3つの組み合わせ ・スキーム(プロトコル) ・FQDN(ホスト名) ・ポート番号 |
Same-Originポリシ | 同一オリジンポリシ、同一生成元ポリシとも呼ぶ。JavaScriptなどのスクリプトからサイトをまたがった他のオリジンのリソースへのアクセスを制限する仕組み |
JSON(JavaScript Object Notation) | データを表現するための定義方法 |
JSONP(JavaScript Object Notation with padding) | クロスオリジン(他のオリジン)からのデータを取得する仕組み。意図しない形で情報漏洩する可能性があるため、公開情報のみの提供が推奨される |
CORS(Cross-Origin Resource Sharing) | クロスオリジン(他のオリジン)からのデータを取得する仕組み |
過去にもWebコンテンツのオリジンに関わる問題が出題されており、情報処理安全確保支援士としてはぜひ押さえておきたい知識です。
問題の概要
- M社は、コーポレートサイトであるWebサイトAと、自社のブランドを取り扱うECサイト(ブランドサイト)を複数(WebサイトB~F)運営している。
- WebサイトAは会員機能を有しておらず、WebサイトBではCookieを利用したセッション管理を行っている。
[各ブランドサイトからWebサイトAへの情報連携]
- 各ブランドサイトの売上数を基にした、ブランド別の売れ筋商品情報を、WebサイトA上で表示するとともに、売れ筋商品情報及び会員情報を取得する「情報連携機能」を実装することにした。
- まず初めにWebサイトBからWebサイトAへの情報連携を行うために、2つのWebAPI(売れ筋商品情報を取得するためのAPI-X、会員情報を取得するためのAPI-Y)をWebサイトBに実装することにした。
- WebAPIで受け渡されるデータはJSON形式とし、API-Yからブランドサイトの会員情報を取得する際、会員のWebブラウザを経由して行う方式を採用した。
[情報連携機能の実装についての検討]
- WebサイトBのAPI-Yを呼び出すスクリプトZは異なるリソースへのアクセスが制限される。
- 検討段階では、API-Yからの会員情報の取得にJSONPを用いることを提案していたが、検討の末、CORSを用いることとした。
[CORSを利用した実装]
- スクリプトZの実装にCORSを用いたときの一連の動作を検討し表にまとめた。他のシステムでもCORSを利用することが考えられるため、複数のオリジンからのアクセスを許可するような仕様にも対応できるようコーディング規約をまとめ、実装を行った。
設問1
P3の[情報連携機能の実装についての検討] についての設問です。
※以下の解説では、問題文中のページ数を「Pxx」、図や表を「問題文中の図x、表x」と記します。
(1)
P3の1行目より、「WebAPIで受け渡されるデータは, JSON形式にする」と記述され、空欄【 a 】前後の文章では「スクリプトZは,【 a 】ポリシによって,【 b 】,【 c 】,【 d 】のいずれかが異なるリソースへのアクセスが制限される」と記述されています。また、この後の記述で「この制限をう回するためにJSONPを用いることを開発部のD課長に提案した」と記述されています。
これらより、【 a 】ポリシは、Webブラウザが有している、他オリジンのリソースへのアクセスを制限するSame-Originポリシ(同一オリジンポリシ、同一生成元ポリシ)であると考えられます。
従って、解答例は「Same-Origin」です。
(2)
(1)より、Same-Originポリシによって【 b 】、【 c 】、【 d 】のいずれかが異なるリソースへのアクセスが制限されます。Same-Originポリシでは、同一オリジン以外からのリソースへのアクセスを制限します。オリジンとは、URLにおける「スキーム(プロトコル)」「FQDN(ホスト名)」「ポート番号」の3つを組み合わせたものを指します。
従って、解答は【 b 】:キ、【 c 】:イ、【 d 】:ク (順不同)です。
(3)
P3の下線部①前後より、「例えば, まず, 会員情報を窃取するように攻撃者がスクリプトZを変更して, 攻撃者のWebサイトのページに置く。次に, 被害者に特定の操作をさせた上で, そのページにアクセスさせると, 攻撃者が被害者の会員情報を窃取できてしまう」と記述されています。
この記述のように、攻撃者が用意したWebサイト(異なるドメイン)に対して、JSONPのようにアクセス制限がかけられないと、被害者が気づかぬまま重要な情報をリクエストとして送ることが可能となり危険です。
P2に「WebサイトBでは, Cookieを利用したセッション管理を行っている」と記述されており、一度WebサイトBにログインした状態の場合、Cookieがリクエストとして自動的に送信されます。この時、上述のような問題があると、制限なしで攻撃者のWebサイトへCookieが送られてしまい、会員情報の窃取へつながる恐れがあります。
このような攻撃はクロスサイトリクエストフォージェリ(CSRF:Cross Site Request Forgery)と呼ばれます。一般的に、CSRFでは利用者がログインした状態で、利用者の意図しないリクエストを攻撃者が不正に送信することを指します。
本設問では、具体的な「被害者の特定の操作」を問われているため、解答例は「WebサイトBへのログイン」です。
設問2
(1)
通常、ブラウザではSame-Originポリシのため、異なるオリジンへのアクセスが制限されており、この制限をう回するための仕組みとしてCORSが広く活用されています。本設問では、CORSにおけるCookie送信のタイミングが問われています。
P4の[CORSの概要] より、サイト間リクエストはユーザデータに影響を与える可能性があるため、事前にプリフライトリクエスト(OPTIONSメソッド)を送り、実際にリクエストを送信しても安全かどうかを確認する必要があります。
CORSのリクエストでは、プリフライトリクエストで事前に利用許可を申請(問題文中の図4のAccess-Control-Request-XXXX)し、利用許可(問題文中の図5のAccess-Control-Allow-XXXX)をレスポンスとして受け取ります。Cookieを送信したい場合もプリフライトリクエストで利用許可を申請し、利用許可をレスポンスとして受け取った後、初めてCookieが送信できるようになります。
問題文中の図3の番号に沿ってまとめると、以下のようになります。
(iii)プリフライトリクエストでCookie送信の許可を申請する
(IV)Cookieの送信の許可を含むレスポンスが返される
(V)Cookieを含むメインリクエストを送信する
従って、解答は(V)です。
なお、本文では問われていませんが、Cookieが含まれている場合、レスポンスヘッダにはAccess-Control-Allow-Credentials: trueを含めないと、レスポンスが破棄されてしまうので注意が必要です。
設問3
P6の [CORSを利用した実装] についての設問です。
(1)
P3の[CORSの概要] に記述された流れと、問題文中の表1を照らし合わせて考えます。
スクリプトZの実装にCORSを用いたときの一連の動作では、WebサイトBの情報をWebサイトAから取得できるように、WebサイトBがWebサイトAに対して情報連携を許可する必要があります。問題文中の図5より、Access-Control-Allow-Originヘッダフィールドには「Webサイトが許可するオリジン」が含まれます。許可されるべきオリジンはWebサイトAのため、空欄【 f 】にはWebサイトAのURLが含まれる必要があります。
また、問題文中の図4より、Access-Control-Allow-Originヘッダフィールドで許可するオリジンは、プリフライトリクエストで送信されたOriginヘッダフィールドの値でもあります。問題文中の表1のNo.4より、OriginヘッダフィールドにはWebサイトAのURLである「https://site-a.m-sha.co.jp」が設定されているため、Access-Control-Allow-Originヘッダフィールドにもこの値を設定する必要があります。
従って、解答は「https://site-a.m-sha.co.jp」です。
(2)
問題文中の表1のNo.5では、ここまでの「プリフライトリクエストの送信」、「プリフライトリクエストに対するレスポンス」の流れから、Webブラウザがメインリクエストを送信する前に確認すべきことが記述されています。メインリクエストを送信するためには、WebサイトBの情報をWebサイトAへ送信することが許可されている必要があるため、プリフライトリクエストで送信されたOriginヘッダフィールドの値と、Access-Control-Allow-Originヘッダフィールドの値が一致していることを照合することでアクセスが許可されているかを確認します。
プリフライトリクエストで送信されたOriginヘッダフィールドの値は、問題文中の図4より、スクリプトを含むページのオリジンであり、WebサイトA(https://site-a.m-sha.co.jp)のことを指しています。このサイトは、問題文中の図1から「売れ筋商品情報配信の申込ページ」であることがわかります。
従って、解答例は「売れ筋商品情報配信の申込ページのオリジン」です。
(3)
P6のD課長との会話から、Access-Control-Allow-Originヘッダフィールドに指定できるオリジンは1つだけなので、複数のオリジンからアクセスを許可できるようなコーディング規約を策定する必要があると読み取れます。
上述の会話では、「WebAPI内のプログラム内に, 許可するオリジンのリストを用意すること」と記述されているため、リクエスト中の「Originヘッダフィールドの値」と「許可するオリジンのリスト」を比較し、一致した値をAccess-Control-Allow-Originヘッダフィールドに設定することで、複数のオリジンからのアクセス許可にも対応できるようになります。
従って、解答例は、【 h 】:Originヘッダフィールドの値、【 i 】:許可するオリジンのリスト、【 j 】:一致」です。
おわりに
今回解説した問1はWebアプリケーションに関わる問題ですが、コーディングの知識だけではなく、オリジンやCORSなど、Webの仕組み全般についての知識が要求されています。CORSの仕組みは問題文中に詳細な説明があるため、いくつかの設問は本文をよく読み込むことで正解を導くことも可能ですが、HTTPやCookie、CORSについての知識を前提としているため、解答者の保有スキルによって難易度は大きく変わる問題と言えます。
Webアプリケーションのセキュリティを考える場合、「HTTP」「Cookie」「セッション管理」「同一生成元ポリシ」「CORS」に関する知識は非常に重要です。情報処理安全確保支援士試験でもこれらに関する問題は頻繁に出題されていますので、基礎から活用例まで幅広く学習を深めていくことが大事です。
なお、学習する際には、以下の資料が大変参考になります。試験問題で出てきた用語や考え方を深く確認したい方は、これらの資料もぜひご確認ください。
・安全なウェブサイトの作り方
・OWASP Top 10 2017
・MDN web docs 開発者による開発者のためのリソース
また、午後Ⅰ問題では、Webに限らずプログラミングやアプリケーションに関わる問題が毎回出題されています。情報処理安全確保支援士試験で出題される言語は「試験で使用する情報技術に関する用語・プログラム言語など(Ver.3.1)」に記載されており、「C++、Java、ECMAScriptの3言語」が該当します。関連する用語や考え方は午後Ⅱ問題でも出題されることがあるため、学習を深めていくことを推奨します。
次回は、平成31年度 春期試験 午後Ⅰ問題の問2を解説します。