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

情報処理安全確保支援士 2014年 春期 午後1 問01


Webアプリケーションに関する次の記述を読んで、設問1〜3に答えよ。

 B社は、従業員数50名のインターネットサービス企業であり、インターネット上で各種の情報サービスを提供している。これらのサービスの実現に当たり、必要なアプリケーションを自社開発してきた。このたびB社では、画像ファイルを対象としたオンライン共有ストレージサービス(以下、Sサービスという)を立ち上げることにし、R部長を責任者としてアプリケーション開発に着手した。Sサービスの画面には広告主のサイトへのリンクを含んだバナー広告を掲載し、利用者からの利用料収入に加えて広告料収入の獲得も目指す。   〔Sサービスの要件定義〕  B社では、P主任を中心としてSサービスの要件を検討した。検討の結果、P主任はSサービスの要件案を図1に示すとおりまとめた。
情報処理安全確保支援士試験(平成26年度 春期 午後1 問01 図01)
 この要件案は、レビューされた後、R部長によって承認された。   〔システム・ソフトウェア要件定義〕  その後、Q主任を中心としてシステム・ソフトウェア要件定義を実施した。その結果、SサービスはJavaサーブレットを利用したWebアプリケーションで構成することにした。画像処理プログラムについてはC++で記述し、プログラム内ではCベースの画像処理ライブラリであるV-libを利用することにした。JavaからC++プログラムを呼び出す際には、JNI(Java Native Interface)を利用することにした。   〔ソフトウェアの基本設計〕  システム・ソフトウェア要件定義が完了し、ソフトウェアの基本設計を開始した。その中で、V君はWebアプリケーションのセッション管理の方式について検討した。  次は、検討に際してのQ主任とV君との会話である。
 Q主任:HTTPセッション管理には、どのような方式を採用するつもりかな。  V君 :セッション管理には、ログオン時にランダム文字列をセッションIDとして割り当てた上で、クエリパラメタの中にセッションIDを格納する方式を採用するつもりです。  Q主任:当社でも実績のある方式だね。ただ、今回はHTTPSだけでなくHTTPも使用できるようにするから、GETメソッドではなくPOSTメソッドを使用しておかないと、①HTTPヘッダ内のフィールドが原因で、バナー広告に設定されたリンク先のWebサーバへセッションIDが漏えいすることが考えられるね。
 更に基本設計が進む中で、実行形式ファイルがアップロードされるとウイルスの温床になりかねないという指摘があった。議論した結果、この指摘への対策の一つとして、アップロードするファイルの拡張子を画像ファイルのものに制限することとした。制限する方式として、V君は、Webブラウザにおいてスクリプトによって判定することを考えた。この方式を実装したスクリプトを含むHTMLファイル例を図2に示す。この方式案について相談を受けたQ主任は、②契約者の操作によっては、拡張子が画像ファイルのものでないファイルがアップロードできてしまうという問題点を指摘し、制限する方式には③スクリプトによらない方式を検討するよう指示した。V君はその後、異なる方式を提案し、採用に至った。
情報処理安全確保支援士試験(平成26年度 春期 午後1 問01 図02)
〔画像処理プログラムでの不具合〕  基本設計及び詳細設計が無事完了し、U主任を中心としたグループでプログラムの作成を開始した。U主任は、サムネイル表示の際に使用するために、様々なファイル形式の画像ファイルを縦横とも128ピクセルに変換する画像処理プログラム(以下、ピクセル数変換プログラムという)の作成をT君に指示した。T君は、最初に、複数のファイル形式の中からファイル形式Zを選択して、ピクセル数変換プログラムの作成に取り掛かった。  このプログラムで取り扱う、ファイル形式Zを図3に示す。ピクセル数変換そのものには、V-lib内のvlibResize関数を使用することにした。V-lib内で定義され、vlibResize関数の引数として使用するvlibMat構造体の説明を図4に示す。また、vlibResize関数の外部仕様を図5に示す。
情報処理安全確保支援士試験(平成26年度 春期 午後1 問01 図03)
情報処理安全確保支援士試験(平成26年度 春期 午後1 問01 図04)
情報処理安全確保支援士試験(平成26年度 春期 午後1 問01 図05)
 T君は、図6のピクセル数変換プログラムを作成し、U主任によるソースコードレビューを受けた。そのソースコードレビューで、U主任は、入力する画像ファイルの内容によっては38行目においてaが発生し、その結果として50行目においてbが発生することを指摘した。  なお、この処理系において、int型は4バイト、short int型は2バイト、char型は1バイトである。また、char型は特に記述がなければ符号なしである。
