情報処理安全確保支援士 2012年 春期 午後1 問01
脆弱性検査の結果とその後の対策に関する次の記述を読んで、設問1~3に答えよ。
A社は、衣料品を取り扱う会員制インターネット通販会社である。A社では、セキュリティ専門会社のB社に依頼して、Webアプリケーションの脆弱性検査を、年に4回定期的に実施している。検査を実施した結果、会員の属性情報の登録、変更などを行う会員情報管理システム(以下、Pシステムという)において、指摘事項が2件報告された。
A社情報システム部のX部長は、指摘事項の確認と対策の検討を、Y主任に指示した。
〔脆弱性検査の結果〕
Y主任は、早速、B社の検査担当者から、指摘事項2件についての詳細な説明を受けた。
指摘事項A:画面の遷移の中で、暗号化通信と非暗号化通信が混在しているが、暗号化通信でだけ使用されるべきクッキーに、a属性が設定されていないページが存在する。
指摘事項B:任意のスクリプトが実行可能であるページが存在する。
説明に当たってB社からは、指摘事項Aを検出したときのログイン操作直後のHTTPレスポンス(図1)、指摘事項Bを検出したときに使用されたHTTPリクエスト(図2)と、図2のHTTPリクエストに対するHTTPレスポンス(図3)が示された。検査においてフォーム認証に使用した会員IDとパスワードは、検査のために用意されたものである。



Y主任は、提示された図1~3の内容を手掛かりに、対象のプログラムのソースコードを調査し、指摘事項Aと指摘事項BがPシステムにおいて、脆弱性といえるものであることを確認した。
〔脆弱性の影響の検討〕
続いてY主任は、脆弱性の影響について検討を行った。まず、今回の指摘事項Aと指摘事項Bに対して、どのような攻撃があり得るか、また、その攻撃を受けた場合、どのような被害が予想されるかについて検討を行った。検討結果の抜粋は、表1のとおりである。

さらに、Y主任は、これまでに表1の攻撃及び被害が実際に起きているかどうかを、ログから確認することにした。
指摘事項Aで予想される攻撃である、セッションIDの盗聴については、ログから検出することは困難である。次善の策として、盗聴されたセッションIDが不正に使用されたことを検出するために、同一のセッションIDが、複数の送信元IPアドレスから送信されているリクエストをログから抽出することにした。この方法では、①正当なアクセスを誤って検出してしまう場合と、②不正なアクセスを検出できない場合があるが、それらの場合については容認することにした。
指摘事項Bに対する攻撃は、③HTTPアクセスログから検出することにした。ただし、この方法ではbメソッドが使用された場合にしか検出できない。
以上の方法で過去のログを確認したところ、不正使用や攻撃は検出されなかった。
〔改修方法の検討〕
Y主任は、脆弱性への対応を行うために、まず、指摘事項Bに該当する複数のプログラムのソースコードを再度確認した。該当するプログラムの一つを図4に示す。


