戦国IT - 情報処理技術者試験の過去問対策サイト
お知らせお問い合わせ料金プラン

情報処理安全確保支援士 2010年 秋期 午後201


安全なWebアプリケーションの開発に関する次の記述を読んで、設問 1~5 に答えよ。

   X社は従業員数 500名のソフトウェア会社で、10 本程度の人事関連のソフトウェアパッケージ(以下、パッケージという)を開発、保守している。X社には、顧客から、パッケージを購入せず、利用料を払ってアプリケーションサービス(以下、サービスという)を受けられるようにしてもらえないかという問合せが増えている。また、競合他社の中には、そのようなサービスを提供するところも出てきている。このような状況を受けて、X社の経営陣は、パッケージに加え、サービスも商品ラインナップに加える方針を決定した。  X社は、手始めに、既存のパッケージではなく、新規の分野でサービスを提供することにした。具体的には、既存顧客から要望が出ていた、店舗で働くパートタイマやアルバイトの勤怠管理を行うシステム(以下、勤怠管理システムという)でサービスを提供することにした。また、システムの稼働率を高めるために、単一のシステムを複数の顧客で共用するマルチテナントのシステムとする方針を決定した。  一方、X社はこれまでイントラネット向けのパッケージ開発を専業としてきたので、インターネットに公開する安全な Webアプリケーションの開発ノウハウがなかった。X社の経営陣は、今後、サービス提供を拡大していくためには、安全な Webアプリケーション開発のノウハウ獲得が不可欠であると考えた。そこで、今回の開発プロジェクトを通じて、そのノウハウを身につけ、今後のほかの開発プロジェクトにも適用していくことにした。特に、今回のシステムはマルチテナントのシステムなので、顧客間でデータが漏えいしないよう、十分に検討して対策を行うことにした。  X社のシステム関連部署は四つあり、パッケージ開発部、システム技術部、システム運用部及びプロジェクト管理部である。パッケージ開発部はパッケージの開発・保守を行っている。システム技術部は、社内のネットワーク、サーバ、ミドルウェアなどのインフラ(以下、インフラという)の設計・構築を担当している。システム運用部は社内のインフラの運用を担当しており、セキュリティパッチ適用などの情報セキュリティ運用も行っている。プロジェクト管理部は、社内の開発プロジェクトを管理する部署である。
 X社は勤怠管理システムの開発プロジェクトを立ち上げた。プロジェクト体制として、プロジェクトマネージャをプロジェクト管理部のP課長が務め、その下に、開発チーム及びインフラチームが作られた。開発チームは、アプリケーションの設計・開発を担当し、開発の一部は複数の外部委託先に委託した。そして、開発チームのリーダはパッケージ開発部のBさんが務めることになった。また、アプリケーション開発のセキュリティ対策を支援するために、システム技術部からD課長とF主任が開発チームに参加することになった。インフラチームは、システム技術部のメンバで構成され、インフラの設計・構築及び本番稼働までの保守・運用を担当し、インフラチームのリーダはシステム技術部のEさんが務めることになった。本番稼働後は、勤怠管理システムの運用をシステム運用部に引き継ぐことになっている。   〔勤怠管理システムの概要〕  勤怠管理システムは、店舗ごとの従業員情報(氏名、従業員番号など)の管理機能、勤務予定の作成及び勤務実績の記録と参照のための機能、並びに給与システムへの勤怠データ出力機能をもつ。勤怠データは店舗ごとに管理される。また、複数店舗の情報を集約する機能があり、システムを利用する1顧客当たり50店舗まで管理することができる。   〔勤怠管理システムのネットワーク構成〕  勤怠管理システムのネットワーク構成を図1に、ファイアウォール(以下、FWという)のアクセス制御ルールを表に示す。Webサーバ上ではミドルウェアとアプリケーションが稼働する。
情報処理安全確保支援士試験(平成22年度 午後2 問01 図01)
情報処理安全確保支援士試験(平成22年度 午後2 問01 表01)
〔プロジェクト計画の策定〕  本開発プロジェクトの開始に当たって、F主任は P 課長から提示されたプロジェクト計画書を確認した。  図2は、プロジェクト計画書中で示された、開発プロジェクトのスケジュール概要(開発チームの関連部分を抜粋)である。要件定義には、セキュリティ要件の定義も含まれている。また、システムテスト期間の後半で本番稼働前に、ルータ、FW、各サーバ及び Webアプリケーションの脆弱性テストを外部の専門家に依頼する計画となっていた。   情報処理安全確保支援士試験(平成22年度 午後2 問01 図02)
 F主任は、①本番稼働直前の脆弱性テストだけで安全な Webアプリケーションを開発しようとする計画には、プロジェクトマネジメント上、問題があると考え、P 課長に計画の変更を提案した。P 課長は、F主任の提案を受けて、②レビューを設計工程(基本設計、詳細設計)及び製造・単体テスト工程に追加する形で計画を変更した。  なお、外部委託先については、X社から開発ガイドライン準拠チェックリスト(以下、チェックリストという)を提供し、外部委託先からは工程ごとにチェック結果を提出してもらうことにした。   〔コーディングルールの作成〕  次に、F主任が本開発プロジェクトでのガイドラインを確認したところ、開発チームではX社の標準である開発ガイドラインを適用する計画となっていた。X社では開発ガイドラインを制定し、各パッケージの開発・保守に適用している。図3は開発ガイドラインのSQL処理に関する記載の抜粋である。   情報処理安全確保支援士試験(平成22年度 午後2 問01 図03)
 F主任は、基本設計に先立って、開発ガイドラインを基に、開発言語として使用するJavaの具体的なコーディングルールも作成した。図4は、F主任の作成したコーディングルールのうちSQL処理に関する記載の抜粋である。