情報処理安全確保支援士試験(平成26年度 春期 午後1 問01 図06)
 T君はこの指摘を受けて、図6の37行と38行の間に図7に示す行を追加し、再度U主任のソースコードレビューを受けた。ソースコードレビューの結果、指摘された問題点が修正されていること、他の部分に同種の問題点が存在しないことが確認された。
 その後、全てのプログラムの作成とテストが完了して、B社はSサービスの運用を開始することができた。

設問1:〔ソフトウェアの基本設計〕について、(1)〜(3)に答えよ。

問題文を見る
(1)本文中の下線①のHTTPヘッダ内のフィールド名は何か。英字10字以内で答えよ。

模範解答

Referer

解説

解答の論理構成

  1. 問題文では、「GETメソッドではなくPOSTメソッドを使用しておかないと、①HTTPヘッダ内のフィールドが原因で、バナー広告に設定されたリンク先のWebサーバへセッションIDが漏えいする」 と記載されています。
  2. GETメソッドでセッションIDをクエリパラメタに埋め込むと、リンク遷移時に現在閲覧しているURL(=セッションID付き)が外部サイトへ伝わる仕組みが存在します。
  3. ブラウザはリンクをクリックした際、HTTPリクエストに元ページのURLを示すRefererヘッダを自動付与します。これにより外部サイトに「どのページから来たか」が通知されます。
  4. クエリパラメタにセッションIDが含まれていれば、そのままRefererヘッダに載ってしまい漏えいします。
  5. 以上から、下線部①の “HTTPヘッダ内のフィールド” はRefererであると導けます。

誤りやすいポイント

  • Cookieと混同する
    セッションIDをCookieで管理する場合はブラウザが外部サイトに送信しないため本問の漏えいは起きません。
  • フィールド名の綴り
    正しくは “Referrer” ではなくHTTP仕様どおり “Referer” と綴ります。
  • Locationヘッダの誤認
    Locationはサーバ側が返す応答ヘッダであり、今回の「ブラウザ→外部サイト」送信ヘッダではありません。

FAQ

Q: なぜPOSTメソッドなら漏えいしないのですか?
A: POST方式でもRefererは送信されますが、セッションIDをクエリパラメタで渡さずHTTPボディに含めるためReferer内にセッションIDが現れません。
Q: Cookieでセッション管理すれば完全に安全ですか?
A: 参照先が同一サイトなら安全ですが、Cookieが盗まれる別のリスク(XSSなど)が残るため、安全策としてはHTTPSとSecure属性付きCookieの併用が望まれます。
Q: Refererヘッダを無効にする設定でも対策できますか?
A: ブラウザやMETAタグ、Content-Security-Policyで制御可能ですが、利用者全員に強制はできないためサーバ側設計での対策(POST+Cookieなど)が基本となります。

関連キーワード: HTTPヘッダ、Referer, セッションID, クエリパラメタ、情報漏えい

解説を読んでも分からないところは、AIに質問できます。 この問題の本文と解説をふまえて答えます。

この設問をAIに質問する

クイズモードで開きます(AIへの質問は無料の会員登録で使えます)

設問1:〔ソフトウェアの基本設計〕について、(1)〜(3)に答えよ。

問題文を見る
(2)本文中の下線②の契約者の操作とは何か。30字以内で述べよ。

模範解答

ブラウザの設定でスクリプトを無効化する。

解説

