‹ ぱすてく

情報処理安全確保支援士試験

平成25年度 秋期 午後Ⅰ(旧試験)

平成25年度 秋期に実施された情報処理安全確保支援士試験 午後Ⅰの全3問(記述式)の全設問に,運営者が独自に書いた解説を付けています。事例本文のどこが根拠になるかを示し,IPA の解答例・採点講評と並べています。

この試験について:情報処理安全確保支援士試験について

この年度を解いてみる

問1 Web システムのクロスサイトスクリプティング対策

Web システムのクロスサイトスクリプティング対策に関する次の記述を読んで,設問1,2に答えよ。

E 社は,提携店舗数 100 店の賃貸不動産仲介業者である。E 社では,3 年前に開設した Web システム(以下,E システムという)を用いて賃貸物件情報を提供している。E システムの運用はシステム部が担当し,E システムの保守とコンテンツの開発は E システムの開発を担当した B 社に委託している。

E 社は,E システムをインターネットに公開することを踏まえて,IPA が公表している“安全なウェブサイトの作り方”のチェックリストを参考にしてセキュリティ対策の実施項目を作成し,その実施項目に従って Java で開発するよう B 社に依頼していた。対策の実施項目のうち,クロスサイトスクリプティング(以下,XSS という)対策の実施項目を,表1に示す。

XSS 対策の実施項目の表。項番①:HTML テキストの入力を許可しない仕様とする。項番②:Web ページに出力する全ての要素に対して,エスケープ処理を施す。項番③:URL を出力するときは,“http://”又は“https://”で始まる URL だけを許可する。項番④:スクリプト要素の内容(“<script>…</script>”の“…”部分)を動的に生成しない。項番⑤:スタイルシートを任意のサイトから取り込めるようにしない。項番⑥:HTTP レスポンスヘッダの Content-Type フィールドに文字コード(charset)を指定する。
表1 XSS 対策の実施項目

〔社内検査〕

E システム開発後,他社の Web サイトで XSS 対策漏れが原因の事故が多発したことから,E システムにも問題が潜在していることが懸念された。そこで容易に検査できる方法はないかと探していたところ,基本的な XSS 対策を実施しているかどうかを診断する“ウェブ健康診断仕様”(以下,Web 健康診断という)が,“安全なウェブサイトの作り方”の別冊として IPA から公表されているとの情報を得た。表2は Web 健康診断に基づいて作成した XSS 対策の判定基準である。システム部の C 部長は,表2の内容であれば,社内で検査できると考え,若手の D 君を担当に指名した。

表2の判定基準では,“対象画面”の“検査文字列を入力する場所”に“入力する検査文字列”を入力した場合に,“脆弱性ありと判定する基準”で示された基準で脆弱性ありと判定する。

列は左から検出パターン,対象画面,検査文字列を入力する場所,入力する検査文字列,脆弱性ありと判定する基準。対象画面は全パターン共通で“・入力内容確認画面 ・エラー画面”。検出パターン1:GET パラメタ及び POST パラメタに,検査文字列 '>"><hr> を入力する。検出パターン2:GET パラメタ及び POST パラメタに,検査文字列 '>"><script>alert(document.cookie)</script> を入力する。パターン1と2の判定基準は共通で,“HTTP レスポンスボディに検査文字列がエスケープ処理などを行われずに出力される場合,脆弱性ありと判定”。検出パターン3:URL 中最後の“/”に続く文字列に,検査文字列 <script>alert(document.cookie)</script> を入力する。判定基準は“同上。例えば,URL が“http://www.aaaa.jp/bbbb/index.html”で,“index.html”の部分に検査文字列をエンコードせずに挿入したときエスケープされずに出力される場合,脆弱性ありと判定”。検出パターン4:GET パラメタ及び POST パラメタに,検査文字列 javascript:alert(document.cookie); を入力する。判定基準は“HTTP レスポンスボディの特定の URI 属性(src, action, background, href, content)に検査文字列が出力される場合,脆弱性ありと判定”。
表2 Web 健康診断に基づいて作成した XSS 対策の判定基準

図1は E システムのうち,賃貸物件の選択結果を表示するプログラムである。D 君が表2の判定基準に基づいて検査をしたところ,検出パターン a の検査で脆弱性ありと判定された。その原因箇所は図1のプログラムの b 行目であった。図1に,他の脆弱性ありと判定されたものはなかった。