情報処理安全確保支援士試験(平成22年度 午後2 問01 図04)
 F主任は、コーディングルールを作成後、プロジェクトメンバが参照できるようにファイルサーバに配置した。その後、開発プロジェクトは基本設計に入り、勤怠管理システムの設計が開発チームを中心に進められた。   〔勤怠管理システムのデータベース構成〕  勤怠管理システムはマルチテナントのシステムなので、一つのシステムの中で複数の顧客のデータを扱うが、顧客間でデータは分離する。顧客間でデータを分離する方法として、開発チームは、③データベースの各テーブルで、顧客を識別するカラムを追加する方式を採用した。具体的には、顧客単位で区別するために、顧客IDを各テーブルに入れることにした。詳細設計におけるデータベース論理設計結果のうち、主なテーブルの概要を図5に、そのE-R図を図6に示す。
情報処理安全確保支援士試験(平成22年度 午後2 問01 図05)
情報処理安全確保支援士試験(平成22年度 午後2 問01 図06)   〔アプリケーション設計のレビュー〕  詳細設計工程に進んだところで、社内メンバにセキュリティの観点でのレビュー経験がないことから、社内でのレビューではセキュリティ上の設計ミスやプログラム中の脆弱性を発見しきれないのではないかとBさんは考えた。そこで、セキュリティコンサルティング会社のH社の支援を受けることを提案し、承認された。H社は、アプリケーションセキュリティの専門家であるGさんを担当者としてアサインした。  詳細設計終了後、Gさんは、Bさん、F主任とともに詳細設計結果に対するレビューを行ったところ、勤務実績表示の処理に問題があることを発見した。問題があった勤務実績表示の処理を図7に示す。従業員選択画面には、ログイン中の利用者が所属している店舗の全従業員がリストに表示される。従業員をリストから選択すると、選択された従業員の勤務実績が勤務実績表示画面に表示される処理となっている。図7の勤務実績表示のSQL文は、図中の勤務実績表示画面を表示するためのSQL文で、〔選択した従業員の利用者ID〕には、従業員選択画面のリストで選択した従業員の利用者IDが指定される。
情報処理安全確保支援士試験(平成22年度 午後2 問01 図07)
 Gさん:勤務実績表示画面では、他人の勤務実績を参照することができますね。  F主任:はい、この機能では、同じ店舗に所属しているほかの従業員の勤務実績が参照できるようになっています。  Gさん:同じ店舗だけならよいのですが、このままではほかの店舗の従業員の勤務実績も参照することができます。具体的には、従業員選択画面のリストから従業員を選択して表示する処理に問題があります。  F主任:リストには、店舗に所属している従業員の一覧を表示し、HTMLのOPTIONタグのVALUE属性には、選択した従業員の利用者IDを指定するようになっています。従業員の一覧では、ログイン中の利用者と同じ店舗に所属している従業員だけが表示されますので、ほかの店舗の従業員を選択することはできないのではないでしょうか。  Gさん:いいえ、可能です。選択された従業員の勤務実績を表示する処理では、VALUE属性として送信されてきた利用者IDに対し、データの型をチェックした後、図7中のSQL文にそのまま使用する設計なので、これでは④ほかの店舗の従業員の勤務実績を権限なく閲覧される可能性があります。  F主任:なるほど。分かりました。早速、対策を検討して対応します。    F主任はGさんのアドバイスを基に対策を考え、同様の問題がほかにないかどうかの確認も含めて、Bさんを通して対策を開発チームに依頼した。   〔SQLインジェクション脆弱性の発見と対策〕  製造・単体テスト、結合テストが終了し、システムテストに入った。一方、F主任はプロジェクト計画に基づき、外部の専門家による脆弱性テストを実施した。  脆弱性テストの結果、ある処理でSQLインジェクション脆弱性の作り込みが発見された。開発チームリーダのBさんに確認したところ、開発プロジェクトの途中で、外部委託先Z社に新規に開発を委託しており、その開発部分で発見されたことが分かった。  Z社から提出を受けていたチェック結果には“コーディングルールに適合”と記入されていたので、F主任はZ社に事実関係を確認した。Z社は、X社のコーディングルールの内容は十分に理解していたが、コーディングルール違反をレビューで見逃したままチェック結果をX社に提出していたと回答した。F主任はBさんに報告した。Bさんは、Z社の開発部分全体についてコーディングルールの遵守を確認するよう、開発チームに指示した。   〔ミドルウェアの脆弱性〕  システムテストが終了し、システム運用部が加わり勤怠管理システムをインターネットに接続して運用テストを進めていた。本番稼働の2日前に、システム運用部のメンバがインターネットのニュースサイトを見ていたところ、勤怠管理システムで使用しているミドルウェアにおける脆弱性が1か月前に公表されていることを、偶然見つけた。  X社のこれまでのパッケージ開発では、テスト期間中にミドルウェアのバージョンを見直すことはなかった。システム運用部は、インフラチームのリーダであるEさんに相談した。Eさんはベンダが発表している脆弱性情報と勤怠管理システムのミドルウェアのバージョンを確認し、その内容と影響を報告書にまとめた。図8はEさんのまとめた報告書である。   情報処理安全確保支援士試験(平成22年度 午後2 問01 図08)
 X社内で、関係者で検討した結果、Eさんのまとめた報告書にある脆弱性の内容及び影響に変化がなければ、サービスの本番移行は予定どおり実施するとの判断をした。また、根本対策として、次回の定期メンテナンスでセキュリティパッチを適用することにした。  その後、本番稼働までの 2 日間、脆弱性情報の更新を確認したが、特に更新はなかった。また、サービス稼働監視でも異常は発見されず、無事、本番稼働を迎えた。   〔本番稼働後の報告〕  本番稼働後、D 課長はプロジェクト管理部に対して、今回の開発プロジェクトで発生したセキュリティ上の問題点と対応について報告を行った。プロジェクト管理部は、SQL インジェクション脆弱性の作り込みを踏まえた⑤開発委託先管理の問題点と、開発プロジェクトにおける本番稼働前のシステムに対する⑥脆弱性情報の管理の問題点を指摘し、今回の開発プロジェクトで得られた経験を、今後のシステムの開発、運用、保守に生かすため、D 課長に具体的な解決策の提案を依頼した。  D課長は P 課長、Bさん、F主任にも解決策の検討を依頼し、検討結果を取りまとめ、プロジェクト管理部に提案を行った。X社の経営陣は提案を承認し、X社のプロセスとしてシステムの開発、運用、保守に適用することにした。