解答の論理構成

  • 問題文には、ファイル拡張子の判定を「③スクリプトによらない方式」に変更せよとあります。
  • その理由として、Q主任が「②契約者の操作によっては、拡張子が画像ファイルのものでないファイルがアップロードできてしまう」と指摘しています。
  • 図2のHTMLでは <script type="text/javascript"> でinput.onsubmit = function () { … } としており、判定ロジックはJavaScript依存であることが分かります。
  • つまりJavaScriptが動かない状態ではチェックが行われません。JavaScriptを動かなくする典型的な「契約者の操作」はブラウザ側でスクリプトを無効化することです。
  • 従って下線②の操作は「ブラウザの設定でスクリプトを無効化する」となります。

誤りやすいポイント

  • 「ファイル名を変更する」と勘違いしやすいですが、ファイル名変更はスクリプト判定後にサーバ側が再検証すれば防げるため、設問の趣旨とずれます。
  • 「HTTPを直接叩く」と解釈すると余分な想定になります。問題文の指摘はJavaScript依存のチェックに潜む単純な盲点を問うています。
  • 「ブラウザの拡張機能で改ざん」と考えると複雑化しますが、基本動作としてJavaScriptを無効化できることを見落としやすいです。

FAQ

Q: JavaScriptを無効化する利用者は少ないのでは?
A: セキュリティポリシやアドオンで無効化する例は実際に存在し、Webアプリは想定すべきです。
Q: サーバ側でMIMEタイプを確認すれば良いのでは?
A: はい。そのような「③スクリプトによらない方式」として、サーバ側で拡張子・MIME・マジックナンバーを検証するのが一般的です。
Q: POST送信なら安全なのでは?
A: POST送信は通信経路上の漏えい対策であり、クライアントサイドの入力検証漏れとは別問題です。

関連キーワード: クライアントサイドバリデーション、JavaScript無効化、ファイルアップロード、入力検証、セキュリティ対策

解説を読んでも分からないところは、AIに質問できます。 この問題の本文と解説をふまえて答えます。

この設問をAIに質問する

クイズモードで開きます(AIへの質問は無料の会員登録で使えます)

設問1:〔ソフトウェアの基本設計〕について、(1)〜(3)に答えよ。

問題文を見る
(3)本文中の下線③の方式とはどのようなものか。30字以内で述べよ。

模範解答

Webアプリケーションで拡張子判定を行う。

解説

解答の論理構成

  • 基本設計の会話では、V君がブラウザ側スクリプトで拡張子を判定する案を提示しました。
    引用:
    「この指摘への対策の一つとして、アップロードするファイルの拡張子を画像ファイルのものに制限することとした。制限する方式として、V君は、Webブラウザにおいてスクリプトによって判定することを考えた。」
  • しかしQ主任は、契約者の操作次第で制限を回避できる弱点を挙げ、 引用:
    「②契約者の操作によっては、拡張子が画像ファイルのものでないファイルがアップロードできてしまうという問題点を指摘し、制限する方式には③スクリプトによらない方式を検討するよう指示した。」
  • 「③スクリプトによらない方式」は、ブラウザ(クライアント)ではなくサーバ側で判定を行う方式を指します。ブラウザ依存を排除することで、利用者がスクリプトを無効化した場合や改ざんした場合でも安全に拡張子制限を適用できます。
  • したがって解答は「Webアプリケーションで拡張子判定を行う。」となります。

誤りやすいポイント

  • 「MIMEタイプ判定」とだけ答えると拡張子制限かどうかが不明確になり減点される恐れがあります。
  • 「サーバ側でウイルスチェックを行う」など、拡張子以外の対策を混在させると設問の焦点がずれます。
  • 「HTTPS強制」や「Content-Dispositionヘッダ」など、別のセキュリティ手法と混同しないよう注意が必要です。

FAQ

Q: クライアント側スクリプトだと何が問題なのですか?
A: 利用者がブラウザの開発者ツールなどでスクリプトを無効化・改変すると、意図しないファイルをアップロードできてしまいます。サーバ側チェックなら回避されません。
Q: 拡張子判定だけで十分なのでしょうか?
A: 本問では拡張子制限が要求事項ですが、実際の運用では拡張子だけでなくMIMEタイプ確認やファイル内容検査も併用するのが望ましいです。
Q: サーバ側で判定するにはどこで実装するのですか?
A: 本システムでは「Javaサーブレットを利用したWebアプリケーション」で構築するため、サーブレット内でアップロードされたファイルの拡張子を確認し、不適切なものはエラー応答を返します。

