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

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


Javaプログラミングに関する次の記述を読んで、設問1~3に答えよ。

 S社は、従業者数500名(従業員30名、パートタイマ(以下、パートという)470名)、営業所が1か所の警備業者であり、各種イベントの答備や交通誘導警備を請け負っている。これまで、パートの勤務時間の集計と給与計算は、手書き帳票を基にして経理課にて行っていた。今回、情報システム課でWebアプリケーションによる勤務時間管理システムを開発して、集計などの作業をシステム化することとした。このシステム化によって、毎月初めの5営業日以内にパートが営業所に赴き、PC操作によって自分の前月分の勤務時間集計表を印刷した後、その表に記載された勤務時間と給与支給金額に誤りがないことを確認して押印し提出するという作業の流れとなった。  なお、パートの勤務時間は、業務監督者が記録し、専任の担当者がデータベースに入力する。   〔システム構成〕  S社の勤務時間管理システムのシステム構成は、図1のとおりである。
情報処理安全確保支援士試験(平成22年度 春季 午後1 問01 図01)
 HTTPサーバ及びJavaサーブレットコンテナはオープンソースソフトウェアを使用しており、JavaサーブレットコンテナはJava Platform, Enterprise Edition 5(JavaEE5)に準拠したものである。また、利用者用PCは、25台を用意してパート全員で共用する。  システムの利用者IDには、6けたの数字からなる従業者番号を使用する   〔システム仕様〕  S社の情報システム課には従業員が4名在籍しているが、これまでT君がほぼ1人でシステム開発、管理を行っており、今回の開発もT君が1人で担当することとなった。T君は、これまでJavaサーブレットモデルを用いたシステム開発を経験したことがなかった。しかし、プログラム上でメモリを使用する際の境界チェックをしなくてもJavaバーチャルマシンによってメモリの使用状況が管理されるために、C言語又はC++言語で開発したプログラムにおいてよく発生するaによるセキュリティ上の脆弱性が発生しないという利点を重視して、Javaサーブレットモデルを用いた開発を決定した。  今回開発する勤務時間管理システムの仕様は、図2のとおりである。   情報処理安全確保支援士試験(平成22年度 春季 午後1 問01 図02)
〔勤務時間集計表の作成及びリンク表示のプログラム〕  T君は、図2の仕様に基づいてJavaプログラムを作成した。そのJavaプログラムのうち、勤務時間集計表を作成して、その表へのリンクを表示する部分について図3に示す。プログラム完成後、仕様に基づいた機能試験を試験環境にて行い、問題がないことを確認した。
情報処理安全確保支援士試験(平成22年度 春季 午後1 問01 図03) 
〔トラブルの発生と対策〕  その後、S社では勤務時間管理システムの運用を開始した。しかし、パートから、①マニュアルどおりに操作したにもかかわらず、ダウンロードした勤務時間集計表が他人のものだったという苦情があった。この問題が発生したときには25名の利用者が同時に勤務時間管理システムへアクセスしていた。T君は、この問題の原因を調査するためにプログラムを見直していたが、なかなか原因を特定できなかった。さらに、最初にこの問題が発生してから3日後に、23名の利用者が同時に勤務時間管理システムへアクセスしていた際にも、同じ問題が発生した。  この状況を見て、情報システム課のH課長は勤務時間管理システムの運用停止を指示するとともに、T君単独でのシステム開発には無理があると考え、セキュリティにも詳しいシステムコンサルタントのU氏に支援を要請した。  支援を開始したU氏は、最初に図3のプログラムを検査して、問題の原因と修正方法を指摘した。その指摘に従い、T君はプログラムを修正し、テストを行って問題が発生しないことを確認した。  さらにU氏は、悪意をもったパートが②他人のパスワードを使用しなくても、容易に他人の勤務時間集計表をダウンロードできる脆弱性があることを指摘した。  指摘を受けたT君は、作成する勤務時間集計表のファイル名をランダム文字列とすれば脆弱性は解消できるのではないかと提案した。しかしU氏は、そもそも個人情報が記録されたファイルをWeb公開領域に保存することに問題があると指摘して、脆弱性を解消するために図2の仕様を図4のように修正することを提案した。
情報処理安全確保支援士試験(平成22年度 午後1 問01 図04)
 その後、T君はU氏の支援を受けつつ、図4の仕様に沿って勤務時間管理システムの修正を行い、脆弱性が解消されたことを確認した。この結果を受けて、H課長は勤務時間管理システムの運用再開を指示した。

設問1