設問1

〔コーディングルールの作成〕について、図4中のabに入れる適切な字句を解答群の中から選び、記号で答えよ。
解答群  ア:java.sql.PreparedStatement stmt = con.prepareStatement(sql);  イ:java.sql.ResultSetrs = stmt.executeQuery();  ウ:java.sql.ResultSetrs = stmt.executeQuery(sql);  エ:java.sql.Statement stmt = con.bind(sql);  オ:java.sql.Statement stmt = con.doFilter(sql);

模範解答

a:ア b:イ

解説

解答の論理構成

  1. 図4には「1. SQL文の組立てには、プレースホダ及びバインド機構を使用すること」と明示されています。プレースホルダ ? を使った SQL を実行するには、java.sql.PreparedStatement を生成し、バインド後に executeQuery() を呼び出すのが王道です。
  2. 【問題文】のコード断片は
    java String sql = "SELECT * FROM atable WHERE name=?"; a stmt.setString(1, param); b
    となっており、stmt という変数がこの後に setString を呼び出していることから、stmt は PreparedStatement 型でなければなりません。
  3. 解答群を照合すると、stmt を PreparedStatement として生成する文は
    「ア:java.sql.PreparedStatement stmt = con.prepareStatement(sql);」
    しかありません。よって a は「ア」です。
  4. 次に SQL を発行する行 b では戻り値を ResultSet で受ける必要があります。
    executeQuery() メソッドは引数なしで呼ぶのが PreparedStatement の基本形です。
  5. 解答群でこれに一致するのは
    「イ:java.sql.ResultSetrs = stmt.executeQuery();」
    です(java.sql.ResultSet 型 rs に結果を受け取る)。
  6. 以上より
    a=「ア」
    b=「イ」
    となります。

誤りやすいポイント

  • 選択肢「ウ」は executeQuery(sql) を呼び出しており、PreparedStatement を利用する意味がなくなります(SQL が文字列連結される危険)。
  • 「エ」「オ」は JDBC に存在しないメソッド名なので誤りですが、似た名前に惑わされやすいです。
  • Statement と PreparedStatement の違いを把握せずに、単に「SQL を実行できれば良い」と考えてしまうと SQL インジェクション対策が抜け落ちます。問題文では「プレースホルダ及びバインド機構」を強調している点に注意が必要です。

FAQ

Q: executeQuery() と executeUpdate() の違いは?
A: executeQuery() は SELECT 文の結果を ResultSet として取得するために使います。INSERT・UPDATE・DELETE など更新系 SQL では行数を返す executeUpdate() を使用します。
Q: プレースホルダを使うと SQL インジェクションは完全に防げますか?
A: パラメータバインドで SQL 部分とパラメータ部分を分離することで多くのインジェクション攻撃を防げます。ただし脆弱な動的 SQL 生成や誤ったバインド方法を行うと危険が残るため、常にガイドラインに沿った実装とレビューが不可欠です。
Q: なぜ Statement ではなく PreparedStatement を使うべきなのですか?
A: Statement だとパラメータを文字列連結で埋め込むため、入力値に SQL 断片を混入されるとインジェクションが成立します。PreparedStatement はコンパイル済み SQL に値だけをバインドする仕組みなので、構文が改変されません。