関連キーワード: 拡張子チェック、サーバ側検証、クライアントスクリプト、ファイルアップロード、セキュリティ対策

解説を読んでも分からないところは、AIに質問できます。 この問題の本文と解説をふまえて答えます。

この設問をAIに質問する

クイズモードで開きます(AIへの質問は無料の会員登録で使えます)

設問2:〔画像処理プログラムでの不具合〕について、(1)、(2)に答えよ。

問題文を見る
(1)本文中のa、bに入れる適切な字句を、それぞれ15字以内で答えよ。

模範解答

a:整数オーバフロー b:バッファオーバフロー

解説

解答の論理構成

  1. 38行目の計算
    bytesOfBuff = bytesOfRow * fhBuf.rows; とあります。
    直前の37行目でbytesOfRowは列数にkColorsを掛けた後に256バイト境界へ調整しているため、元画像が大きい場合にはbytesOfRowがかなり大きくなります。ここでfhBuf.rows(行数)との乗算を行うと、32ビット符号付き整数の最大値である0x7fffffffを超えるケースが発生し得ます。
    → この現象は「整数オーバフロー」です。
  2. オーバフローが起きた場合の副作用
    bytesOfBuffに本来より小さい値が格納されてしまい、41行目
    pixBuf = (char*)malloc(bytesOfBuff);
    で確保される領域も不足したサイズになります。
  3. 不足領域への書込み
    47~53行目のforループでは、元画像全体を読み込みます。実データサイズは正しい値のままなので、確保サイズを超えてpixBufを更新し続け、結果として
    50行目fread(pixBuf, kColors, fhBuf.cols, fp);
    でメモリ境界を越えて書き込むことになります。
    → これは「バッファオーバフロー」です。
  4. 追加行による修正
    図7の追加行
    if ( c < d ) throw out_of_range("Image too large");
    で、乗算前に「列数×行数×色数」が安全な範囲か確認し、オーバフローとそれに続くバッファオーバフローを事前に防止しています。
以上より
a に入る語句は「整数オーバフロー」、 b に入る語句は「バッファオーバフロー」と判断できます。

誤りやすいポイント

  • 「配列境界を超える=バッファオーバフロー」に目が行き、原因である「整数オーバフロー」を見落とす。
  • 37行目の256バイト境界調整を“端数切り上げ”と誤解し、計算式が安全だと思い込む。
  • unsigned short intで定義されているヘッダ項目を「正なら問題なし」と考え、列数・行数チェックを甘くしてしまう。

FAQ

Q: 乗算前にlong long型へキャストすれば十分ですか?
A: 計算結果を保持できても、その後のmallocが32ビットOSで扱えるサイズを超える恐れがあります。キャストだけでなくサイズ上限のチェックが必要です。
Q: 追加行で比較している c と d は何を想定していますか?
A: 一般に (long long)fhBuf.cols * fhBuf.rows * kColorsとkMaxInteger(0x7fffffff)を比較します。これで演算結果がintの上限を超えないことを保証できます。
Q: バッファオーバフローを検出するツールは必須ですか?
A: 推奨ですが、検出ツールに頼るだけでなく、設計段階から境界値分析・入力バリデーションを徹底することが根本的な対策になります。

関連キーワード: 整数オーバフロー、バッファオーバフロー、境界チェック、入力バリデーション

解説を読んでも分からないところは、AIに質問できます。 この問題の本文と解説をふまえて答えます。

この設問をAIに質問する

クイズモードで開きます(AIへの質問は無料の会員登録で使えます)

設問2:〔画像処理プログラムでの不具合〕について、(1)、(2)に答えよ。

問題文を見る
(2)U主任が指摘したaが発生する入力ファイルに関する条件を、kMaxIntegerという字句を用いて60字以内で述べよ。

模範解答