本文中のaに入れる適切な字句を15字以内で答えよ。

模範解答

a:バッファオーバフロー

解説

解答の論理構成

  • 問題文には、Java を採用した理由として
    「Javaバーチャルマシンによってメモリの使用状況が管理されるために、C言語又はC++言語で開発したプログラムにおいてよく発生するaによるセキュリティ上の脆弱性が発生しない」
    とあります。
  • C/C++で“メモリを使用する際の境界チェックをしない”ことが原因で生じる代表的な脆弱性は「バッファオーバフロー」です。
  • Java では配列や文字列アクセス時に境界外参照があれば例外を投げるため、同じタイプの脆弱性は原理的に起こりにくい点が理由として説明されています。
  • よって、a に入る字句は
    「バッファオーバフロー」
    となります。

誤りやすいポイント

  • 「メモリリーク」と混同する
    → メモリ解放忘れは可用性低下の問題であり、境界チェック不足とは別問題です。
  • 「スタックオーバフロー」「ヒープオーバフロー」と細分類で答えてしまう
    → 問題文は C/C++で頻発する一般的な脆弱性を指しており、総称の「バッファオーバフロー」が適切です。
  • Java でも OutOfMemoryError があるので勘違いする
    → これはメモリ枯渇であって境界外書き込みではありません。

FAQ

Q: Java は本当にバッファオーバフローが起こらないのですか?
A: 配列や String などは境界チェックが自動で行われ、ネイティブコードを書かない限り任意メモリ書き換えは起こりにくい設計です。ただし JNI で C/C++を呼び出す場合は同じリスクがあります。
Q: 境界チェックがないと、なぜセキュリティ事故につながるのですか?
A: 隣接メモリに不正データを書き込めるため、関数戻りアドレスやポインタを書き換え、任意コード実行や権限昇格が可能になるからです。
Q: Java でも対策は不要ですか?
A: Java 単体では低レベルのバッファオーバフローは防げますが、入力値検証不足による論理的なオーバフローや DoS 攻撃は依然として存在するため、総合的なセキュリティ対策は必要です。

関連キーワード: バッファオーバフロー、メモリ管理、境界チェック、C言語、Java

設問2本文中の下線①の苦情について、(1)〜(4)に答えよ。

(1)マニュアルどおりに操作したにもかかわらず、他人の勤務時間集計表をダウンロードしてしまった原因について、図3のプログラム上の変数名を用いて、60字以内で述べよ。

模範解答

インスタンス変数tempPDFが複数のスレッドからほぼ同時に書き込まれたので、想定外の値となった。

解説