関連キーワード: プレースホルダ、PreparedStatement, SQLインジェクション、JDBC, バインド変数

設問2〔プロジェクト計画の策定〕について、(1)〜(3)に答えよ。

(1)本文中の下線①でF主任が、問題があると指摘した理由を、35字以内で述べよ。

模範解答

修正に期間が掛かり、本番稼働が延期となる可能性があるから

解説

解答の論理構成

  1. プロジェクト計画書では、脆弱性テストが図2の工程表で「システムテスト」の後半、すなわち「本番稼働直前」に 1 回だけ計画されています。
  2. F主任はこれを見て、下線①「本番稼働直前の脆弱性テストだけで安全な Web アプリケーションを開発しようとする計画には、プロジェクトマネジメント上、問題がある」と指摘しました。
  3. 本番稼働直前に重大な脆弱性が見つかると、(a) 修正・再テストに要する追加工数が大きくなり (b) 予定していた「運用テスト」や「本番稼働」の開始日を後ろ倒しにせざるを得なくなります。
  4. したがって、指摘の理由は「脆弱性が発見された場合に修正期間を確保できず、本番稼働が遅延するリスクが高い」ことです。
  5. 模範解答「修正に期間が掛かり、本番稼働が延期となる可能性があるから」に対応します。

誤りやすいポイント

  • 「セキュリティ上問題がある」=脆弱性が残存する、とだけ考え「本番延期リスク」に触れない。
  • テスト工程が存在するので十分と早合点し、工程間のバッファを見落とす。
  • 下線①の主語が「安全な Web アプリケーション」なので品質面だけを論じ、スケジュール影響を外す。

FAQ

Q: 途中の工程で脆弱性テストを複数回入れるのはなぜ必要ですか?
A: 早期に欠陥を検出すれば修正コストと日程影響を最小化できるためです。工程の後半ほど手戻りコストが指数的に増大します。
Q: 「レビュー追加」で問題は解決しますか?
A: レビューは静的検証であり、動的な脆弱性テストと補完関係にあります。両方を各工程で計画的に実施することが重要です。
Q: 本番稼働が延期するとどのような損害が想定されますか?
A: 顧客へのサービス開始遅延、社内リソース拘束、追加コスト、競合優位性の低下など多面的な損害が生じ得ます。

関連キーワード: 脆弱性テスト、リスク管理、手戻りコスト、品質保証

設問2〔プロジェクト計画の策定〕について、(1)〜(3)に答えよ。

(2)本文中の下線②でP課長は、設計工程(基本設計、詳細設計)にレビューを追加した。その内容を、40字以内で具体的に述べよ。

模範解答

セキュリティ要件が正しく設計に反映されているかどうかをレビューする。

解説

解答の論理構成

  1. 要件定義段階では「要件定義には、セキュリティ要件の定義も含まれている」と問題文に記載されています。したがって、以後の工程では“定義済みセキュリティ要件を正しく実装へ落とし込めているか”を確認する必要があります。
  2. ところが当初計画では「①本番稼働直前の脆弱性テスト」しか用意されておらず、設計段階での確認が抜けていました。このままでは要件‐設計間のギャップを検出できず、後戻りコストが増大します。
  3. この問題を受けてP課長は「②レビューを設計工程(基本設計、詳細設計)及び製造・単体テスト工程に追加」しました。追加したレビューの目的は、要件定義で定めたセキュリティ要件が設計成果物へ正しく反映されているか、さらにコーディングへ継承されているかを確認することに他なりません。
  4. 以上より、設計フェーズに追加したレビューの具体的内容は「セキュリティ要件が正しく設計に反映されているかどうか」を確認することであると導けます。

誤りやすいポイント

  • 「追加レビュー=コードレビュー」と早合点し、設計工程での確認事項を答えない。
  • “脆弱性検査の前倒し”と混同し、テスト手法の説明を書いてしまう。
  • セキュリティ以外の品質(性能・可用性など)のレビューを書く。

FAQ

Q: 設計レビューでセキュリティ以外の観点も確認しますか?
A: 当然行いますが、今回の設問は「追加したレビューの狙い」を問うため、セキュリティ要件の反映確認を中心に答えます。
Q: 製造・単体テスト工程にもレビューを追加したのに設計の話だけで良いの?
A: 設問は「設計工程に追加したレビューの内容」を尋ねています。製造工程でのレビューは別設問で扱われるか、または前提知識として押さえておけば十分です。
Q: なぜ本番直前の脆弱性テストだけでは不十分なのですか?
A: 設計段階で問題を検出しなければ、後工程での修正コストが高騰します。また、要件‐設計間の不整合はテストだけでは検出しきれない場合があります。

関連キーワード: セキュリティ要件、レビュー工程、設計品質、マネジメント、脆弱性対策

設問2〔プロジェクト計画の策定〕について、(1)〜(3)に答えよ。