このプログラムは、利用者が入力した文字列をダイアログに表示するために、受け取ったパラメタの値をスクリプトに埋め込み、動的にスクリプトを生成する。図4のc行目では、通常のHTMLにパラメタの値を埋め込むときと同じ方法で、エスケープ処理を行っていたことから、生成されるスクリプトに問題が生じてしまうことが分かった。
Y主任は、以上の検討結果から、指摘事項Aと指摘事項Bに対する改修方針を、表2のとおりにまとめた。
特に、表2中の指摘事項Bの改修方針を実現するために、図4のc行目のescape関数呼出しを、新たに作成するescape2関数(図5)呼出しに変更することにした。escape2関数では、意図したスクリプトが生成されるように、まず、スクリプト言語の文法上必要なエスケープ処理を行った後、更にescape関数でエスケープ処理を行う。
その後、Y主任は、X部長の承認を得た上で、改修作業を行い、脆弱性検査結果についての対策を完了した。
設問1:
問題文を見る模範解答
a:secure
b:GET
解説
解答の論理構成
-
指摘事項Aの原因確認
- 問題文では「暗号化通でだけ便用されるべきクッキーに、a属性が設定されていない」とあります。
- 暗号化通信(HTTPS)でのみクッキーを送付させる仕様はSet-Cookieヘッダの「Secure」属性です。したがって a には「secure」が入ります。
- 表2でも「暗号化通信でだけ使用するクッキーにa属性を設定する」と再度確認できます。
-
指摘事項Bのログ検出条件
- 問題文には「指摘事項Bに対する攻撃は、③HTTPアクセスログから検出する…ただし、この方法ではbメソッドが使用された場合にしか検出できない。」とあります。
- 一般的なWebサーバのアクセスログはリクエストラインのみを保存し、POSTボディは残りません。したがってクエリ文字列にスクリプトが含まれている場合に検出できるのはGETリクエストだけです。
- よって b には「GET」が入ります。
-
まとめ
- a → 「secure」
- b → 「GET」
誤りやすいポイント
- 「HttpOnly」を選んでしまう
クッキーをJavaScriptから参照できなくする属性であり、暗号化通信限定ではないため不適切です。 - 「POST」メソッドを入れてしまう
POSTボディはアクセスログに残らないことが多く、ログ検出の前提に合致しません。 - 属性名の大文字小文字
RFCでは「Secure」ですが、問題文ではすべて小文字で求められています。
FAQ
Q: 「secure」属性と「HttpOnly」属性は何が違いますか?
A: 「secure」はHTTPSでのみクッキーを送信させる属性、「HttpOnly」はブラウザのスクリプトからクッキーを参照できなくする属性です。目的が異なるので併用することもあります。
A: 「secure」はHTTPSでのみクッキーを送信させる属性、「HttpOnly」はブラウザのスクリプトからクッキーを参照できなくする属性です。目的が異なるので併用することもあります。
Q: POSTメソッドでも攻撃は成立しますか?
A: 成立します。ただし今回の“ログからの検出”という運用対策では、サーバに残る情報が少ないためPOSTでは検出が困難というだけです。
A: 成立します。ただし今回の“ログからの検出”という運用対策では、サーバに残る情報が少ないためPOSTでは検出が困難というだけです。
Q: escape関数だけではXSSを防げない理由は?
A: HTMLコンテキスト用のエスケープしか行わないため、JavaScript文字列リテラル内に埋め込むと文法が崩れ、スクリプトが注入できます。文脈ごとのエスケープが必要です。
A: HTMLコンテキスト用のエスケープしか行わないため、JavaScript文字列リテラル内に埋め込むと文法が崩れ、スクリプトが注入できます。文脈ごとのエスケープが必要です。
関連キーワード: Secure属性、セッションハイジャック、XSS, HTTPメソッド、アクセスログ
設問2:〔脆弱性の影響の検討〕について、(1)〜(3)に答えよ。
問題文を見る(1)本文中の下線①について、正当なアクセスを誤って検出してしまう場合とはどのような場合か。40字以内で具体的に述べよ。
模範解答
端末のIPアドレスがセッションの途中で変わるようなアクセスの場合
解説
解答の論理構成
-
検出ロジックの確認
― 本文には「同一のセッションIDが、複数の送信元IPアドレスから送信されているリクエストをログから抽出することにした。」とあります。
― つまり “セッションID → IPアドレス” が1対1であることを前提に不正利用をあぶり出す方式です。 -
誤検出が起こる条件を逆算
― 不正利用でなくても「同一のセッションID」が「複数の送信元IPアドレス」から届くことがあり得れば、正当なアクセスが不正と判定されてしまいます。 -
実際にあり得るシナリオ
― モバイル回線、プロキシ経由、社内NATなどでは通信経路の都合で「端末のIPアドレスがセッションの途中で変わる」ことがあります。
― この変化を検出ロジックは “複数IPからの同一セッションID” とみなすため、正当な利用者を誤検出します。 -
したがって解答は「端末のIPアドレスがセッションの途中で変わるようなアクセスの場合」となります。
誤りやすいポイント
- IPアドレスが変わる=常に不正と早合点しやすい。モバイル回線やロードバランサ配下を忘れがちです。
- 「セッションIDの使い回し」=クッキー盗難と単純連想し、IP変化という正常系を想定しない。
- 誤検出と検出漏れの双方を問う設問で、一方しか考慮せず解答を狭めてしまう。
FAQ
Q: 同じNATルータ配下ならプライベートIPが同じで誤検出しないのでは?
A: 送信元IPはインターネット上でのグローバルIPを指します。NATルータが複数あり経路が変わるとグローバルIPも変わり得ます。
A: 送信元IPはインターネット上でのグローバルIPを指します。NATルータが複数あり経路が変わるとグローバルIPも変わり得ます。
Q: User-Agentを併用して判定精度を上げられないのですか?
A: 併用は可能ですが、User-Agentは簡単に偽装できるため決定的な指標にはなりにくく、今回の簡易チェック方針では採用していません。
A: 併用は可能ですが、User-Agentは簡単に偽装できるため決定的な指標にはなりにくく、今回の簡易チェック方針では採用していません。
Q: HTTPS強制リダイレクトで指摘事項Aを防げばIPチェックは不要になりますか?
A: HTTPS強制で盗聴リスクは下がりますが、セッション固定やXSSなど他経路でセッションIDが流出する可能性は残るため、多層防御が望ましいです。
A: HTTPS強制で盗聴リスクは下がりますが、セッション固定やXSSなど他経路でセッションIDが流出する可能性は残るため、多層防御が望ましいです。
関連キーワード: セッションID, IPアドレス、ログ分析、認証セキュリティ、誤検出
設問2:〔脆弱性の影響の検討〕について、(1)〜(3)に答えよ。
問題文を見る(2)本文中の下線②について、不正なアクセスを検出できない場合とはどのような場合か。40字以内で具体的に述べよ。
模範解答
攻撃者と被害者が同一のプロキシサーバやNATを経由してアクセスした場合
解説
解答の論理構成
-
検出方法の前提
問題文では、指摘事項Aに対し
「同一のセッションIDが、複数の送信元IPアドレスから送信されているリクエストをログから抽出」
とあります。これは “送信元IPアドレスが異なる=別人” という仮定で不正利用を見付ける仕組みです。 -
検出漏れが起こる条件
しかし同じIPアドレスを共有する環境では、この仮定が成り立ちません。
例えば多数の端末が1つの “プロキシサーバ” や “NAT装置” を経由すると、外部からは全て同じ送信元IPに見えます。 -
不正利用なのに検出できないケース
攻撃者が被害者と同じ共有IP内にいる場合、 「セッションIDの盗難→同一IPから再利用」というシナリオになります。
ログ上は “同一IPからのアクセス” なので、上記抽出条件に該当せず検出不能です。 -
したがって解答
「攻撃者と被害者が同一のプロキシサーバやNATを経由してアクセスした場合」となります。
誤りやすいポイント
- 「モバイル回線のIPが変わると検出できない」と勘違い
⇒ 問題は “同じIPに見える” ケース。変わる方は①の誤検出リスクです。 - IPスプーフィングと混同
⇒ ここでは送信元IPを偽装する必要はなく、単に共有IP環境に居ればよい。 - 「CDN経由」など中継ノードを挙げるミス
⇒ 送信元が同一IPに見える具体例として、プロキシサーバやNATを押さえましょう。
FAQ
Q: 公共Wi─Fiスポットでも検出できないのですか?
A: はい。同じアクセスポイント配下でNAT変換されていれば、外部には同一IPに見えるため検出できません。
A: はい。同じアクセスポイント配下でNAT変換されていれば、外部には同一IPに見えるため検出できません。
Q: IP+ユーザエージェントを組み合わせれば検出漏れは防げますか?
A: 多少補強できますが、ユーザエージェントは簡単に偽装可能です。根本的には端末固有情報や二要素認証を組み合わせるべきです。
A: 多少補強できますが、ユーザエージェントは簡単に偽装可能です。根本的には端末固有情報や二要素認証を組み合わせるべきです。
Q: HTTPSだけにすれば今回の検出ロジックは不要ですか?
A: HTTPS化でセッションIDの盗聴リスクは大幅に低減しますが、XSSなど盗聴以外の経路は残るため監視は依然有効です。
A: HTTPS化でセッションIDの盗聴リスクは大幅に低減しますが、XSSなど盗聴以外の経路は残るため監視は依然有効です。
関連キーワード: セッションID, IPアドレス、プロキシ、NAT, 盗聴
設問2:〔脆弱性の影響の検討〕について、(1)〜(3)に答えよ。
問題文を見る(3)本文中の下線③について、どのような条件のログを検出すればよいか。35字以内で具体的に述べよ。
模範解答
クエリ文字列にスクリプトが含まれているログを検出する。
解説
解答の論理構成
- 【問題文】では「指摘事項Bに対する攻撃は、③HTTPアクセスログから検出することにした」とあります。したがって検出対象は“攻撃に用いられたHTTPリクエスト”です。
- 指摘事項Bの攻撃内容は表1にあるとおり「HTTPリクエストに挿入されたスクリプトが、ブラウザ上で実行される」ことです。
- 攻撃例として提示された【図2】の1行目は
「GET /mypage/progA?PID=xx&QTY=yy"><script>alert("script")</script> HTTP/1.1」
で、スクリプトがクエリ文字列に含まれています。 - さらに本文には「ただし、この方法ではbメソッドが使用された場合にしか検出できない」とあり、【図2】と照合するとbは「GET」と判断できます。GETであればリクエストラインにパラメータが露出し、ログにそのまま残るため検索が可能です。
- 以上より、「クエリ文字列にスクリプトが含まれているログ」を抽出すれば攻撃を検出できると論理付けられます。
誤りやすいポイント
- 攻撃スクリプトの有無をレスポンス側に探してしまう
→ 問題はリクエスト(アクセスログ)側で検出します。 - POSTリクエストの本文に含まれるスクリプトも対象にしようとする
→ 本文中にある制約で「bメソッドが使用された場合にしか検出できない」と明記されています。 - RefererやCookieヘッダに着目してしまう
→ 例示された攻撃はクエリ文字列へのスクリプト挿入であり、最優先で確認すべき箇所はリクエストラインです。 - セッションID重複検出(指摘事項Aの方法)と混同する
→ 指摘事項Bの検出は別ロジックであることに注意します。
FAQ
Q: なぜGETメソッド限定なのですか?
A: GETはパラメータがURL(クエリ文字列)に含まれるため、一般的なアクセスログにそのまま記録され、後から検索できます。POSTでは本文にパラメータが入るため通常のアクセスログには残りません。
A: GETはパラメータがURL(クエリ文字列)に含まれるため、一般的なアクセスログにそのまま記録され、後から検索できます。POSTでは本文にパラメータが入るため通常のアクセスログには残りません。
Q: 「スクリプトが含まれている」の判定基準はどこまで厳密にすべきですか?
A: 代表的には「<script>」「javascript:」「onerror=」などXSSに用いられる文字列パターンをブラックリスト方式で検索しますが、誤検出と漏れのバランスを考え、まずは <scriptをキーにする方法が現実的です。
A: 代表的には「<script>」「javascript:」「onerror=」などXSSに用いられる文字列パターンをブラックリスト方式で検索しますが、誤検出と漏れのバランスを考え、まずは <scriptをキーにする方法が現実的です。
Q: ログ検査だけでXSS攻撃を完全に防げますか?
A: いいえ。ログ検査は事後検知・調査の手段であり、本質的な対策はエスケープ処理やCSPなど“発生させない”技術を実装することです。
A: いいえ。ログ検査は事後検知・調査の手段であり、本質的な対策はエスケープ処理やCSPなど“発生させない”技術を実装することです。
関連キーワード: XSS, クエリ文字列、HTTPリクエスト、ログ解析、セッションID
設問3:〔改修方法の検討〕について、(1)、(2)に答えよ。
問題文を見る(1)本文中のcに入れる適切な行番号を一つ数字で答えよ。
模範解答
c:37
解説
解答の論理構成
- 問題文は、c行目について「受け取ったパラメタの値をスクリプトに埋め込み、動的にスクリプトを生成」し、かつ「通常のHTMLにパラメタの値を埋め込むときと同じ方法で、エスケープ処理を行っていた」と説明している。
- 図4のコードを確認すると、
• 35行目
out.println("- - results - - category: " + escape(category) + "
");
はHTMLの本文に文字列を埋め込んでいるだけで、スクリプト生成は行わない。
• 37行目
out.println("<a name="#" onclick="alert('" + escape(word) + "')">");
はonclick属性内にJavaScriptのalert() を動的生成しており、「パラメタの値をスクリプトに埋め込む」条件に合致する。 - したがって、cに入る行番号は「37」である。
誤りやすいポイント
- エスケープ関数escape() が両行に登場するため、「HTMLに値を埋め込む=脆弱」と早合点し、35行目を選択しがちです。
- 「スクリプト生成」というキーワードを見落とすと、HTML本文とJavaScript部分の文脈の違いに気付きにくいです。
- onclick属性内での文字列結合は、クロスサイトスクリプティング (XSS) が最も発生しやすい典型例であることを思い出せないと判断を誤ります。
FAQ
Q: なぜ35行目ではなく37行目が問題になるのですか?
A: 35行目はHTML本文に値を出力するだけで、ブラウザがJavaScriptとして解釈しません。一方37行目はonclick属性内にJavaScriptを構築しており、ユーザ入力がそのままスクリプトに混入するためXSSが成立します。
A: 35行目はHTML本文に値を出力するだけで、ブラウザがJavaScriptとして解釈しません。一方37行目はonclick属性内にJavaScriptを構築しており、ユーザ入力がそのままスクリプトに混入するためXSSが成立します。
Q: escape() を呼んでいるのにXSSを防げないのはなぜですか?
A: escape() はHTML用エスケープであり、JavaScript文字列リテラル向けのクォート ' や \ までは対象にしません。スクリプト文脈では別のエスケープが必要です。
A: escape() はHTML用エスケープであり、JavaScript文字列リテラル向けのクォート ' や \ までは対象にしません。スクリプト文脈では別のエスケープが必要です。
Q: onclickに限らずイベント属性はすべて危険ですか?
A: 基本的にユーザ入力をイベント属性に埋め込む場合は同様に危険です。外部JSファイルに処理を切り出し、属性には関数名だけを書く方法が推奨されます。
A: 基本的にユーザ入力をイベント属性に埋め込む場合は同様に危険です。外部JSファイルに処理を切り出し、属性には関数名だけを書く方法が推奨されます。
関連キーワード: クロスサイトスクリプティング、HTMLエスケープ、JavaScriptインジェクション、サニタイジング、セッション固定
設問3:〔改修方法の検討〕について、(1)、(2)に答えよ。
問題文を見る模範解答
①:d:\ (バックスラッシュ)
e:\ (バックスラッシュ+バックスラッシュ)
②:f:' (シングルクォート)
g:' (バックスラッシュ+シングルクォート)
解説
解答の論理構成
-
図4のプログラムは、onclick属性のJavaScript内に wordパラメタを
〈 ' + escape(word) + ' 〉という形でシングルクォート囲みで埋め込んでいます。
したがって、wordに
・スクリプト解釈用の バックスラッシュ
・囲み文字である シングルクォート
が現れると、構文が壊れ 「任意のスクリプトが実行可能」 という“指摘事項B”の脆弱性になります。 -
表2の改修方針では「出力するときの文脈に合わせたエスケープ処理を行う」と定義され、 そのために escape2関数を新設するとあります。
-
逃がすべき対象文字と置換後の文字列は、JavaScript文字列リテラルの規則から直接導けます。
- バックスラッシュ \ はエスケープ記号そのものなので \ に二重化する。
- シングルクォート ' は文字列終端の意味を持つので \’ へ変換する。
-
先にスクリプト文法上のエスケープ(上記2文字)を行い、続けて既存のescape関数で
HTMLエンティティ変換(&、<、>、")を実行するという仕様です。
誤りやすいポイント
- バックスラッシュを 一重 にしてしまい、結果としてブラウザが ' を +’ ではなく
エスケープ済みの ' と解釈するケース。 - ダブルクォート " を対象に含める 誤回答。今回はJavaScriptを '...' で囲んでいるため
ダブルクォートは文字列終端になりません。 - HTMLエンティティ(< など)だけで十分と考え、スクリプト文法上の
エスケープ処理を追加しないままescapeを呼び出すパターン。
FAQ
Q: ダブルクォート " をシングルクォート ' と同様にエスケープする必要はありませんか?
A: 今回のJavaScript文字列は シングルクォート囲みなので、" は終端文字ではなく、 スクリプト文法上の必須エスケープ対象ではありません。
A: 今回のJavaScript文字列は シングルクォート囲みなので、" は終端文字ではなく、 スクリプト文法上の必須エスケープ対象ではありません。
Q: エスケープ順序を逆にしても問題ないでしょうか?
A: いいえ。先にescapeを実行すると & などが出来上がり
バックスラッシュ挿入時に文字列がさらに変わる恐れがあります。
必ず「スクリプト用エスケープ → HTML用エスケープ」の順にしてください。
A: いいえ。先にescapeを実行すると & などが出来上がり
バックスラッシュ挿入時に文字列がさらに変わる恐れがあります。
必ず「スクリプト用エスケープ → HTML用エスケープ」の順にしてください。
Q: escape2の後にContent Security Policy (CSP) を導入すれば
シングルクォートのエスケープは不要ですか?
A: CSPは強力ですが、既存コードのXSS要因を除去しておくことが前提です。
本設問ではプログラム単体で安全になる手当てが求められています。
シングルクォートのエスケープは不要ですか?
A: CSPは強力ですが、既存コードのXSS要因を除去しておくことが前提です。
本設問ではプログラム単体で安全になる手当てが求められています。
関連キーワード: XSS, JavaScriptエスケープ、HTMLエスケープ、クッキー属性、セッション固定