ヘッダ部の列数と各ピクセルのバイト数の積にパディングを加えたものと、行数の積がkMaxIntegerを超える。

解説

解答の導き方

まず図6の該当箇所を順に確認します。図6の16行目に「unsigned short int f_version, cols, rows, colors;」とあり、fhBuf.colsとfhBuf.rowsはunsigned short intです。図6の25行目に「int bytesOfRow, bytesOfBuff;」とあり、bytesOfRowとbytesOfBuffはint型です。さらに図6の11行目で「const int kMaxInteger = 0x7fffffff;」と定義されています(intは4バイトと明記されています)。
次に処理の流れを追います。図6の36行目に「bytesOfRow = fhBuf.cols * fhBuf.colors;」、37行目に「bytesOfRow += 255 - ((bytesOfRow + 255) % 256);」とあり、これによりbytesOfRowはパディング済みの1行当たりバイト数(正のint)になります。続く38行目に「bytesOfBuff = bytesOfRow * fhBuf.rows;」とあります。ここでbytesOfRowはint、fhBuf.rowsはunsigned short intですが算術変換によりintに昇格して積はint型で計算されます。
もしその積が を超えると、intの表現範囲を越えて算術オーバーフローが起きます(38行目で発生する [a] はここでの整数オーバーフローです)。オーバーフローによりbytesOfBuffに期待した大きな値が入らないまま進み、図6の41行目の「pixBuf = (char*)malloc(bytesOfBuff);」で実際に必要なバイト数より小さい領域が確保されます。その後、図6の50行目「fread(pixBuf, kColors, fhBuf.cols, fp);」で1行あたり バイトが書き込まれ、確保領域を越えて上書きされるため [b] はバッファオーバーフロー(ヒープ上の領域の上書き)になります。
以上から、38行目での [a] が発生する入力ファイルの条件は次のとおりです。
「ヘッダ部の列数と各ピクセルのバイト数の積にパディングを加えたものと、行数の積がkMaxIntegerを超える」
図7の挿入チェックは、積を直接計算して比較すると既にオーバーフローしている可能性があるため安全ではありません。オーバーフローを回避する安全な判定は除算を用いる方法です。具体的には次のようにすればよいです。
if () throw out_of_range("Image too large");
図7の [d] に入れる適切な変数はfhBuf.rowsです(この挿入例では [c] に を置きます。どちらか一方に を含める指示に合致します)。

誤りやすいポイント

  • fhBuf.cols/fhBuf.rowsをintと誤認する。実際は「unsigned short int」であり、演算時にintに昇格する点を意識する必要がある。
  • 判定にそのまま を書くと、その演算自体でオーバーフローして比較が無意味になる。積による比較は避け、除算を使ってオーバーフローを未然に検出する。
  • bytesOfBuffと確保サイズのチェックをkMaxMatDataのみで行うと、オーバーフローで小さくなったbytesOfBuffに対してチェックがすり抜ける場合がある。まず に対する保護を行うこと。
  • ゼロ除算の可能性を忘れがちだが、本コードではfhBuf.cols/rowsが0の場合は既に例外が投げられる(図6の35行目)ため、除算チェックは安全に使える。実務では防御的にbytesOfRow > 0の確認を入れるとより堅牢。

FAQ

Q: なぜif (bytesOfRow * fhBuf.rows > kMaxInteger) はダメなのですか?
A: 積の計算自体がintの範囲を超えると未定義あるいはラップしてしまい、比較が正しく行えません。掛け算を行う前に のように除算で上限を求めるのが安全です。
Q: kMaxMatData(100M)を基準にすれば十分ではないですか?
A: kMaxMatDataは許容する最大データ量の制限であり、オーバーフロー検出には不十分です。まず整数演算の上限()を超えないことを確認し、その後で と比較して制限をかけます。
Q: より確実な実装修正は?
A: 中間計算をより大きな型(size_tやuint64_t)で行い、乗算結果が安全に保持できるか検査するか、除算によるガードを入れてからintに代入する。加えて、mallocの戻り値とfreadの戻り値/書込長を厳密に検査すること。