(3)本文中の下線②でP課長は、製造単体テスト工程にレビューを追加した。その内容を、50字以内で具体的に述べよ。

模範解答

開発ガイドライン及びコーディングルールに基づきコーディングされていることを確認する。

解説

解答の論理構成

  • 本文中の下線②には「“レビューを設計工程(基本設計、詳細設計)及び製造・単体テスト工程に追加する形で計画を変更した”」とあります。製造段階のレビュー対象は“作られたソースコード”です。
  • 同じ段落には「“外部委託先については、X社から開発ガイドライン準拠チェックリスト…を提供”」とあり、レビュー時に確認すべき基準を示しています。
  • さらに、コーディング開始前に「“F主任は…開発ガイドラインを基に…具体的なコーディングルールも作成した”」とあるため、ソースコードがこのルールに従っているかを点検することが妥当です。
  • 以上より、製造・単体テスト工程で実施すべきレビューは「開発ガイドラインおよびコーディングルールに沿って正しくコーディングされていることの確認」と導けます。

誤りやすいポイント

  • 「単体テスト結果をレビューする」と誤解し、コード規約の確認を忘れる。
  • 「外部委託先のみ対象」と考え、自社実装分のレビューを漏らす。
  • ガイドラインとコーディングルールを分けて考えず、どちらか片方しか書かない。

FAQ

Q: コーディングルールと開発ガイドラインは別物ですか?
A: はい。本文では開発ガイドラインが会社標準、コーディングルールは今回Java向けに具体化したものと記載されています。両方への適合確認が必要です。
Q: レビュー工程を追加した目的はセキュリティだけですか?
A: 主目的は「安全な Web アプリケーション」の実現です。セキュリティ欠陥を早期に除去するため、品質全般(可読性・保守性)も含めたコードチェックが行われます。
Q: 外部委託先が提出するチェックリストだけで十分では?
A: 本文にあるようにレビューで「見逃し」が発生する可能性があるため、X社側でもコードを直接確認するレビューが必須です。

関連キーワード: コードレビュー、コーディングルール、ガイドライン適合、セキュリティ品質、ソフトウェア開発工程

設問3〔アプリケーション設計のレビュー〕で発見された、勤務実績表示の処理の問題について、(1)、(2)に答えよ。

(1)本文中の下線4の指摘は、具体的にどのようなHTTPリクエストによって閲覧されると指摘したものか。55字以内で述べよ。

模範解答

【選択した従業員の利用者ID】を表すリクエストパラメタの値としてほかの店舗の利用者IDを与える。

解説

解答の論理構成

  1. 図7の処理では、勤務実績表示の SQL 文に
    AND USR_ID = [選択した従業員の利用者ID]
    がそのまま埋め込まれています。
  2. さらに本文には
    ――「VALUE属性として送信されてきた利用者IDに対し、データの型をチェックした後、図7中のSQL文にそのまま使用する設計」
    とあります。
  3. ところが店舗間のチェックは行われておらず、Gさんは
    ――「これでは④ほかの店舗の従業員の勤務実績を権限なく閲覧される可能性があります」
    と指摘しています。
  4. つまり外部から送る HTTP リクエストで、従業員選択画面のフォームパラメタ(利用者ID)を書き換え、ログイン店舗とは異なる USR_ID を与えれば、認可を受けていない勤務実績が取得できます。
  5. よって回答は「【選択した従業員の利用者ID】を表すリクエストパラメタの値としてほかの店舗の利用者IDを与える」という内容になります。

誤りやすいポイント

  • 「SQLインジェクション」と混同し、パラメタに悪意の SQL 断片を入れるケースと誤認する。今回の問題は認可チェック欠如による情報漏えいであり、SQLインジェクションではありません。
  • 「自分の店舗以外の従業員がプルダウンに出ないから安全」と考えてしまい、クライアント側での入力制御だけに頼りがちになる。HTTP パラメタは容易に改ざんできる点を見落としがちです。
  • 「顧客 ID」で顧客間は分離できているから大丈夫だと思い込み、店舗単位の追加チェックを忘れる。マルチテナント設計では顧客・店舗など複数粒度の認可が必要です。

FAQ

Q: 画面で選択できない値を送るにはどのような方法がありますか。
A: ブラウザ開発者ツールで該当フォームの値を書き換える、あるいは curl・Burp Suite などで HTTP リクエストを直接作成すれば任意の USR_ID を送れます。
Q: 型チェックを行っているのになぜ防げないのですか。
A: チェックしているのは「型(文字列かどうか)」のみであり、「値の正当性(同一店舗所属か)」は確認していません。そのため不正な値でも SQL が正常に実行されます。
Q: 顧客 ID 条件 CUST_ID = [ログイン中の利用者の顧客ID] があるのになぜ漏えいしますか。
A: 同一顧客内で店舗が複数存在する構造だからです。顧客での切り分けはできていますが、店舗レベルの制御が抜けているため、同一顧客の別店舗データは取得可能です。

関連キーワード: パラメタ改ざん、認可チェック、マルチテナント、HTTPリクエスト、セキュアコーディング