解答の論理構成

  1. Javaサーブレットは通常「1インスタンスをマルチスレッドで並行実行」する設計です。したがって同じクラスのインスタンス変数は同時アクセスする全スレッドで共有されます。
  2. 図3のコード 12 行目に「File tempPDF;」とあり、これはインスタンス変数です。
  3. 22〜32 行目の doGet では、24 行目で「String tempUserID = request.getRemoteUser();」を取得し、25 行目で「tempPDF = new File(...)」と代入し、30 行目で「out.println("<a href="" + KINMUHYO_URL_PATH + tempPDF.getName() + "">…」とリンクを生成しています。
  4. 25 名が同時アクセスした状況では、スレッドAが tempPDF に利用者Aのファイルパスを設定した直後に、スレッドBが同じ tempPDF を利用者Bのパスで上書きし得ます。
  5. 結果としてスレッドAが 30 行目を実行する時点で tempPDF が利用者Bの値となり、利用者Aは他人の勤務時間集計表を示すリンクを受け取ってしまいます。
  6. したがって下線①の苦情は「インスタンス変数 tempPDF が複数スレッドから同時に書き換えられ、誤ったファイル名が生成されたこと」が直接原因となります。

誤りやすいポイント

  • Javaサーブレットはリクエストごとにインスタンスを生成すると誤解し、インスタンス変数の共有を見落とす。
  • static かどうかだけに注目し、「非 static なら安全」と早合点してしまう。
  • request.getRemoteUser() で取得した利用者 ID が常に一致すると考え、後段の変数競合を確認しない。
  • テスト環境で単一ユーザのみで試験し、マルチユーザ同時実行による競合を想定しない。

FAQ

Q: サーブレットで安全にリクエスト固有データを扱う基本方針は?
A: インスタンス変数を使わず、doGet や doPost 内のローカル変数にとどめるか、スレッドセーフなコンテナ・オブジェクトを明示的に同期化して利用します。
Q: tempPDF を ThreadLocal にすれば問題は解決しますか?
A: 技術的には可能ですが、ファイルパス自体をローカル変数にすれば十分であり、設計を複雑にしない方が望ましいです。
Q: 同一ファイル名の競合を避けるためにランダム文字列を採用すれば、今回の原因も防げますか?
A: ファイル名がユニークでもインスタンス変数を共有していれば別ユーザの値に上書きされる可能性は残るため、本質的解決にはなりません。

関連キーワード: サーブレット、マルチスレッド、インスタンス変数、競合状態、スレッドセーフ

設問2本文中の下線①の苦情について、(1)〜(4)に答えよ。

(2)この苦情の原因となるプログラムのバグで発生する問題は何と呼ばれるか。15字以内で答えよ。

模範解答

・レースコンディション ・競合状態

解説

解答の論理構成

  1. 現象の整理
    • 苦情は「①マニュアルどおりに操作したにもかかわらず、ダウンロードした勤務時間集計表が他人のものだった」というものです。
    • 発生時は「25名」の同時アクセスがあり、別の日にも「23名」で再現しています。これは複数スレッド同時実行時のみ起こる典型的な並行性問題を示唆します。
  2. プログラム上の原因
    • 図3で File tempPDF; がインスタンス変数として宣言され、doGet 内で tempPDF = new File(...); と再代入されています。
    • Javaサーブレットは「シングルインスタンス・マルチスレッド」モデルで動作するため、同一インスタンスに対し複数スレッドが doGet を並行実行します。
    • 結果として、一方のスレッドが tempPDF.getName() を出力する直前に、他方のスレッドが tempPDF を上書きし、リンクに誤ったファイル名が入る恐れがあります。
  3. 不具合の典型的名称
    • 共有リソースに対する排他制御がなく、スレッド間の実行順序に依存して誤動作が起きるバグは「レースコンディション」または「競合状態」と呼ばれます。
    • よって設問が求める15字以内の呼称は「レースコンディション」または「競合状態」です。

誤りやすいポイント

  • Javaサーブレットはスレッドセーフだと誤解し、インスタンス変数を安全に使えると思ってしまう。
  • tempPDF を ThreadLocal 変数やローカル変数にしないまま、ファイル名だけランダム化しても根本解決にならない点を見逃しやすい。
  • 同時利用者数「25名」「23名」という情報を軽視し、単なるプログラムミスと考えてしまう。

FAQ

Q: ファイル名をランダム化すれば同じバグは防げますか?
A: 共有変数を並行して書き換える構造が残る限り、別の誤動作が起こる可能性があります。排他制御かローカル変数化が必要です。
Q: Javaサーブレットでインスタンス変数を安全に使う方法は?
A: スレッドごとに状態を持たせるにはローカル変数を使うか、ThreadLocal、もしくはsynchronizedで排他制御を行います。
Q: 動的に生成したPDFを直接ブラウザに返す設計(図4)は並行性対策になりますか?
A: ファイルを保存せずストリームで返せば共有リソースが減り、今回のような競合の発生確率を下げられます。ただしサーブレット内部での排他制御は依然必要です。

関連キーワード: マルチスレッド、排他制御、共有変数、同期化、セッション管理

設問2本文中の下線①の苦情について、(1)〜(4)に答えよ。

(3)上記(2)のバグを修正するためのプログラムの変更内容を、45字以内で具体的に述べよ。ただし、図2に示した仕様は変更しないものとする。

模範解答

インスタンス変数tempPDFをdoGetメソッドのローカル変数として定義する。

解説

解答の論理構成

  • ①の現象は「ダウンロードした勤務時間集計表が他人のものだった」という内容であり、同時アクセスが「25名の利用者」に及んでいました。
  • 図3では、サーブレットクラスに
    「File tempPDF;」
    が宣言され、doGet 内で
    「tempPDF = new File(KINMUHYO_LOCAL_PATH, tempUserID + ".pdf");」
    と上書きされています。
  • Java サーブレットは1インスタンスを複数スレッドで共有するため、インスタンス変数は各リクエスト間で競合します。したがって複数ユーザ処理中に tempPDF の内容が上書きされ、後続行
    「out.println("<a href="" + KINMUHYO_URL_PATH + tempPDF.getName() + "">…」」
    で誤ったファイル名が生成される可能性があります。
  • 競合の原因はインスタンス変数である点にあるため、tempPDF をスレッドごとに独立した ローカル変数 とし、各リクエスト専有にすれば問題は解消されます。
  • 以上より、模範解答「インスタンス変数tempPDFをdoGetメソッドのローカル変数として定義する。」が導かれます。

誤りやすいポイント

  • サーブレットで synchronized を追加してしまう
    → 全リクエストが直列化され性能が極端に低下するリスクがあります。
  • tempPDF を ThreadLocal にする案
    → 過剰設計であり、単純なローカル変数化で十分です。
  • セッション属性に保存する案
    → ファイル生成を終えれば不要なデータをサーバに長期間残すことになり、メモリを無駄遣いします。

FAQ

Q: インスタンス変数をローカル変数に変えるだけで本当に安全になりますか?
A: はい。ローカル変数は各スレッドのスタックに確保され共有されないため、並行アクセス時でも競合しません。
Q: doPost から doGet を呼び出す実装でも同じ対策が必要ですか?
A: 必要です。doGet 自体が並行実行されるため、メソッド内部で共有される変数がなければ安全性が確保できます。
Q: サーブレットで共有したいキャッシュ情報がある場合はどうすればよいですか?
A: 共有が必要なデータは ConcurrentHashMap などスレッドセーフなコレクションを使い、排他制御を適切に行います。

関連キーワード: サーブレット、マルチスレッド、競合状態、ローカル変数、スレッドセーフ

設問2本文中の下線①の苦情について、(1)〜(4)に答えよ。

(4)このプログラムに関して、上記(2)のバグの有無を確認するためにテストを実施したい。どのようなHTTPリクエストをどのようにWebサーバに送信すればよいか。50字以内で述べよ。

模範解答

利用者IDが異なる、多数のHTTPリクエストを、ほぼ同時にWebサーバに送信する。

解説

解答の論理構成

  • 下線①の苦情は、「25名の利用者が同時に勤務時間管理システムへアクセスしていた」ときに発生しています。
  • 図3のプログラムでは File tempPDF; がクラス変数として宣言され、doGet 内で
    tempPDF = new File(KINMUHYO_LOCAL_PATH, tempUserID + ".pdf");
    と再代入されています。Javaサーブレットは同一インスタンスをマルチスレッドで使うため、同時アクセス時に変数内容が上書きされ、他人のファイル名がリンクに出力される競合が起こります。
  • したがってバグの有無を確認するには、スレッド競合を意図的に誘発する必要があります。
  • 具体的には、異なる「6けたの数字からなる従業者番号」をそれぞれ Authorization/Cookie などに設定した複数リクエストを同時に送信し、リンク先が混在するかを観察すればよいと導けます。
  • 以上より模範解答「利用者IDが異なる、多数のHTTPリクエストを、ほぼ同時にWebサーバに送信する。」となります。

誤りやすいポイント

  • 単発リクエストや順次実行では競合が起きず、再現できないと判断してしまう。
  • テスト対象をブラウザ操作に限定し、HTTPレベルでの同時送信(スクリプト/負荷試験ツール)の必要性を見落とす。
  • 問題原因を「ファイル名の衝突」とだけ捉え、サーブレットのスレッドモデル(共有インスタンス変数)を理解せず対策を誤る。

FAQ

Q: ブラウザをたくさん立ち上げれば十分ですか?
A: 手動操作では送信タイミングがずれる可能性があります。ab や JMeter などで同時送信させる方が確実です。
Q: 利用者IDを固定した大量リクエストでもバグは再現しますか?
A: 上書き対象が同一ファイルになるため競合は起こりますが、他人のファイルが混入するかは分かりにくく、異なるIDで行う方が検証しやすいです。
Q: クラス変数を synchronized にすれば解決できますか?
A: 排他で競合は防げますが、リクエスト毎に局所変数へ変更する方が安全かつ性能面でも有利です。

関連キーワード: マルチスレッド、競合条件、共有変数、負荷試験、HTTPリクエスト

設問3本文中の下線②の脆弱性について、(1)、(2)に答えよ。

(1)この脆弱性を突いて、他人の勤務時間集計表をダウンロードする方法を50字以内で述べよ。

模範解答

他人の従業者番号を基に、勤務時間集計表のURLを推測し、ダウンロードを試みる。

解説

解答の論理構成

  • 【問題文】には「システムの利用者IDには、6けたの数字からなる従業者番号を使用する」とあります。
    → ファイル名に使われる文字列は6桁の数字で推測が容易です。
  • 図3のコードでは
    tempPDF = new File(KINMUHYO_LOCAL_PATH, tempUserID + ".pdf");
    として勤務時間集計表を保存し、 out.println("<a href="" + KINMUHYO_URL_PATH + tempPDF.getName() + "">…");
    でそのままリンクを生成しています。
    → ファイル名は「利用者ID.pdf」で固定され、URL も公開領域に配置されます。
  • 下線②の説明は「他人のパスワードを使用しなくても、容易に他人の勤務時間集計表をダウンロードできる脆弱性」です。
    → 利用者がログインしなくても、6桁の従業者番号を変えて URL を直接入力すれば該当 PDF が取得できてしまいます。
  • 以上より解答は「他人の従業者番号を基に、勤務時間集計表のURLを推測し、ダウンロードを試みる。」となります。

誤りやすいポイント

  • パスワード漏えいと混同し、ID・パスワードを盗む方法を書く。
  • URL を推測するのではなく PDF の内容を改ざんすると誤解する。
  • 「ブラウザの履歴」や「キャッシュ」から取得すると考えてしまう。
  • ファイル名に乱数を付与すれば十分と誤認し、本質が公開領域配置にある点を見逃す。

FAQ

Q: 同期アクセスで他人の PDF がダウンロードされた不具合と②の脆弱性は同じ原因ですか?
A: いいえ。同期アクセス時の不具合はプログラムの排他制御不足、②は公開領域に予測容易なファイル名で保存する設計不備です。
Q: ファイル名を乱数化すれば②は解消できますか?
A: 部分的な緩和にはなりますが、個人情報ファイルを Web 公開領域に置く設計自体が誤りなので根本対策にはなりません。
Q: Java サーブレットであればアクセス制御を簡単に付けられるのに、なぜ公開領域に置いたのですか?
A: 既存帳票プログラムの出力をそのままブラウザから参照させる安易な実装を選んだためで、経験不足が要因と推測されます。

関連キーワード: 予測可能なリソース名、ファイル公開範囲、アクセス制御、情報漏えい

設問3本文中の下線②の脆弱性について、(1)、(2)に答えよ。

(2)この脆弱性を解消する修正仕様に関して、図4中のbに入れる適切な字句を20字以内で答えよ。

模範解答

b:PDFファイル形式の勤務時間集計表

解説

解答の論理構成

  1. 図4の修正仕様では、ファイルの保存場所を「Web公開領域ではなくJavaサーブレット経由でだけアクセス可能な領域」とし、ブラウザへは直接リンクではなく別のデータを送信する方式に変更しています。
    引用:
    ・「Web公開領域ではなくJavaサーブレット経由でだけアクセス可能な領域に保存する。」
  2. 同じ図4の③(問題文では箇条書き 3.)には、 引用:
    ・「Webサーバ内のJavaサーブレットは、bをブラウザへ送信する。利用者は、ブラウザのPDFプラグイン機能によって表示された内容を印刷する。」
    とあります。
  3. ブラウザの「PDFプラグイン機能」で閲覧・印刷する前提から、サーブレットが送信するのは HTML ではなく PDF コンテンツそのものだと分かります。
  4. したがって b に当てはまる語句は、送信対象を具体的に示す「PDFファイル形式の勤務時間集計表」となります。

誤りやすいポイント

  • 「HTML」「リンク情報」など図2の旧仕様に引きずられて記述してしまう。図4はリンクを廃止している点を見落としやすいです。
  • 「PDFデータ」や「勤務時間集計表PDF」など曖昧・略語で記入し、設問の意図である“送信する対象を正確に表す”要求を満たせなくなるケース。
  • ブラウザのプラグイン機能のヒントを軽視し、画像ファイルやテキストを送ると勘違いするミス。

FAQ

Q: 送信するのが PDF だと、なぜ脆弱性が解消されるのですか?
A: ファイルを Web公開領域に置かず、サーブレットが認証済みユーザへ直接ストリーム送信するため、URL を推測して他人のファイルを取得する手口が封じられます。
Q: コンテンツタイプは何を設定すればよいですか?
A: HTTP ヘッダに "Content-Type: application/pdf" を設定し、さらに "Content-Disposition: inline" もしくは "attachment; filename=..." を付与するとブラウザが PDF として扱います。
Q: ランダムなファイル名では不十分だった理由は?
A: URL さえ推測できればダウンロード可能という構造自体が問題であり、推測耐性を上げても根本的なアクセス制御にならないからです。

関連キーワード: 認証制御、PDFストリーム、コンテンツタイプ、ダイレクトダウンロード、アクセス権限
戦国ITクイズ機能

\ せっかくなら /

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

クイズ画面へ遷移する

すぐに利用可能!

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

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