関連キーワード: 整数オーバーフロー、バッファオーバーフロー、型昇格、パディング(アラインメント)、境界チェック

解説を読んでも分からないところは、AIに質問できます。 この問題の本文と解説をふまえて答えます。

この設問をAIに質問する

クイズモードで開きます(AIへの質問は無料の会員登録で使えます)

図7中のc、dに入れる適切な式又は変数を答えよ。 なお、c、dのどちらか一方は、kMaxIntegerを含むこと。(同じ群中の組合せとする)

模範解答

ア群:  c:kMaxInteger / fhBuf.rows  d:bytesOfRow イ群:  c:kMaxInteger / bytesOfRow  d:fhBuf.rows

解説

解答の論理構成

  1. 背景把握
    • 【問題文】図6 37~38行で
      bytesOfRow += 255 - ((bytesOfRow + 255) % 256); /*256バイト境界に調整*/ bytesOfBuff = bytesOfRow * fhBuf.rows;
      とあり、bytesOfRow * fhBuf.rowsで int型の乗算が行われています。
    • 同図39行目で
      if (bytesOfBuff > kMaxMatData) throw out_of_range("Image too large");
      というサイズ上限チェックを行っていますが、実際には38行目の乗算時点で intの最大値(kMaxInteger)を超えると桁あふれ(整数オーバフロー) が発生し、正常な比較ができなくなります。
  2. 追加行の目的
    • 【問題文】図7では
      if ( c < d ) throw out_of_range("Image too large");
      を37~38行の間に挿入し、乗算を実行する前に 桁あふれを未然に検知 させるのが狙いです。
  3. オーバフローの一般的な判定式
    • 乗算A * BがkMaxIntegerを超えるかどうかは
      if (A > kMaxInteger / B) // 乗算するとオーバフロー
      で判定できます。
    • これを「左右を入れ替えた形」にしても論理は同じで、
      if (B > kMaxInteger / A)
      でもかまいません。
  4. 当該変数への当てはめ
    • 乗算の片方AがbytesOfRow、もう片方BがfhBuf.rowsです。
    • よって、チェック式は次の2パターンのいずれかになります。
      ア群
      if (kMaxInteger / fhBuf.rows < bytesOfRow) …
      イ群
      if (kMaxInteger / bytesOfRow < fhBuf.rows) …
    • 問題指示「c、d のどちらか一方は、kMaxIntegerを含むこと」にも合致しています。
  5. よって模範解答は
    • ア群
      • c:kMaxInteger / fhBuf.rows
      • d:bytesOfRow
    • イ群
      • c:kMaxInteger / bytesOfRow
      • d:fhBuf.rows

誤りやすいポイント

  • kMaxMatDataとkMaxIntegerを取り違え、上限比較を誤る。
  • 既に計算済みのbytesOfBuffを使ってチェックしてしまい、乗算後のオーバフローを防げない。
  • /(整数除算)が切り捨てであることを忘れ、境界条件を間違える。
  • “大きい方”と“小さい方”を逆に比較し、常に例外が発生しない・常に発生するというバグを入れる。

FAQ

Q: unsigned intにすればオーバフロー対策は不要ですか?
A: いいえ。符号なしでも桁あふれは発生し、値が0へ巻き戻るだけで例外は出ません。事前チェックが必要です。
Q: doubleで計算し、最後にキャストする方法は?
A: 浮動小数点演算誤差により完全に安全ではありません。整数型のままオーバフロー判定を行う方が堅牢です。
Q: ガードチェックを複数回入れると性能に影響しますか?
A: 除算と比較のみなのでオーバーヘッドはわずかです。安全性を優先すべき場面です。

関連キーワード: 整数オーバフロー、ガードチェック、メモリ安全性、画像リサイズ

解説を読んでも分からないところは、AIに質問できます。 この問題の本文と解説をふまえて答えます。

この設問をAIに質問する

クイズモードで開きます(AIへの質問は無料の会員登録で使えます)

戦国ITクイズ機能

\ せっかくなら /

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

クイズ画面へ遷移する→

すぐに利用可能!

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

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