設問3〔アプリケーション設計のレビュー〕で発見された、勤務実績表示の処理の問題について、(1)、(2)に答えよ。

(2)この問題を避けるためには、データの型をチェックした後、どのようなチェック処理を行うべきか。60字以内で述べよ。

模範解答

【選択した従業員の利用者ID】の値がログイン中の利用者と同じ店舗の従業員の利用者IDかどうかをチェックする。

解説

解答の論理構成

  1. 現状の SQL では
    「SELECT … WHERE CUST_ID = [ログイン中の利用者の顧客ID] AND USR_ID = [選択した従業員の利用者ID] …」
    という条件しか付与しておらず、店舗を識別する STORE_ID が条件に含まれていません。
  2. そのため、同じ顧客内であれば別店舗の従業員IDを任意に送信するだけでデータが取得できます。Gさんは
    「④ほかの店舗の従業員の勤務実績を権限なく閲覧される可能性があります」
    と指摘しています。
  3. 根本原因は「利用者IDがログイン利用者と同一店舗であるか」という業務的な権限制約をサーバ側で検証していないことです。
  4. よってデータ型チェック後に
    「【選択した従業員の利用者ID】がログイン中の利用者と同じ店舗に属しているか」
    を確認する権限チェックを追加すれば、不正参照を防止できます。

誤りやすいポイント

  • 顧客共通の CUST_ID 条件だけで十分と誤解し、店舗単位のアクセス制御を忘れる。
  • クライアント側(ブラウザのプルダウン制御)だけで安全と判断し、サーバ側検証を省略する。
  • USR_ID を検証しても、それが同一店舗かどうかを突き合わせないため抜け穴が残る。

FAQ

Q: SQL に AND STORE_ID = ? を追加するだけでは駄目ですか?
A: 条件追加は有効ですが、その前に送信された STORE_ID 値が改ざんされていないかをサーバ側で検証する必要があります。
Q: 従業員一覧を DB から再取得して選択値を突き合わせても良いですか?
A: はい。ログイン利用者の所属店舗で従業員IDを再取得し、リストに含まれているかを確認すれば同様の効果が得られます。
Q: マルチテナント環境では店舗単位以外にもチェックが必要ですか?
A: 顧客単位、店舗単位、ロール(職位)単位など複数層の権限制御が必要です。要件に応じて多段階で行ってください。

関連キーワード: アクセス制御、パラメータ検証、マルチテナント、権限チェック、SQL文

設問4SQLインジェクション脆弱性の対策について、(1)、(2)に答えよ。

(1)SQLインジェクションが発生したときでも、ほかの顧客のデータをSQLで操作されにくいようにするためには、本文中の下線③の方式をどのように変更すべきか。45字以内で述べよ。

模範解答

データベースのテーブルとアカウントを顧客ごとに分離し、アクセス権を設定する。

解説

解答の論理構成

  • 本文には、マルチテナント方式として「③データベースの各テーブルで、顧客を識別するカラムを追加する方式」が採用されているとあります。
  • この方式では 1 つのテーブルに複数顧客のデータが混在するため、WHERE CUST_ID = … の句が外されたり改変された場合、他顧客データにアクセスできてしまいます。実際に本文でも「SQLインジェクション脆弱性の作り込みが発見された」と報告されています。
  • 被害を局所化する安全策は、物理的または論理的にデータそのものを分離し、アクセス権でガードすることです。すなわち、顧客ごとに
    1. 専用テーブル(またはスキーマ)を用意し、
    2. そのテーブルにのみアクセス可能な DB アカウントを割り当てる
      という対策に改めれば、万一「SQLインジェクション」が成立しても他顧客領域を操作することは困難になります。
  • したがって模範解答の「データベースのテーブルとアカウントを顧客ごとに分離し、アクセス権を設定する」が妥当です。

誤りやすいポイント

  • 「顧客IDカラムがあれば十分」と思い込み、権限制御の層を増やさない。
  • 「ビューで絞れば良い」と考え、基底テーブルを共有したままにする。インジェクションでビューを回避される危険を見落としがち。
  • DB を分けずにアプリケーション層だけでロールを切り替える設計。攻撃者はアプリ層を突破する前提で考える必要がある。

FAQ

Q: テーブル分割ではなくスキーマ分割でも効果はありますか?
A: あります。要件は「顧客間で権限が交わらないこと」です。スキーマ単位で専用アカウントを発行し、他スキーマを参照できないよう権限を最小化すれば同等の効果が得られます。
Q: 顧客数が多い場合、テーブル/アカウントが増え過ぎませんか?
A: 管理コストは増えますが、セキュリティとトレードオフになります。パーティショニングや自動プロビジョニングなど運用面の工夫で対応するのが一般的です。
Q: アプリケーション側でプリペアドステートメントを徹底すれば十分では?
A: インジェクション発生率は下がりますが「0」にはできません。多層防御として DB 側でも顧客間を隔離することで、万一の際の被害範囲を限定できます。

関連キーワード: テナント分離、権限制御、SQLインジェクション、アカウント管理、データベース設計