Java のプログラム(SelectWin)。(省略)〔package, import 宣言など〕
1 public class SelectWin extends HttpServlet {
2   public void doGet(HttpServletRequest request, HttpServletResponse response)
3     throws IOException, ServletException
4   {
5     response.setContentType("text/html; charset=\"UTF-8\"");
6     request.setCharacterEncoding("UTF-8");
/* パラメタ name(物件名称),loc(地区名)及び url(URL 情報)を取得 */
7     String rqName = request.getParameter("name");
8     String rqLoc = request.getParameter("loc");
(省略)〔rqName, rqLoc の文字化け対策〕
9     String rqUrl = request.getParameter("url");
/* 画面の HTML を出力 */
10    PrintWriter out = response.getWriter();
11    out.println("<html>");
12    out.println("<head>");
13    out.println("<title>賃貸物件の選択結果</title>");
14    out.println("</head>");
15    out.println("<body>");
16    out.println("<h3>詳細表示を開く</h3>");
17    out.println("<p>");
/* 選択された賃貸物件の詳細を開くリンクを作成 */
18    out.print ("<a href=\"" + escapeHTML(rqUrl) + "\">");
19    out.print (" 【" + escapeHTML(rqLoc) + "】 ");
20    out.println(escapeHTML(rqName) + "</a>");
21    out.println("</body>");
22    out.println("</html>");
23  }
(省略)〔その他の必要なメソッドなど〕
注記 escapeHTML は HTML の特殊文字 5 文字(<, >, &, ", ')のエスケープ処理を行うメソッドとして別途定義されている。
図1 賃貸物件の選択結果を表示するプログラム

〔詳細な診断の受診〕

表2の判定基準に基づいた社内検査で脆弱性が検出されたことから,C 部長は詳細な診断を受ける必要があると判断し,セキュリティ専門会社の F 社に詳細な診断を依頼した。F 社では,インターネット経由での E システムの診断とサーバプログラムのソースコードレビューを行った。F 社による診断結果を,図2に示す。

XSS 対策に関する診断結果。この脆弱性は,表1の実施項目①〜⑥が全て正しく実施済みであれば発生しない。確認した範囲で現状の実施状況をまとめると次のとおりである。表(実施項目/実施状況/備考)。①/合格/画面からの入力で HTML テキストを必要としているものも,許可しているものもない。②/一部不合格/社内検査の検査対象に関してはエスケープ処理が施されている。しかし,社内検査の検査対象以外に,対策漏れがある。③/不合格/URI 属性出力に対しては制限が必要である。④/不合格/スクリプト要素の内容を動的に生成している。命令として解釈される可能性がある。⑤/合格/E システム以外のスタイルシートは使用されておらず,任意のサイトから取り込めるようになっていない。⑥/合格/文字コードは全て指定されている。
図2 F 社による診断結果(抜粋)

〔プログラムの修正〕

図3の賃貸物件の検索画面を表示するプログラムでは,賃貸物件を検索するキーワードと地区名を設定するための画面を表示する。その次に呼び出される図4の賃貸物件の検索結果を表示するプログラムでは,そのキーワードと地区名を用いて賃貸物件を検索し,その結果をオプションメニューで表示する。オプションの選択が変更された際に,表示用に用意されているテキスト領域に,賃貸物件の情報を“【地区名】説明”の形式で表示する。選択ボタンが押下されると,図1のプログラムが呼び出される。

F 社による診断結果に基づき,図3と図4のプログラムを詳しく検討し,次のとおり問題点を整理して修正することとした。

Java のプログラム(SelectKey)。(省略)〔package, import 宣言など〕
1 public class SelectKey extends HttpServlet {
2   public void doGet(HttpServletRequest request, HttpServletResponse response)
3     throws IOException, ServletException
4   {
5     String rsKey, rsLoc;
/* rsKey にデータベースに登録されたキーワードで検索回数が一番多いものを取得
   rsLoc にデータベースに登録された選択候補地区名を取得,選択候補地区名の値は運用者が設定 */
6     response.setContentType("text/html; charset=\"UTF-8\"");
7     request.setCharacterEncoding("UTF-8");
/* 画面の HTML を出力 */
8     PrintWriter out = response.getWriter();
9     out.println("<html>");
10    out.println("<head>");
11    out.println("<title>賃貸物件の検索</title>");
12    out.println("</head>");
13    out.println("<body>");
14    out.println("<h3>検索キーワードの設定</h3>");
(省略)〔データベースに登録されたキーワードで検索回数が一番多いものを rsKey として取得〕
15    out.println("<br>");
16    out.println("<form action=\"SelectURL\" method=\"GET\">");
17    out.println("よく用いられるキーワード:" + rsKey);
18    out.println("<br>");
19    out.println("検索に用いるキーワードを入力してください:");
20    out.println("<input type=\"text\" size=\"20\" name=\"key\">");
21    out.println("<br>");
22    out.println("物件の地区名を選択してください:");
23    out.println("<select name=\"loc\">");
(省略)〔データベースから選択候補地区名を検索
  検索結果から選択候補地区名を rsLoc として繰返し取得〕
24    out.println("<option value=\"" + rsLoc + "\">" + rsLoc + "</option>");
(省略)〔繰返しはここまで〕
25    out.println("</select>");
26    out.println("<br>");
27    out.println("<input type=\"submit\" value=\"選択\">");
28    out.println("</form>");
29    out.println("</body>");
30    out.println("</html>");
31  }
(省略)〔その他の必要なメソッドなど〕
図3 賃貸物件の検索画面を表示するプログラム
Java のプログラム(SelectURL)。(省略)〔package, import 宣言など〕
1 public class SelectURL extends HttpServlet {
2   public void doGet(HttpServletRequest request, HttpServletResponse response)
3     throws IOException, ServletException
4   {
5     response.setContentType("text/html; charset=\"UTF-8\"");
6     request.setCharacterEncoding("UTF-8");
/* パラメタ key(キーワード)と loc(地区名)を取得 */
7     String rqKey = request.getParameter("key");
8     String rqLoc = request.getParameter("loc");
(省略)〔rqKey, rqLoc の文字化け対策〕
/* データベースから物件名称(rsName),URL 情報(rsUrl)及び説明(rsText)を取得
   これらの値は運用者が設定 */
9     String rsName, rsUrl, rsText;
(省略)〔データベースから rqLoc と rqKey の値を用いて賃貸物件を検索〕
/* 画面の HTML を出力 */
10    PrintWriter out = response.getWriter();
11    out.println("<html>");
12    out.println("<head>");
13    out.println("<title>賃貸物件の検索結果</title>");
14    out.println("<script type=\"text/javascript\">");
15    out.println("<!--");
/* 選択ボタン押下時に選ばれている select オプションの値を変数 url と name の値に設定 */
16    out.println("function setValue() {");
17    out.println("  var index = document.form1.menu1.selectedIndex;");
18    out.print ("  document.form1.url.value = ");
19    out.println("document.form1.menu1.options[index].value;");
20    out.print ("  document.form1.name.value = ");
21    out.println("document.form1.menu1.options[index].label;");
22    out.println("}");
/* オプションの選択が変更された際に msg1 のテキスト領域に“【地区名】説明”として表示 */
23    out.println("function onSet() {");
24    out.println("  var index = document.form1.menu1.selectedIndex;");
25    out.print ("  document.form1.msg1.value = \"【\" + ");
26    out.print ("\"" + escapeHTML(rqLoc) + "\"");
27    out.println(" + \"】\" +  document.form1.menu1.options[index].text;");
28    out.println("}");
29    out.println("// -->");
30    out.println("</script>");
31    out.println("</head>");
32    out.println("<body>");
33    out.println("<h3>詳細を表示する物件の選択</h3>");
34    out.println("<br>");
35    out.println("キーワード【" + escapeHTML(rqKey) + "】 ");
36    out.println("<br>");
37    out.println("<form name=\"form1\" action=\"SelectWin\" method=\"GET\">");
38    out.println("<input type=\"text\" size=\"50\" name=\"msg1\" readonly>");
39    out.println("<br>");
40    out.println("<select name=\"menu1\" onChange=\"onSet()\">");
(省略)〔検索結果から物件名称(rsName),URL 情報(rsUrl)及び説明(rsText)を繰返し取得〕
41    out.print ("<option label=\"" + escapeHTML(rsName) + "\" value=\"");
42    out.println(escapeHTML(rsUrl) + "\">" + escapeHTML(rsText) + "</option>");
(省略)〔繰返しはここまで〕
43    out.println("</select>");
44    out.println("<br>");
45    out.println("<input type=\"hidden\" name=\"url\" value=\"\">");
46    out.println("<input type=\"hidden\" name=\"name\" value=\"\">");
47    out.print ("<input type=\"hidden\" name=\"loc\" value=\"");
48    out.println(escapeHTML(rqLoc) + "\">");
49    out.println("<input type=\"submit\" value=\"選択\" onclick=\"setValue()\">");(次ページに続く)
図4 賃貸物件の検索結果を表示するプログラム
図4の続き。50 out.println("</form>");
51 out.println("</body>");
52 out.println("</html>");
(省略)〔検索に使用したキーワード rqKey の値をデータベースに登録〕
53 }
(省略)〔その他の必要なメソッドなど〕
図4 賃貸物件の検索結果を表示するプログラム(続き)

E 社は,今回の XSS 対策以外の対策も含めて E システムの修正を B 社に依頼し,修正後,再度 F 社の診断を受診し,問題が解決していることを確認した。

出題趣旨(IPA)

クロスサイトスクリプティングは昔から広く知られる脆弱性であるが,対策漏れが発生しやすく,現在でも取り組むべき代表的脆弱性である。本問では,IPAが公表している“安全なウェブサイトの作り方”とその別冊として公表された“ウェブ健康診断仕様”を題材に,クロスサイトスクリプティング対策として行うべき実施項目と検査基準に関して出題した。Webアプリケーション開発での脆弱性への対応能力について問う。

採点講評(問全体・IPA)

問1では,クロスサイトスクリプティングについて出題した。全体として正答率は低く,広く知られた脆弱性のはずだが,正確には理解されていないようであった。

この問題では,IPAが公表している脆弱性対策資料を題材にした。この資料を活用して,試験だけではなく,実際のアプリケーション開発時も脆弱性への対策を正確かつ確実に実施してほしい。

設問と解答例

設問1(1) 解答欄4つ

表2の検出パターン 1〜4 は,それぞれ表1の②〜⑥のどの実施項目の不備を検出できるものか。それぞれに該当する最も適切な項番を答えよ。

〔パターン1〕解答例

  • ②

〔パターン2〕解答例

  • ②

〔パターン3〕解答例

  • ②

〔パターン4〕解答例

  • ③
解説

本文の根拠

表2 検出パターン1・2

HTTP レスポンスボディに検査文字列がエスケープ処理などを行われずに出力される場合,脆弱性ありと判定

表2 検出パターン4

HTTP レスポンスボディの特定の URI 属性(src, action, background, href, content)に検査文字列が出力される場合,脆弱性ありと判定

表1 項番③

URL を出力するときは,“http://”又は“https://”で始まる URL だけを許可する。

表2の“脆弱性ありと判定する基準”を,表1の実施項目の文言と突き合わせる。検出パターン1・2・3は,検査文字列が“エスケープ処理などを行われずに出力される”ことを基準にしており,表1では②(Web ページに出力する全ての要素に対して,エスケープ処理を施す)の不備を見つけるものである。パターン3は入力場所が URL 中の最後の“/”に続く文字列という違いだけで,基準は“同上”とされているので同じく②になる。

パターン4は検査文字列が“javascript:alert(document.cookie);”で,基準は URI 属性(src,href など)に検査文字列が出力されるかどうかである。これは URL の先頭を“http://”か“https://”に限る③の不備を見つけるものである。IPA の“安全なウェブサイトの作り方”も,リンク先の URL には“http://”や“https://”から始まる文字列だけを許可するよう求めている。

ここは選択式なので字数の詰め方は要らない。②と③は,出力内容そのものを無害化するか(②),出力してよい URL の形を限るか(③)という違いで見分ける。講評が指摘するとおり,選択問題でも正答率が低かったので,表2の基準の文言が表1のどの項番に対応するかを一つずつ確かめるとよい。

採点講評(IPA)

設問1(1)では判定基準と対策との関連性について出題した。選択問題にもかかわらず,正答率が低かった。

設問1(2) 解答欄1つ

本文中の a に入れる適切な検出パターンを 1〜4 から選び答えよ。

〔a〕解答例

  • 4
解説

本文の根拠

図1 18行目

escapeHTML(rqUrl)

図1 注記

escapeHTML は HTML の特殊文字 5 文字

表2 検出パターン4

javascript:alert(document.cookie);

図2 項目③

URI 属性出力に対しては制限が必要である。

図1では,リクエストパラメタ name,loc,url の値を取得した後,18〜20行目の出力でいずれも escapeHTML を通している。escapeHTML が処理するのは注記にある特殊文字5文字(<,>,&,",')だけである。したがって,表2の検査文字列のうち,これら5文字を含むパターン1・2('>"><hr> など)は無害化されて出力され,脆弱性ありとは判定されない。

パターン4の“javascript:alert(document.cookie);”にはこの5文字が一つも含まれないので,エスケープしても形が変わらない。これが18行目の href 属性(URI 属性)にそのまま出力されるので,パターン4で脆弱性ありと判定される。図2の診断結果にも,③について“URI 属性出力に対しては制限が必要である。”とある。

ここは番号を答える設問なので字数の詰め方は要らない。本文は,他の脆弱性ありと判定されたものはなかったとしているので,パターン1〜3は除いて4と答える。

採点講評(IPA)

設問1の(2)~(4),設問2(1)~(3),(5),(6)ではそれぞれ原因箇所,問題の種類,対策方法を出題した。原因箇所を正しく特定できると正解を導き出せる。また,原因箇所の特定ができなくても,問題文中の診断結果をよく読めば,問題の種類を特定でき,対策方法を導き出せる。これらの関係を別々に考えるのではなく,一組として理解できれば,さらに正答率が高まるはずである。

設問1(3) 解答欄1つ

本文中の b に入れる適切な行番号を答えよ。

〔b〕解答例

  • 18
解説

本文の根拠

図1 9行目

String rqUrl = request.getParameter("url");

図1 18行目

escapeHTML(rqUrl)

〔社内検査〕

図1に,他の脆弱性ありと判定されたものはなかった。

a で見たとおり,検出されたのはパターン4で,検査文字列は URL の値として扱われて URI 属性に出力される。図1で URL を扱うのは,パラメタ url を rqUrl に取得する9行目と,それを href 属性に書き出す18行目である。出力しているのは18行目なので,原因箇所は18行目になる。

18行目の“<a href="…">”は,escapeHTML でエスケープはしているが,URL の先頭が“http://”か“https://”かどうかは調べていない。9行目は値を受け取るだけで,出力の対策をする場所ではない。19,20行目は loc と name の出力で,表2のパターン4の対象(URI 属性)ではない。

行番号を答える設問なので字数の詰め方は要らない。設問(4)は,ここで答えた18行目に実施する対策を問うているので,a から b までを一組で考えるとよい(講評も,原因箇所を特定できれば正解を導けるとしている)。

採点講評(IPA)

設問1の(2)~(4),設問2(1)~(3),(5),(6)ではそれぞれ原因箇所,問題の種類,対策方法を出題した。原因箇所を正しく特定できると正解を導き出せる。また,原因箇所の特定ができなくても,問題文中の診断結果をよく読めば,問題の種類を特定でき,対策方法を導き出せる。これらの関係を別々に考えるのではなく,一組として理解できれば,さらに正答率が高まるはずである。

設問1(4) 40字以内

図1のプログラムの b 行目に対して実施する XSS 対策を 40 字以内で述べよ。

解答例

  • “http://”又は“https://”で始まるURLだけを許可する。
解説

本文の根拠

表1 項番③

URL を出力するときは,“http://”又は“https://”で始まる URL だけを許可する。

図2 項目③

URI 属性出力に対しては制限が必要である。

18行目の原因は,href 属性に出力する URL が“javascript:”で始まるものでも,escapeHTML を通ると変わらずに出力される点である。表1の実施項目③は,URL を出力するときに“http://”又は“https://”で始まる URL だけを許可するものなので,これを18行目の出力の前に実施する。IPA の“安全なウェブサイトの作り方”でも,リンク先の URL には“http://”や“https://”から始まる文字列のみを許可する方式(ホワイトリスト方式)で実装するよう求めている。

図2は③を“不合格”とし,備考に“URI 属性出力に対しては制限が必要である。”と書いている。②のエスケープ処理は18行目で行われているので,答えは②(エスケープ)ではなく③(URL の形を限る)の側になる。

40字以内の制限に対し,解答例は“http://”又は“https://”の引用符を含めて36字。“http://”と“https://”の二つの書き出しと,それ“だけを許可する”(許可する範囲を限る方式)という二つの要素を入れる。

採点講評(IPA)

設問1の(2)~(4),設問2(1)~(3),(5),(6)ではそれぞれ原因箇所,問題の種類,対策方法を出題した。原因箇所を正しく特定できると正解を導き出せる。また,原因箇所の特定ができなくても,問題文中の診断結果をよく読めば,問題の種類を特定でき,対策方法を導き出せる。これらの関係を別々に考えるのではなく,一組として理解できれば,さらに正答率が高まるはずである。

設問2(1) 解答欄2つ

本文中の c,d に入れる適切な行番号を答えよ。

〔c〕解答例

  • 17
  • 24

〔d〕解答例

  • 17
  • 24

〔備考〕c と d は順不同

解説

本文の根拠

図3 5〜6行目のコメント

rsKey にデータベースに登録されたキーワードで検索回数が一番多いものを取得

図3 17行目

+ rsKey);

図3 24行目

選択候補地区名の値は運用者が設定

図4 53行目の前

検索に使用したキーワード rqKey の値をデータベースに登録

図3では,画面の HTML を組み立てる出力のうち,escapeHTML を通していないものを探す。変数 rsKey を出力する17行目と,変数 rsLoc を option 要素の value 属性と内容に出力する24行目が,エスケープなしで出力している。この二つの行には,表1の②(エスケープ処理)に当たる対策が無い。

17行目の rsKey は,図4の末尾で検索に使ったキーワード rqKey がデータベースに登録され,図3で検索回数の一番多いものを取り出した値である。つまり利用者が入力した文字列がデータベースを経由して戻ってくるので,文字列の中にスクリプトが含まれていれば,そのまま出力されてしまう。24行目の rsLoc は運用者が設定した値だが,表1の②は“全ての要素”に対してエスケープ処理を施すとしているので,値の出どころによらず,施していなければ対策漏れである。

行番号を答える設問なので字数の詰め方は要らない。解答例の備考どおり,c と d は順不同で,17と24のどちらを先に書いてもよい。

採点講評(IPA)

設問1の(2)~(4),設問2(1)~(3),(5),(6)ではそれぞれ原因箇所,問題の種類,対策方法を出題した。原因箇所を正しく特定できると正解を導き出せる。また,原因箇所の特定ができなくても,問題文中の診断結果をよく読めば,問題の種類を特定でき,対策方法を導き出せる。これらの関係を別々に考えるのではなく,一組として理解できれば,さらに正答率が高まるはずである。

設問2(2) 解答欄1つ

本文中の e に入れる最も適切な実施項目を表1の②〜⑥から選び答えよ。

〔e〕解答例

  • ②
解説

本文の根拠

表1 項番②

Web ページに出力する全ての要素に対して,エスケープ処理を施す。

図2 項目②

社内検査の検査対象以外に,対策漏れがある。

c,d の17行目と24行目は,いずれも変数の値をそのまま出力していて,必要なエスケープ処理を施していない。表1でこれに当たるのは②(Web ページに出力する全ての要素に対して,エスケープ処理を施す)である。

図2でも②は“一部不合格”で,備考は“社内検査の検査対象に関してはエスケープ処理が施されている。しかし,社内検査の検査対象以外に,対策漏れがある。”とある。図1と図4はエスケープしているが,図3の二か所が抜けていた,という状況と一致する。

実施項目を選ぶ設問なので字数の詰め方は要らない。③(URL の形の制限)や④(script 要素)は,17行目・24行目の出力が表示するテキストやオプションの値であって URL でもスクリプトでもないので当たらない。

採点講評(IPA)

設問1の(2)~(4),設問2(1)~(3),(5),(6)ではそれぞれ原因箇所,問題の種類,対策方法を出題した。原因箇所を正しく特定できると正解を導き出せる。また,原因箇所の特定ができなくても,問題文中の診断結果をよく読めば,問題の種類を特定でき,対策方法を導き出せる。これらの関係を別々に考えるのではなく,一組として理解できれば,さらに正答率が高まるはずである。

設問2(3) 解答欄1つ

本文中の f に入れる適切な字句を,表2中の字句を用いて 20 字以内で述べよ。

〔f〕解答例

  • GETパラメタ及びPOSTパラメタ
解説

本文の根拠

表2 検出パターン1・2・4

GET パラメタ及び POST パラメタに

表2 検出パターン3

URL 中最後の“/”に続く文字列

図3 5〜6行目のコメント

選択候補地区名の値は運用者が設定

D 君の社内検査は表2の判定基準に従い,検査文字列を入力する場所は“GETパラメタ及びPOSTパラメタ”と“URL 中最後の“/”に続く文字列”に限られる。図3の17行目と24行目に出力される rsKey と rsLoc は,これらの入力場所から直接入る値ではなく,データベースから取り出した値である。そのため,表2の検査をしても,その出力に脆弱性があることは見つからない。

本文は“検査対象を f に限定している”と書いていて,“表2中の字句を用いて”と指示している。図3の rsKey と rsLoc はリクエストパラメタではないので,答えは表2の“検査文字列を入力する場所”の欄にある GET パラメタと POST パラメタを用いて書く。

20字以内の制限に対し,解答例は“GETパラメタ及びPOSTパラメタ”の17字。“GET”“POST”の二つとも落とさないこと。

採点講評(IPA)

設問1の(2)~(4),設問2(1)~(3),(5),(6)ではそれぞれ原因箇所,問題の種類,対策方法を出題した。原因箇所を正しく特定できると正解を導き出せる。また,原因箇所の特定ができなくても,問題文中の診断結果をよく読めば,問題の種類を特定でき,対策方法を導き出せる。これらの関係を別々に考えるのではなく,一組として理解できれば,さらに正答率が高まるはずである。

設問2(4) 解答欄1つ

本文中の g に入れる適切なメソッド名を答えよ。

〔g〕解答例

  • escapeHTML
解説

本文の根拠

図1 注記

escapeHTML は HTML の特殊文字 5 文字(<, >, &, ", ')のエスケープ処理を行うメソッドとして別途定義されている。

〔プログラムの修正〕(1)

定義されているメソッド

図3の修正は,17行目と24行目の出力にエスケープ処理を適用するものである。本文は“定義されているメソッド”を適用すると書いており,図1の注記が escapeHTML を“HTML の特殊文字5文字のエスケープ処理を行うメソッドとして別途定義されている”としている。図1の18〜20行目や図4の35行目,41〜42行目でも同じ escapeHTML が使われていて,同じ書き方で図3にも適用すればよい。

メソッド名は大文字・小文字を含めて原本どおりに書く(escapeHTML)。

メソッド名を答える設問なので字数の詰め方は要らない。講評も,プログラム中から読み取る設問で正答率は高かったとしている。

採点講評(IPA)

設問2(4)では,対策に用いるメソッド名をプログラム中から読み取ることについて出題した。正答率は高かった。

設問2(5) 解答欄1つ

本文中の h に入れる適切な行番号を答えよ。

〔h〕解答例

  • 26
解説

本文の根拠

図4 25〜27行目のコメントとその下

オプションの選択が変更された際に msg1 のテキスト領域に“【地区名】説明”として表示

図4 26行目

escapeHTML(rqLoc)

図2 項目④

スクリプト要素の内容を動的に生成している。命令として解釈される可能性がある。

図4の14〜30行目は,script 要素の中身(JavaScript)を out.print で一行ずつ出力して組み立てている。その中で,リクエストパラメタ loc の値 rqLoc を,26行目で escapeHTML を通してスクリプトの文字列リテラルとして埋め込んでいる。これは図2が④(スクリプト要素の内容を動的に生成しない)を“不合格”とし,“スクリプト要素の内容を動的に生成している。命令として解釈される可能性がある。”と指摘している箇所である。

他の動的な出力は,表示される HTML の本文(35行目の rqKey,41〜42行目の rsName,rsUrl,rsText)や属性値(47〜48行目の rqLoc)で,HTML としてエスケープされている。script 要素の中に値を埋め込んでいるのは26行目だけなので,原因は26行目になる。

行番号を答える設問なので字数の詰め方は要らない。IPA の“安全なウェブサイトの作り方”も,<script>…</script> 要素の内容を動的に生成する仕様は避けるよう勧めている。

採点講評(IPA)

設問1の(2)~(4),設問2(1)~(3),(5),(6)ではそれぞれ原因箇所,問題の種類,対策方法を出題した。原因箇所を正しく特定できると正解を導き出せる。また,原因箇所の特定ができなくても,問題文中の診断結果をよく読めば,問題の種類を特定でき,対策方法を導き出せる。これらの関係を別々に考えるのではなく,一組として理解できれば,さらに正答率が高まるはずである。

設問2(6) 解答欄1つ

本文中の i に入れる最も適切な実施項目を表1の②〜⑥から選び答えよ。

〔i〕解答例

  • ④
解説

本文の根拠

表1 項番④

スクリプト要素の内容(“<script>…</script>”の“…”部分)を動的に生成しない。

図2 項目④

スクリプト要素の内容を動的に生成している。命令として解釈される可能性がある。

h の26行目は,script 要素の内容に rqLoc を埋め込んでいる行である。表1でこれに当たるのは④(スクリプト要素の内容を動的に生成しない)で,図2の④の備考がそのまま“スクリプト要素の内容を動的に生成している。命令として解釈される可能性がある。”と書いている。

26行目は escapeHTML を通している(②は施している)が,図2が④を不合格とするとおり,スクリプト要素の内容を動的に生成していること自体が④の不備である。本文が“不十分であった”と書いているのは,②を全くしていないのではなく,④の観点で足りないという意味である。

実施項目を選ぶ設問なので字数の詰め方は要らない。②と④の違いは,②が出力内容を無害化する対策,④が出力する場所そのもの(スクリプト要素の内容)を動的にしない対策であること。

採点講評(IPA)

設問1の(2)~(4),設問2(1)~(3),(5),(6)ではそれぞれ原因箇所,問題の種類,対策方法を出題した。原因箇所を正しく特定できると正解を導き出せる。また,原因箇所の特定ができなくても,問題文中の診断結果をよく読めば,問題の種類を特定でき,対策方法を導き出せる。これらの関係を別々に考えるのではなく,一組として理解できれば,さらに正答率が高まるはずである。

設問2(7) 解答欄1つ

本文中の j に入れる適切な修正後の 1 行のソースコードを答えよ。

〔j〕解答例

  • out.print("document.form1.loc.value");
解説

本文の根拠

図4 17〜21行目のコメント

選択ボタン押下時に選ばれている select オプションの値を変数 url と name の値に設定

図4 25行目

document.form1.msg1.value

図4 47〜48行目

escapeHTML(rqLoc)

26行目の目的は,msg1 のテキスト領域に“【地区名】説明”の“地区名”として rqLoc の値を表示することである。スクリプトの中に値を書き込む代わりに,スクリプトが実行時に取り出すようにすれば,スクリプト要素の内容を動的に生成しないという④の対策になる。

図4の47〜48行目は,form1 の中に name="loc" の hidden フィールドを出力し,その value 属性に escapeHTML(rqLoc) を書き出している。つまり loc の値は既にフォームの項目として画面に載っている。したがって26行目を,その値を読む document.form1.loc.value に置き換えれば,25行目と27行目と合わせて“document.form1.msg1.value = "【" + document.form1.loc.value + "】 " + …”という式になり,rqLoc はスクリプトの中に出てこなくなる。

1行のソースコードで答える設問なので字数の詰め方は要らない。解答例は out.print("document.form1.loc.value"); で,out.print で書き出す文字列として“document.form1.loc.value”を引用符で囲むこと,末尾の“;”を落とさないこと。講評は,修正範囲をできるだけ限定してプログラムを修正する力をつけてほしいとしている。

採点講評(IPA)

設問2(7)では,特定した原因箇所を修正することについて出題した。無解答が多かった。できるだけ修正範囲を限定した上で,プログラムを修正する能力をつけてほしい。

出典:平成25年度 秋期 情報処理安全確保支援士試験 午後Ⅰ 問1(表記を一部改変)

問2 スマートフォンアプリケーション

スマートフォンアプリケーションに関する次の記述を読んで,設問1〜3に答えよ。

R 社は,従業員数 1,000 名の飲食店情報提供サービス会社である。R 社では,会員制 Web サイトで飲食店情報や割引クーポンを提供してきた。今回,会員数を更に増やすために,新たに R 社スマートフォンアプリケーション(以下,スマホアプリという)を利用したサービスを提供することを決め,プロジェクトを立ち上げた。プロジェクトリーダには,会員制 Web サイトの運用チームのメンバである B さんが任命された。

〔スマホアプリの概要〕

スマホアプリは,専用 Web サーバに設置する Web アプリケーション(以下,WebAP という)と通信する。WebAP は各飲食店の予約システムと通信して,予約を行う。スマホアプリを利用したサービスのシステム構成を図1に,スマホアプリと WebAP の動作概要(案)を表1に示す。

スマートフォン(スマホアプリ,アドレス帳)は,携帯電話網及びインターネットを経由して R 社に接続する。携帯電話網とインターネットは接続されている。インターネットには各飲食店の予約システムも接続されている。R 社の中では,インターネット側から順にルータ,FW(ファイアウォール)が接続され,FW には専用 Web サーバ(WebAP)と DB(データベース)サーバがそれぞれ接続されている。
図1 スマホアプリを利用したサービスのシステム構成
列はサービス,スマホアプリ,WebAP。(1) 情報配信:スマホアプリは新しい飲食店情報を WebAP に定期的に確認し,受信。WebAP は新しい飲食店情報を送信。(2) 飲食店検索:スマホアプリは地域,料理ジャンル,その他条件を選択して WebAP に送信し,検索結果を受信。WebAP は検索条件に合致する飲食店情報を送信。(3) 予約確認:スマホアプリは会員が予約した情報(以下,予約情報という)を WebAP から受信し,表示。WebAP は予約情報を送信。(4) 予約案内:スマホアプリはパーティ開催のために会員が予約した日時,店舗情報をパーティ参加予定者に案内するために,スマートフォン内のアドレス帳の全件データを WebAP に送信。WebAP はアドレス帳の全件データの中からパーティ参加予定者を選択して,そのメールアドレスに予約情報を記載した電子メール(以下,メールという)を送信。(5) 新規予約:スマホアプリは WebAP に予約要求を送信し,予約結果を WebAP から受信。WebAP はスマホアプリからの予約要求を飲食店の予約システムに送信し,予約結果をスマホアプリに送信。(6) 会員管理:スマホアプリは会員情報を受信して表示し,変更情報を WebAP に送信。WebAP は DB に登録している会員情報を送信し,変更情報を受信。
表1 スマホアプリと WebAP の動作概要(案)

〔スマホアプリの利用者認証〕

B さんは,スマホアプリを開発するに当たり,利用者認証について情報システム部の C 課長に相談した。次は,そのときの会話である。

〔予約案内サービスの問題〕

予約案内サービスは,利用者がパーティの参加予定者を利用者のスマートフォンのアドレス帳から選択すると,予約した日時,店舗の情報が参加予定者にメールで通知されるサービスである。具体的には次のような手順で行われる。

枠の中に“予約情報をお友達に案内しますか?”というメッセージと,“はい”“いいえ”の二つのボタンが表示されている確認画面。
図2 予約案内の確認画面

予約案内サービスについてプロジェクトのメンバが検討している際に,“図2の確認画面は,メールで予約情報を案内することについて同意確認を行っているが,アドレス帳の全件データが R 社に送信されることについては利用者に説明していないので問題である”という意見が多くのメンバから出た。

この意見に対して,“アドレス帳の全件データが送信されることについて確認画面で明確に説明し,同意確認を行う”という改善案が出た。しかし,説明しただけでは不十分であるとして,“アドレス帳の全件データの送信”が行われない別の案(以下,A 案という)が提示され,A 案を採用することになった。

B さんは A 案に基づき,仕様を策定した。また,スマホアプリの機能や動作を利用者に理解してもらえるよう,スマホアプリの導入時に表示される利用規約に,サービスについて詳細に記述することにした。B さんは仕様書を渡して開発業者にスマホアプリと WebAP の実装を依頼した。

〔WebAP の問題〕

開発後,スマホアプリと WebAP に関して第三者のセキュリティ評価を受けることが決定された。そこで B さんは,この分野で実績がある S 社を選んでセキュリティ評価を受けることにした。S 社によるセキュリティ評価の結果,WebAP の予約確認サービスには他人の予約情報を取得できてしまうという問題があるとの指摘を受けた。予約確認サービスのリクエストに含まれるパラメタの概要と,WebAP の予約確認サービスの動作概要を図3に示す。

この問題は,ある利用者(以下,利用者 V という)が,数日前に自分が発した予約確認のリクエスト中に含まれるパラメタのうちの二つのパラメタの値を変更して送信することによって,別の利用者(以下,利用者 W という)の予約情報を取得することができるというものであった。つまり,④利用者 V が予約情報を表示した際のリクエストである図4で使われるパラメタのうちの二つの値を変更して送信すると,利用者 W が予約情報を表示した際のリクエストである図5に対する応答を得られるというものである。セキュリティ評価では,仕様書などを参考にして,図4のリクエストに操作を加えた上で,WebAP に送信し,その応答を確認した。予約確認サービスについて,図4のリクエストに対して行った操作内容,及びリクエストに対して WebAP から受信した応答を表2に示す。

1. 予約確認サービスのリクエスト中のパラメタの概要。・LANG:言語を指定する値。・AppID:アプリケーション名。・AuthKey:初回ログイン時に発行される利用者認証用のキー。・YoyakuCode:年月と予約番号で構成された予約明細コード(予約番号は月ごとに全利用者の予約を 000001 から順番に割り振る)。・DateTime:スマートフォンの年月日及び時刻。2. WebAP の予約確認サービスの動作概要。(a) LANG の値が条件に含まれる文字以外の場合はアプリケーションエラーを返し,ja の場合は日本語,en の場合は英語で該当するコンテンツを返す。(b) AppID の値が URL に含まれていなければアプリケーションエラーを返す。(c) AuthKey の値が WebAP に保持されている利用者認証用の値と一致しない場合は認証エラーを返す。(d) YoyakuCode の値が DB サーバに保持されている予約明細コードと一致しない場合はアプリケーションエラーを返す。(e) DateTime の値とサーバ側の時刻とのずれが 5 分以上の場合はアプリケーションエラーを返す。(f) (a)〜(e)でエラーを返さない場合は該当の予約情報を返す。
図3 WebAP の予約確認サービスのパラメタと動作概要
列は左から,リクエストに対して行った操作内容,WebAP から受信した応答。LANG パラメータを削除:アプリケーションエラー。LANG パラメタの値を削除:アプリケーションエラー。LANG パラメタの値を 0 に変更:アプリケーションエラー。AppID パラメタを削除:アプリケーションエラー。AppID パラメタの値を新規予約サービス(ShinkiYoyaku)に変更:アプリケーションエラー。AuthKey パラメタを削除:認証エラー。AuthKey パラメタの値を削除:認証エラー。AuthKey パラメタの値を別利用者の値に変更:YoyakuCode が 201310000034 の予約情報の表示。YoyakuCode パラメタを削除:アプリケーションエラー。YoyakuCode パラメタの値を 201310000071 に変更:YoyakuCode が 201310000071 の予約情報の表示。DateTime パラメタを削除:アプリケーションエラー。DateTime パラメタの値を現在から 4 分前の時刻に変更:YoyakuCode の値に該当する予約情報の表示。DateTime パラメタの値を現在から 5 分前の時刻に変更:アプリケーションエラー。注記 操作するパラメタ以外の値はエラーにならない値を送るものとする。
表2 リクエストに対して行った操作内容,及び WebAP から受信した応答(抜粋)
POST /coupon/YoyakuKakunin HTTP/1.0
Host: www.r-sha.jp
Content-Type: text/xml
Content-length: 254

<?xml version="1.0" encoding="utf-8"?>
<XML>
    <LANG>ja</LANG>
    <AppID>YoyakuKakunin</AppID>
    <AuthKey>f3c7b48aac2da10596271a460fb317ac</AuthKey>
    <YoyakuCode>201310000034</YoyakuCode>
    <DateTime>2013 10 16 18:08:10</DateTime>
</XML>
図4 利用者 V が予約情報を表示した際のリクエスト
POST /coupon/YoyakuKakunin HTTP/1.0
Host: www.r-sha.jp
Content-Type: text/xml
Content-length: 254

<?xml version="1.0" encoding="utf-8"?>
<XML>
    <LANG>ja</LANG>
    <AppID>YoyakuKakunin</AppID>
    <AuthKey>6h4Y4io98Uy3q2rfbghyy45ecRyH44po</AuthKey>
    <YoyakuCode>201310000071</YoyakuCode>
    <DateTime>2013 10 16 20:17:14</DateTime>
</XML>
図5 利用者 W が予約情報を表示した際のリクエスト

〔指摘された問題への対応〕

B さんは S 社から指摘された問題について対応を検討し,開発業者に依頼して必要な修正を行った後,再度 S 社のセキュリティ評価を受けた。その結果,問題が解消されていることが確認できたので,スマホアプリを利用したサービスの提供を開始した。

出題趣旨(IPA)

スマートフォンの普及によって,スマートフォン上で動作するアプリケーションが数多く公開されている。しかし,スマートフォンアプリケーションのセキュリティ対応はまだ普及しておらず,注意が必要な状況である。本問では,スマートフォンアプリケーションを用いたサービスにおいてセキュリティ上考慮すべき点について出題した。認証の仕組み,実装上注意すべき点,及び脆弱性への対応能力について問う。

採点講評(問全体・IPA)

問2では,スマートフォンアプリケーション(以下,スマホアプリという)を用いたサービスにおいてセキュリティ上考慮すべき点について出題した。全体として正答率は低かった。

今後普及が見込まれるものも含め,スマホアプリのセキュリティについては,IPAが公表している情報セキュリティ対策資料なども参考にして,体系的に学習しておいてほしい。

設問と解答例

設問1(1) 20字以内

C 課長が本文中の下線①のように判断したのは,端末識別番号のどのような特性からか。20 字以内で述べよ。

解答例

  • 秘密情報ではないという特性
解説

本文の根拠

〔スマホアプリの利用者認証〕

端末識別番号の特性を考えると,自分の端末識別番号を別の端末で利用されて,サービスを不正利用されるおそれがある

〔スマホアプリの利用者認証〕

スマートフォンには,IMEI(International Mobile Equipment Identity)などの固有の端末識別番号が付与されています

端末識別番号は端末ごとに付与された固有のコードで,端末を区別する識別子ではあるが,利用者本人だけが知る秘密の値ではない。そのため,他人がその値を知って別の端末から使うことができてしまう。C 課長の指摘“自分の端末識別番号を別の端末で利用されて,サービスを不正利用されるおそれがある”は,この特性を言ったものである。

識別子(誰かを区別するもの)と認証情報(本人であることを示す秘密)は役割が違う。パスワードのように本人だけが知っているはずの値なら認証に使えるが,端末識別番号は秘密ではないので,そのまま利用者認証に使えない。

20字以内の制限に対し,解答例は“秘密情報ではないという特性”の13字。“秘密”という語を入れ,“識別番号は固有である”のような,認証に使えない理由にならない特性を書かない。

採点講評(IPA)

設問1では,スマホアプリの利用者認証について出題した。(2)は選択問題にもかかわらず,正答率は低かった。暗号方式やハッシュ関数について正確に覚えておいてほしい。

設問1(2)

本文中の下線②の鍵付きハッシュ関数を解答群の中から選び,記号で答えよ。解答群 ア AES イ HMAC ウ RIPEMD エ SHA-256

解答例

  • イ
解説

本文の根拠

〔スマホアプリの利用者認証〕

端末識別番号を基にスマホアプリ内で②鍵付きハッシュ関数で算出したハッシュ値を使うという方法はどうでしょう。

鍵付きハッシュ関数は,共有した秘密の鍵とハッシュ関数を組み合わせて,メッセージが改ざんされていないことと作成者を確認する仕組みで,HMAC がこれに当たる(RFC 2104 は HMAC を“暗号学的ハッシュ関数を用いたメッセージ認証の仕組み”とし,秘密の共有鍵と組み合わせて使うと説明している)。したがって解答群ではイの HMAC が正しい。

アの AES は FIPS 197 で規定されたブロック暗号で,ハッシュ関数ではない。ウの RIPEMD とエの SHA-256 はどちらもハッシュ関数だが,それ自体は鍵を取らない。SHA-256 は FIPS 180-4(Secure Hash Standard)のハッシュ関数に含まれる。

記号で答える設問なので字数の詰め方は要らない。講評は,選択問題でも正答率が低かったので,暗号方式やハッシュ関数について正確に覚えておいてほしいとしている。“鍵付き”という語が付くものは HMAC と覚える。

採点講評(IPA)

設問1では,スマホアプリの利用者認証について出題した。(2)は選択問題にもかかわらず,正答率は低かった。暗号方式やハッシュ関数について正確に覚えておいてほしい。

設問1(3) 30字以内

本文中の下線③について,どのような手法で鍵を知られてしまうか。30 字以内で述べよ。

解答例

  • スマホアプリをリバースエンジニアリングする。
解説

本文の根拠

〔スマホアプリの利用者認証〕

このスマホアプリ専用の鍵を一つ用意して,スマホアプリ内に格納しておけば,不正利用を防ぐことができるのではないか

〔スマホアプリの利用者認証〕

鍵を秘密にしておくことが難しい

B さんの案は,スマホアプリ専用の鍵を一つだけ用意して,全てのスマホアプリの中に格納する方法である。スマホアプリは誰でも入手できる配布物なので,攻撃者は自分のスマートフォンに入れたアプリを手元で解析できる。アプリの実行ファイルを解析して中身を読み取ること(リバースエンジニアリング)で,格納された鍵を取り出せてしまう。鍵が分かれば,攻撃者は他人の端末識別番号に対するハッシュ値も自分で計算できる。

鍵を共通で一つだけ持たせる以上,アプリに組み込んだ時点で配布先の全員に渡ったのと同じことになる。C 課長が“鍵を秘密にしておくことが難しい”と言うのは,この点を指している。

30字以内の制限に対し,解答例は“スマホアプリをリバースエンジニアリングする。”の22字。解答例の用語はリバースエンジニアリングで,アプリを解析して鍵を取り出すという筋を一文に収める。

採点講評(IPA)

設問1では,スマホアプリの利用者認証について出題した。(2)は選択問題にもかかわらず,正答率は低かった。暗号方式やハッシュ関数について正確に覚えておいてほしい。

設問2 40字以内

〔予約案内サービスの問題〕について,A 案の実現方法を,40 字以内で述べよ。

解答例

  • スマホアプリでメールアドレスを選択して,それをWebAPに送信する。
解説

本文の根拠

表1 (4) 予約案内

スマートフォン内のアドレス帳の全件データを WebAP に送信

〔予約案内サービスの問題〕

アドレス帳の全件データが R 社に送信されることについては利用者に説明していないので問題である

〔予約案内サービスの問題〕

“アドレス帳の全件データの送信”が行われない別の案(以下,A 案という)が提示され,A 案を採用することになった。

予約案内サービスの現行案は,利用者が“はい”を選ぶと,アドレス帳の全件データを WebAP に送り,WebAP が全件の中から参加予定者を選んでメールを送る。メンバが問題としたのは,利用者が案内したい人以外の分まで含めて R 社に送られる点である。A 案は“全件データの送信が行われない”案なので,友達の選択をスマートフォンのスマホアプリ側で済ませる形にすればよい。

つまり,アドレス帳から参加予定者のメールアドレスをスマホアプリ上で選択し,選択したものだけを WebAP に送る。WebAP は受け取ったメールアドレスに予約情報を記載したメールを送れば,要件(参加予定者にメールで案内する)を満たす。

40字以内の制限に対し,解答例は“スマホアプリでメールアドレスを選択して,それをWebAPに送信する。”の34字。“スマホアプリで選択する”と“選択したメールアドレスだけを WebAP に送る”の二つの要素を入れる。講評は,全件データを送信しなくても要件を満たせる手段を考えれば正解を導けるとしている。

採点講評(IPA)

設問2では,スマホアプリを利用したサービスにおける問題点の改善案について出題した。正答率は高かった。アドレス帳の全件データを送信しなくても要件を満たせる手段を考えれば,正解を導けるはずである。

設問3(1) 解答欄4つ

本文中の下線④について,利用者 V はどのパラメタの値を変更することによって利用者 W の予約情報を取得できたか。値を変更したパラメタを,図4から選び,二つ答えよ。また,それぞれ,どのような値にすることで予約情報を取得できたか。予約情報を取得できたパラメタの内容を答えよ。

〔パラメタ①〕解答例

  • YoyakuCode

〔内容①〕解答例

  • 利用者WのYoyakuCode

〔パラメタ②〕解答例

  • DateTime

〔内容②〕解答例

  • 送信時とのずれが5分未満の時刻

〔備考〕①と②は順不同

解説

本文の根拠

表2

AuthKey パラメタの値を別利用者の値に変更:YoyakuCode が 201310000034 の予約情報の表示

表2

YoyakuCode パラメタの値を 201310000071 に変更:YoyakuCode が 201310000071 の予約情報の表示

表2

DateTime パラメタの値を現在から 4 分前の時刻に変更:YoyakuCode の値に該当する予約情報の表示

図3 2.

DateTime の値とサーバ側の時刻とのずれが 5 分以上の場合はアプリケーションエラーを返す。

表2で,応答がアプリケーションエラーにも認証エラーにもならなかったのは,AuthKey を別利用者の値に変えたとき(YoyakuCode 34 の予約情報が返る),YoyakuCode を 201310000071 に変えたとき(71 の予約情報が返る),DateTime を現在から4分前にしたとき(YoyakuCode に該当する予約情報が返る)である。AuthKey を別利用者の値に変えても認証エラーにならず,もとの YoyakuCode(34)の予約情報が返るので,AuthKey と YoyakuCode の組合せは確かめられていない。図3の動作概要(c)は AuthKey が保持されている値と一致するかだけを,(d)は YoyakuCode が DB の予約明細コードと一致するかだけを見ている。両者の対応を見ていないので,利用者 V の AuthKey のまま YoyakuCode を利用者 W のものに変えれば,W の予約情報が返る。

一方,利用者 V のリクエスト(図4)の DateTime は数日前のものなので,(e)の“サーバ側の時刻とのずれが5分以上の場合はアプリケーションエラー”に当たる。したがって,もう一つ変更が要るのが DateTime で,送信時の時刻とのずれが5分未満の値にすれば,エラーにならずに W の予約情報(YoyakuCode 201310000071)が得られる。

二つのパラメタとその内容を,順不同で答える設問である。講評にあるとおり,DateTime を AuthKey と誤って答える例が多かったので,各パラメタの役割(AuthKey は利用者認証用のキーで,利用者 V の値のままでよい)を押さえる。解答例は“YoyakuCode=利用者WのYoyakuCode”,“DateTime=送信時とのずれが5分未満の時刻”。

採点講評(IPA)

設問3では,スマホアプリからのリクエストを処理するWebアプリケーションの問題点について出題した。(1)では二つのパラメタのうち“DateTime”を“AuthKey”と誤って解答した受験者が多かった。各パラメタの役割をよく理解して,正解を導いてほしかった。各パラメタの役割を理解できれば,(2)の追加する仕様として“YoyakuCode”と“AuthKey”との対応をチェックしなければならないということも導けるはずである。

設問3(2) 55字以内

他人の予約情報を取得できてしまう問題の対策として,図3の 2. にどのような仕様を追加すればよいか。追加する仕様を 55 字以内で述べよ。

解答例

  • YoyakuCodeの値がAuthKeyに対応する予約明細コードでないときはアプリケーションエラーを返す。
解説

本文の根拠

図3 2.(c)

AuthKey の値が WebAP に保持されている利用者認証用の値と一致しない場合は認証エラーを返す。

図3 2.(d)

YoyakuCode の値が DB サーバに保持されている予約明細コードと一致しない場合はアプリケーションエラーを返す。

他人の予約情報が取得できた原因は,AuthKey(認証済みの利用者を示す)と YoyakuCode(取得する予約明細)がそれぞれ別々にしか検査されておらず,二つの組合せが正しいかを確かめていないことである。図3の(c)は AuthKey の正しさだけ,(d)は YoyakuCode が DB に存在するかだけを見ている。

対策は,図3の2.に,その YoyakuCode が AuthKey の利用者自身の予約明細コードであるかを確かめる仕様を足すことである。対応していなければアプリケーションエラーを返す,とすれば,利用者 V が W の YoyakuCode を送っても情報は返らない。講評も,各パラメタの役割を理解できれば,YoyakuCode と AuthKey との対応をチェックしなければならないと導けるとしている。

55字以内の制限に対し,解答例は“YoyakuCodeの値がAuthKeyに対応する予約明細コードでないときはアプリケーションエラーを返す。”の53字。“対応するか確かめる”という条件と,“対応しなければエラーにする”という動作の二つを入れる。

採点講評(IPA)

設問3では,スマホアプリからのリクエストを処理するWebアプリケーションの問題点について出題した。(1)では二つのパラメタのうち“DateTime”を“AuthKey”と誤って解答した受験者が多かった。各パラメタの役割をよく理解して,正解を導いてほしかった。各パラメタの役割を理解できれば,(2)の追加する仕様として“YoyakuCode”と“AuthKey”との対応をチェックしなければならないということも導けるはずである。

出典:平成25年度 秋期 情報処理安全確保支援士試験 午後Ⅰ 問2(表記を一部改変)

問3 パブリッククラウドサービスの安全な利用

パブリッククラウドサービスの安全な利用に関する次の記述を読んで,設問1〜3に答えよ。

P 社は,経営コンサルティングを行っている,従業員数 60 名の会社であり,オフィスは東京にある。P 社には,オフィスに常勤している従業員と,主に客先や自宅で作業を行い,打合せのときだけオフィスに出社する従業員がいる。

社内にファイルサーバを設置して利用していたが,容量は十分であるものの検索の機能が不十分なことから,高機能のファイル共有サービス(以下,C サービスという)を提供している C 社と契約し,C サービスを利用し始めた。C サービスは,ブラウザ経由でアクセスできる SaaS 型パブリッククラウドのサービスである。P 社は,C サービスのサーバ内に P 社専用の領域を確保して,使用履歴,作成者名,メモなどの情報を添えた上でプロジェクト資料を保管している。P 社では,C サービスを活用することで,検索を高速に行えるようになり,業務効率が格段に向上するものと見込んでいる。

客先や自宅で作業を行う従業員には,社外で利用するための PC(以下,リモート PC という)を貸与しており,リモート PC をインターネットに接続できれば,リモートアクセスサーバ(RAS)経由で社内に接続し,社内システムにアクセスできる。客先や自宅から C サービスへのアクセスは,P 社ネットワークを経由せずに直接行う。ネットワーク構成の概要を図1に示す。

C サービス(C サービスのサーバ)とリモート PC がそれぞれインターネットに接続されている。インターネットは P 社ネットワークの FW(ファイアウォール)に接続される。P 社ネットワークでは,FW に RAS が接続されたセグメント,FW にプロキシサーバ,メールサーバ,Web サーバが接続されたセグメント,及び FW に PC(複数),ファイルサーバ,各種社内システムが接続された社内セグメントがある。
図1 ネットワーク構成の概要

〔C サービスの認証の強化〕

C サービスの契約と利用者管理については,総務部の X 課長が管理責任者を務めている。C サービスの採用については,C サービスが停止するような事態が発生した場合の事業継続について具体的対策を 1 年以内にまとめることを条件に社長の了承を得ていた。

契約後に,“あるパブリッククラウドサービスから,パブリッククラウドサービス会社の管理が不十分であったのでパスワードが大量に漏えいし,保存されていたデータが漏えいした”との報道があった。漏えいがあったパブリッククラウドサービス会社は C 社ではなかったが,報道を聞いた P 社の社長は,C サービスで保管している情報が漏えいして多大な損害が発生することを懸念し,X 課長に,C サービスを利用する際の認証の強化を検討するように指示した。X 課長は,部下の Q さんに,認証の強化策を調査するよう指示した。

Q さんはまず,C サービスのセキュリティに関する機能を表1にまとめた。

列は番号,項目,機能,備考。1 利用領域へのアクセス制御:契約会社ごとに割り当てられた領域だけにアクセスできる。/P 社が契約している領域は,200 G バイトである。2 利用者管理:契約会社内の管理責任者が,C サービスの利用者管理機能を使って自社の利用者 ID を管理する。/管理責任者は,アクセス履歴も確認できる。3 通信路暗号化:通信路は,サーバ認証による SSL で暗号化される。/(備考なし)。4 利用者認証:Web 画面で入力された利用者 ID(会社が利用者に付与したメールアドレスを利用者 ID として使用)とパスワードを,C サービス内で照合し,利用者認証を行っている。認証情報は,利用者 ID とパスワードが必須である。追加オプションとして,ログイン手続中に,利用者のメールアドレスに送信したワンタイムパスワードも入力する方式(以下,追加認証方式という)が用意されている。/全ての契約会社の利用者が,同じ URL の Web 画面からログインする。
表1 C サービスのセキュリティに関する機能(抜粋)

Q さんは,利用者が個人所有の携帯電話メールアドレスを活用することも視野に入れて,追加認証方式の利用について検討した。検討結果を(1)〜(3)に示す。

なお,P 社貸与の携帯電話は,盗難,紛失があった場合には必ず総務部に連絡することになっている。盗難届,紛失届を受けると総務部は,速やかに対応している。

利用者,管理責任者,C サービスの間の手順。(1) 利用者が,利用者の氏名,利用者 ID,ワンタイムパスワード送信先として希望する携帯電話メールアドレスを指定して,利用者 ID 登録の申請メールを作成し,送付(利用者のメールソフトから管理責任者のメールソフトへ申請メールを送る)。(2) 管理責任者が,管理者 ID とパスワードでログインした後,P 社利用者管理メニューを選択し,申請メールに基づいて利用者 ID を登録し,携帯電話メールアドレスを設定(管理責任者のブラウザから C サービスへ)。C サービスから管理責任者のブラウザへ仮パスワードが返る。(3) 管理責任者が,申請メールの携帯電話メールアドレスに仮パスワードを送信(管理責任者のメールソフトから利用者の携帯電話へ仮パスワードのメールを送る)。
図2 C サービスの利用者 ID 登録手順案(抜粋)
利用者のブラウザと C サービスの間の手順。(1) 利用者 ID とパスワードでログイン(仮パスワードの場合はログイン後にパスワードを変更)(ブラウザから C サービスへ)。(2) 利用者 ID に対して発行した,有効期間内のクッキーが送られてきた場合は(6)へ,それ以外の場合は(3)へ(C サービス側の処理)。(3) ワンタイムパスワードを生成し,携帯電話メールアドレスにメール送信(C サービスから携帯電話へ,“次のワンタイムパスワードを 30 分以内に C サービスに入力してください。例)02632891463”というメール)。C サービスからブラウザへワンタイムパスワード入力画面を送る。(4) ワンタイムパスワードを入力(ブラウザから C サービスへ。例)02632891463)。(5) 入力されたワンタイムパスワードが(3)で生成したものと同じ場合は認証成功(C サービス側の処理)。(6) C サービス利用画面を送信(C サービスからブラウザへ。利用者 ID に対するクッキー(注1,有効期間 90 日)を送る)。(7) クッキーを保存(ブラウザ)。(8) C サービスを利用(ブラウザから C サービスへ)。注1) (5)で認証が成功した場合だけ新たにクッキーが生成され,ブラウザに保存される。同じ利用者 ID に対してさらに他のクッキーが生成された場合でも,このクッキーは 90 日間有効である。注記 ログイン状態が 24 時間以上継続すると,自動的にログアウトされ,再度(1)から認証を行う。
図3 認証の手順案(抜粋)

Q さんが手順案を X 課長に提示したところ,“図2の手順では,①第三者が利用者になりすまして,仮パスワードを簡単に入手できてしまう”と指摘された。

さらに,“個人の携帯電話が盗まれ,かつ,利用者 ID とパスワードが推測されてしまったときに,② C サービスが不正使用され,しかも,それが長期間続くおそれがある”と指摘された。Q さんは,それらの指摘に対応するため,手順を修正し,対策を追加した。

修正後,追加認証方式は,十分な認証強度をもっていると判断され,P 社では追加認証方式を採用することになった。

〔C サービスを利用できない場合の対応〕

Q さんは,C サービスが停止するような事態が発生した場合の具体的な対策を検討し,表2にまとめた。

列は想定シナリオ,求められる業務レベル,事前準備として実施すること,想定シナリオが現実化してから実施すること。1行目:C サービスのサーバが被災し,停止するが,2 週間後に元どおり再開する。/業務効率の低下は許容するが,C サービス停止の 24 時間後にはプロジェクト資料を使う業務を再開できる。/[ a ] しておく。/ファイルサーバを用いて,[ b ] する。ただし,C サービス復旧後は,C サービスの利用を再開する。2行目:C 社が,1 か月後に C サービスの提供を終了すると通知し,実際に 1 か月後にサービス終了となる。/業務効率を低下させることなく業務を継続できる。/C サービスに代替可能なサービスを選定しておく。C サービスからの [ c ] を確認しておく。/代替サービスと契約する。代替サービスのセットアップ(ID 登録や設定)を行う。C サービスのデータを代替サービスに移行する。代替サービスの利用方法を従業員に周知する。
表2 C サービスが停止するような事態が発生した場合の具体的な対策

表2の内容は承認され,P 社の事業継続計画に盛り込まれた。定期的に訓練が実施されることになり,その後,新しい手順で C サービスの利用が開始された。

出題趣旨(IPA)

クラウドサービスの利用が広がっていくとともに,クラウドサービスを利用するためのパスワードの漏えい事件も頻発しており,より強固な認証方式が求められている。本問では,クラウドサービスを安全に利用するために有効な2要素認証について出題した。①2要素認証の仕組み,②悪意の第三者による不正利用を未然に防止する又は早期に検出することができる運用手順を立案する能力について問う。また,重要な業務におけるクラウドサービスの利用が進んでいる状況を踏まえ,クラウドサービスを利用する業務の継続について,ITの観点から事前に検討しておくべきことを問う。

採点講評(問全体・IPA)

問3では,パブリッククラウドサービスの業務利用を題材に,2要素認証の利用と事業継続について出題した。

設問と解答例

設問1 解答欄2つ

本文中の下線①について,どのような方法で第三者が仮パスワードを入手することができるか。また,その対策としてどのように本人確認すればよいか。それぞれ 25 字以内で述べよ。

〔方法〕解答例

  • 第三者自身の携帯電話メールアドレスを指定して申請

〔対策〕解答例

  • 管理責任者が申請者に直接申請の事実を確認する。
解説

本文の根拠

図2 (1)

利用者が,利用者の氏名,利用者 ID,ワンタイムパスワード送信先として希望する携帯電話メールアドレスを指定して,利用者 ID 登録の申請メールを作成し,送付

図2 (3)

管理責任者が,申請メールの携帯電話メールアドレスに仮パスワードを送信

図2の手順では,利用者になりたい人が申請メールに自分で希望する携帯電話メールアドレスを書き,管理責任者はその申請メールの携帯電話メールアドレスに仮パスワードを送る。申請メールは誰でも作成できるので,第三者が利用者になりすまして,自分の携帯電話メールアドレスを指定して申請すれば,仮パスワードが第三者の携帯電話に届く。これが“簡単に入手できてしまう”理由である。

対策は,申請メールの内容だけを信用せず,管理責任者が申請者に直接(電話や対面で)申請の事実を確認する,という本人確認である。申請メールの送信元は偽装できるし,メールアドレスと氏名が正しいかも申請メールだけでは分からないので,メールとは別の経路で確認する必要がある。

各25字以内の制限に対し,解答例は“第三者自身の携帯電話メールアドレスを指定して申請”が24字,“管理責任者が申請者に直接申請の事実を確認する。”が23字。方法には“第三者自身の”携帯電話メールアドレスを指定する,という点を,対策には“直接”確認するという点を入れる。

採点講評(IPA)

設問1では,2要素認証の利用を開始するプロセスについて出題した。2要素認証は,パスワードだけを用いた認証に比較すると安全性を格段に高めることが可能であるが,運用が不適切であるとその目的は達成できない。2要素認証の利用開始プロセスにおいてどのようなリスクがあるかを認識し,正しいプロセスを設計することが重要である。

設問2 解答欄2つ

本文中の下線②について,不正使用が長期間続く理由を 30 字以内で,対策を 70 字以内で具体的に述べよ。

〔理由〕解答例

  • クッキーが有効である間,不正使用が可能だから

〔対策〕解答例

  • Cサービスの認証に使用している携帯電話は,紛失や盗難時の届出を義務化し,届出を受けたら直ちにCサービスのパスワードを変更する。
解説

本文の根拠

図3 注1

このクッキーは 90 日間有効である。

図3 (2)

利用者 ID に対して発行した,有効期間内のクッキーが送られてきた場合は(6)へ,それ以外の場合は(3)へ

〔C サービスの認証の強化〕

盗難,紛失があった場合には必ず総務部に連絡することになっている。

図3の認証では,ログイン時に携帯電話に送られたワンタイムパスワードを入力して認証に成功すると,利用者 ID に対するクッキー(有効期間90日)がブラウザに保存される。(2)にあるとおり,有効期間内のクッキーが送られてくれば(3)のワンタイムパスワードの手順を飛ばして(6)に進む。個人の携帯電話が盗まれ,利用者 ID とパスワードが推測されると,盗んだ人がワンタイムパスワードを受け取って認証に成功し,クッキーを入手できる。その後は携帯電話を失った利用者が対処しても,クッキーが有効な間は,パスワードと携帯電話を使わずにログインできる。これが,不正使用が長期間続く理由(クッキーが有効である間,不正使用が可能なこと)である。

対策は,認証に使っている携帯電話について,紛失や盗難が起きたら届け出る義務を定め,総務部が届出を受けたらただちに C サービスのパスワードを変更する,という運用である。講評は,クッキーに関する対応を答える受験者が多かったが,効果は限定的であり,管理者が速やかに対応できるように確実に届け出させることが必要だとしている。

理由は30字以内に対し解答例が22字。対策は70字以内に対し解答例が63字で,“届出を義務化”“直ちにパスワードを変更”の二つの要素を入れる。

採点講評(IPA)

設問2では,2要素認証に利用している携帯電話に盗難,紛失があった際の対応について出題した。不正使用が継続してしまう理由については正答率が高かった。一方,その対策についての正答率は低く,クッキーに関する対応を答えた受験者が多く見受けられた。クッキーに関する対応では効果は限定的である。認証に利用している要素(この場合は携帯電話)の盗難・紛失に対しては,管理者が速やかに対応できるように,確実に届け出させることが必要であることを認識してほしい。

設問3 解答欄3つ

表2中の a 〜 c に入れる実施事項を,a は 35 字以内で,b は 25 字以内で,c は 15 字以内で述べよ。

〔a〕解答例

  • プロジェクト資料を定期的にファイルサーバへバックアップ

〔b〕解答例

  • バックアップしたプロジェクト資料を共有

〔c〕解答例

  • データの移行方法
解説

本文の根拠

表2 1行目 想定シナリオ・業務レベル

C サービス停止の 24 時間後にはプロジェクト資料を使う業務を再開できる。

表2 1行目 現実化してから

ファイルサーバを用いて,b する。

表2 2行目 現実化してから

C サービスのデータを代替サービスに移行する。

〔C サービスの認証の強化〕

社内にファイルサーバを設置して利用していたが

a・b は1行目(C サービスが2週間停止し,その後復旧する)の欄である。業務レベルは“停止の24時間後にはプロジェクト資料を使う業務を再開できる”で,停止中は C サービスを使えない。事前準備として,C サービスにあるプロジェクト資料を定期的にファイルサーバへバックアップしておけば(a),停止してから,ファイルサーバを用いてバックアップしたプロジェクト資料を共有する(b)ことで,業務を続けられる。P 社には社内のファイルサーバがもともとあり,リモート PC からも RAS 経由で社内システムにアクセスできる。

c は2行目(C サービスの提供が終了する)の欄である。現実化してから“C サービスのデータを代替サービスに移行する”ので,事前に,C サービスからデータをどのような方法で取り出せるか,つまりデータの移行方法を確認しておく。移行できなければ代替サービスに乗り換えても業務効率を落とさずに続けられない。

字数は a が35字以内(解答例27字),b が25字以内(19字),c が15字以内(8字)。a には“定期的に”と“ファイルサーバ”へ“バックアップ”の三つを,b には“バックアップしたプロジェクト資料”を“共有”するという二つを入れる。講評は,事業継続の設問は正答率が高く,可用性の検討と事前の対策の必要性は理解されていたとしている。

採点講評(IPA)

設問3では,パブリッククラウドサービスを用いた業務の事業継続に関して出題した。正答率は高かった。パブリッククラウドサービスを利用する際には,可用性についても検討を行い,必要な対策をあらかじめ実施することが必要であるという点については理解されていたようだ。

出典:平成25年度 秋期 情報処理安全確保支援士試験 午後Ⅰ 問3(表記を一部改変)