設問4SQLインジェクション脆弱性の対策について、(1)、(2)に答えよ。

(2)本文中の下線⑤の開発委託先管理の問題点を解決するために、X社が行うべきことを50字以内で述べよ。

模範解答

・開発委託先の成果物に対して、委託先のレビューに加えて、X社でも受入検査を詳細に実施する。 ・チェックリストの各項目を判定する基準を示し、その判定結果と根拠を提出させる。

解説

解答の論理構成

  1. 問題の所在を確認
    • 本文には、外部委託先である“Z社”が作り込んだコードに「SQLインジェクション脆弱性」が残存していたにもかかわらず、提出されたチェックリストには“コーディングルールに適合”と記載されていたとあります(引用:「Z社は、X社のコーディングルールの内容は十分に理解していたが、コーディングルール違反をレビューで見逃したままチェック結果をX社に提出していた」)。
    • さらに「プロジェクト管理部は、SQL インジェクション脆弱性の作り込みを踏まえた⑤開発委託先管理の問題点を指摘」しています。
  2. 課題を整理
    • Z社だけのセルフチェックに依存したため、脆弱性が検出されなかった。
    • チェックリスト提出時に“判定の根拠”を求めていないため、虚偽(または漏れ)を見抜けなかった。
  3. 解決策の要件
    • X社自身が最終成果物をレビュー/テストする(受入検査)。
    • チェックリスト各項目の判定基準を明確化し、エビデンス提出を義務付ける。
    • これにより、委託先のレビュー漏れや形式的な合格報告を防止できる。
  4. 解答例(50字以内)
    • 「委託先レビューに加えX社で受入検査を実施し、判定基準と根拠付きチェックリスト提出を義務化する。」

誤りやすいポイント

  • 「レビューを強化する」とだけ書き、受入検査の主体を明示しない。
  • 「テストを増やす」と漠然と述べ、チェックリストの基準や根拠提出に触れない。
  • 開発ガイドラインやコーディングルールの改訂だけを解としてしまい、委託先管理の視点を欠落させる。

FAQ

Q: 受入検査は具体的に何を行えばよいですか?
A: コーディングルール適合確認、静的解析、脆弱性スキャナ、単体・結合テスト結果の再確認など、第三者視点で委託成果物を検証します。
Q: 判定基準と根拠提出とは具体的に?
A: 各チェック項目について、レビュー箇所・使用ツール・検出結果などのエビデンス(ログ、画面キャプチャ、テストケース)を添付させます。
Q: チェックリストがあれば十分では?
A: 判定基準が曖昧だと形だけのチェックになりやすく、今回のように脆弱性が見逃されるため、エビデンスとX社側の受入検査が不可欠です。

関連キーワード: 受入検査、コーディングルール、セキュアレビュー、チェックリスト、外部委託管理

設問5ミドルウェアの脆弱性発見時の対応について、(1)〜(3)に答えよ。

(1)図8中のcに入れる適切な字句を解答群の中から選び、記号で答えよ。

模範解答

c:ア

解説

解答の論理構成

  1. 図8には次のように記載されています。
    「…10月1日現在、脆弱性による不正な動作を再現するcは公開されていない。」
    「再現する」ものが公開されていない、という文脈は“実際に攻撃を試すためのプログラムやコード”が存在しないことを示唆します。
  2. 同じ段落の冒頭には「ネットワーク経由でこの管理画面にアクセスすることによって、ログインしなくてもDoS攻撃が可能」とあり、脆弱性の悪用可否を判断するキーワードが「DoS攻撃」です。DoS攻撃を“再現”するには一般に“攻撃コード(エクスプロイトコード)”が必要です。
  3. 解答群のうち、この趣旨に合致する選択肢が「ア」であるため、cには「ア」を入れるのが妥当です。

誤りやすいポイント

  • 「シグネチャ」「パッチ」などと取り違える
    「再現する」対象は攻撃動作であり、検知や修正に用いる“シグネチャ”や“パッチ”ではありません。
  • 「検証手順」「テスト手順」と誤解する
    手順書はあっても実際の不正動作はコードが無ければ再現できない、という点を見落としがちです。
  • “公開されていない=安全”と短絡的に判断する
    攻撃コードが公開されていなくてもゼロデイで作られる可能性は残るため、根本対策(パッチ適用)は依然として重要です。

FAQ

Q: 攻撃コードが公開されていなければ、本番稼働を延期する必要はないのでしょうか?
A: 図8にもあるように「実施済対策: d」など他の多層防御策が機能している場合、リスクを受容して予定通り稼働する判断もあり得ます。ただし恒久的にはセキュリティパッチ適用が必須です。
Q: “攻撃コード”と“PoCコード”は同じ意味ですか?
A: 実務ではほぼ同義に扱われることが多いです。どちらも脆弱性を悪用し動作を再現・証明するプログラムを指します。
Q: 攻撃コードが公開された後に必要な追加対策はありますか?
A: IDS/IPSのシグネチャ追加やFWルール見直しなど、攻撃検知・遮断策を強化するとともに、影響範囲調査とインシデント対応フローの確認を行うべきです。

関連キーワード: DoS, 攻撃コード、脆弱性管理、セキュリティパッチ、多層防御

設問5ミドルウェアの脆弱性発見時の対応について、(1)〜(3)に答えよ。

(2)図8中のdに入れる適切な実施済対策の内容を、50字以内で述べよ。

模範解答

d:ファイアウォールで、インターネットからのTCPポート番号8080への通信を拒否する。

解説

解答の論理構成

  1. 図8の「○脆弱性の内容」には
    “管理画面があり、TCP ポート番号8080で利用できるようになっている”
    とあり、DoS 攻撃はこのポートに到達できるかどうかで決まります。
  2. 同じく図8の「○影響」で
    “インターネットから直接に攻撃を受けるわけではない”
    と記載されています。外部から到達できない理由=既にポートを閉じている対策が存在するはずです。
  3. “FW”を含むネットワーク図(図1)とFWルール表を見ると、インターネット→Webサーバは “80, 443” のみ “許可” で、その他は “拒否” です。
    よって “TCP ポート番号8080” は外部に開放されていません。
  4. 以上より、実施済み対策 d
    「ファイアウォールで、インターネットからのTCPポート番号8080への通信を拒否する」
    であると論理的に導けます。

誤りやすいポイント

  • “8080” を遮断する手段を IDS と取り違える。IDS は検知であり遮断ではありません。
  • 「内部セグメントでの制限」と思い込み、外部公開を前提に書いてしまう。問題文は “インターネットから直接に攻撃を受けるわけではない” 点を強調しています。
  • ポート番号を書かずに「管理画面へのアクセスを制限」とだけ答えると具体性不足になります。

FAQ

Q: IDS を導入していないと書かれているのに、ファイアウォールだけで大丈夫ですか?
A: DoS 攻撃は “TCP ポート番号8080” が外部に開いていなければ成立しません。FWで遮断していれば、少なくともインターネット越しの攻撃は防げます。
Q: 内部ネットワークからの攻撃は考慮しなくてよいのですか?
A: 本設問は “インターネットから” のリスク低減策として実施済みの対策を問うています。内部対策は別途必要ですが、本解答の範囲外です。
Q: “80, 443 以外拒否” ならポート8080に限らず塞がっていますが、なぜ8080だけ言及するのですか?
A: 問題の脆弱性が “TCP ポート番号8080で利用できる管理画面” に限定されているため、対策の核心も8080遮断であることを明示する必要があります。

関連キーワード: ポート制御、ファイアウォール、脆弱性管理、DoS対策

設問5ミドルウェアの脆弱性発見時の対応について、(1)〜(3)に答えよ。

(3)本文中の下線⑥の問題点に対する解決策を、今後の開発プロジェクトの在り方の観点から、40字以内で述べよ。

模範解答

X社の標準開発プロセスに脆弱性情報の収集と管理責任を規定する。

解説

解答の論理構成

  1. 脆弱性が「偶然見つけた」
    【問題文】には「本番稼働の2日前に、…ニュースサイトを見ていたところ…脆弱性が1か月前に公表されていることを、偶然見つけた。」とあります。計画的な収集・管理がなかった事実を示しています。
  2. ⑥の指摘内容
    「開発プロジェクトにおける本番稼働前のシステムに対する⑥脆弱性情報の管理の問題点」と明記され、管理プロセスそのものに欠陥があることが示されています。
  3. 改善は組織的プロセスで行うべき
    個人の偶発的な発見では再発を防げません。X社全体で標準化し、誰が・いつ・どの情報源を監視するかを明文化する必要があります。
  4. 解答の結論
    よって「X社の標準開発プロセスに脆弱性情報の収集と管理責任を規定する。」が最適解となります。標準プロセスに組み込めば、各プロジェクトは必ず実施し、責任者も明確になります。

誤りやすいポイント

  • 「パッチ適用の手順を作る」だけでは情報の“収集”が抜け落ち、不十分です。
  • 「運用部門に任せる」とすると開発中の製品が対象外になり、指摘の主旨を満たしません。
  • 単に「定期的に確認する」では“誰が”“どの工程で”行うか不明確なため管理責任が曖昧です。

FAQ

Q: 収集の対象はミドルウェアだけで良いですか?
A: いいえ。OS、フレームワーク、ライブラリなどシステム構成要素すべてが対象です。
Q: 責任者はプロジェクトごとに設定すれば十分ですか?
A: 責任の所在を組織横断で標準化し、各プロジェクトにも明示的に割り当てることで漏れを防ぎます。
Q: 無償の情報源でも信頼できますか?
A: NVDやJVNなど公開データベースは有効ですが、ベンダ公式情報とのクロスチェックが推奨されます。

関連キーワード: 脆弱性管理、セキュリティパッチ、標準プロセス、責任分担、情報収集
戦国ITクイズ機能

\ せっかくなら /

情報処理安全確保支援士
クイズ形式で学習しませんか?

クイズ画面へ遷移する

すぐに利用可能!

©︎2026 情報処理技術者試験対策アプリ

このサイトについてプライバシーポリシー利用規約特商法表記開発者について