応用情報技術者 2024年 秋期 午後 問01
Webサイトのセキュリティに関する次の記述を読んで、設問に答えよ。
F社は、日用雑貨を製造・販売する中堅企業である。このたび、販路拡大を目的として自社製品を販売するWebサイト(以下、本システムという)を新規に開発した。本システムは、D社クラウドサービス上に構築しており、Webサーバとデータベース(以下、DBという)サーバから成り、D社クラウドサービスが提供するファイアウォール(以下、FWという)及びWebアプリケーションファイアウォール(以下、WAFという)を経由してインターネットからアクセスされる予定である。
本システムの開発環境のネットワーク構成(抜粋)を図1に示す。なお、本システムはリリース前であり、F社開発環境の特定のIPアドレスからだけアクセスできるようにFWで制限している。

本システムの主な仕様を次に示す。
・会員登録時に自動で発行される会員番号と会員が設定したパスワードをログインフォームに入力してログインする。商品の購入はログイン後に行う。
・パスワードとして使用できる文字は、英数字に一部の記号を加えた70種類である。
・パスワードは、6字以上16字以下で設定する。
・会員テーブルは、会員番号、メールアドレス、パスワードのハッシュ値、姓、名、住所、電話番号の7フィールドで構成されている。①パスワードのハッシュ値は、会員が設定したパスワードをハッシュ関数によってハッシュ化したものである。
F社情報セキュリティ部のG部長は、本システムのリリース前にペネトレーションテストを実施することを決定し、H主任をリーダーに任命した。H主任は、セキュリティベンダーであるU社に本システムのペネトレーションテストの実施を依頼した。
ペネトレーションテストは、U社内のPCからインターネット、FW及びWAFを経由して本システムにアクセスする経路で実施した。
ペネトレーションテスト期間中は、FW及びWAFに対して次の変更を行った。
・FWに対する変更
通信を許可するアクセス元IPアドレスとして、ペネトレーションテストに用いるU社のIPアドレスを追加する。
・WAFに対する変更
攻撃を検知した際には、通信の遮断は行わず、検知したことだけを記録する。
〔ペネトレーションテストの結果〕
ペネトレーションテストの結果、次の手順(以下、本シナリオという)で会員のパスワードが推測されて、不正にアクセスされてしまうことが確認された。
1. ②SQLインジェクション攻撃によって会員テーブルのデータを取得する。このとき取得した会員テーブルのデータ(抜粋)を表1に示す。
2. レインボーテーブル攻撃によって、手順1で取得した会員テーブル中のパスワードのハッシュ値から元のパスワードを推測する。
3. 推測したパスワードを利用して、会員になりすまして本システムにログインする。

稼働中のシステムのログインフォームに対してパスワードを総当たりで試行する a 攻撃では、システム側で試行回数に制限を設けて対策することができるが、レインボーテーブル攻撃ではそれができない。
H主任は、本システムの修正方針を整理するために、SQLインジェクション攻撃及びレインボーテーブル攻撃への対策を検討することにした。なお、ペネトレーションテスト期間中にWAFでSQLインジェクション攻撃が検知できていたが、③仮に対策の一つが破られても他の対策で攻撃を防ぐという考え方に基づき、攻撃への対策をWAFだけに頼らず本システム自体でも行うことにした。
〔SQLインジェクション攻撃への対策の検討〕
本システムのソースコードを調査したところ、一部の処理で外部からの入力値をそのままSQL文に埋め込んでいる箇所が存在していた。そこで、対策として、bを利用する方式を採用することにした。この方式では、外部からの入力値が埋め込まれる箇所を専用の記号に置き換えたSQL文の雛形をあらかじめ作成しておき、専用の記号で置き換えた箇所にDB管理システム側で外部からの入力値を割り当てる。
〔レインボーテーブル攻撃への対策の検討〕
本システムでは会員のパスワードをハッシュ化して保存しているが、パスワードそのものにハッシュ関数を1回適用しただけであったので、レインボーテーブル攻撃に対して脆弱であった。そこで、パスワードをハッシュ化する際に、次の三つの処理を組み合わせて実施することにした。
1. ソルトを用いた処理
・パスワードをハッシュ化する際に、ソルトを付加した上でハッシュ化する。
・ソルトとして、会員ごとに異なるランダムな文字列を用意し、会員テーブルに格納する。
2. ④ペッパーを用いた処理
・パスワードをハッシュ化する際に、ペッパーを付加した上でハッシュ化する。
・ペッパーとして、全ての会員に共通のランダムな文字列を用意し、Webサーバ内の外部からアクセスできない安全な領域に格納する。
3. ストレッチング
・ハッシュ関数を複数回適用する。
さらに、ハッシュ化処理の変更に加えて、会員が設定可能なパスワード長を10字以上64字以下に変更した。本システムにおいて、パスワード長が10字の場合、6字の場合と比べてパスワードとして使用可能な文字列のパターン数がc倍になるのでレインボーテーブル攻撃がより困難になる。
H主任は、これらの対策を取りまとめてG部長に報告し、承認された。
設問1:
本文中の下線①について、会員のパスワードをハッシュ関数でハッシュ化して保存することは、情報漏えいの脅威に対してメリットがある。それは、ハッシュ値にどのような特性があるからか。25字以内で答えよ。
模範解答
ハッシュ値からパスワードの割出しは難しい。
解説
解答の論理構成
- 本文には「①パスワードのハッシュ値は、会員が設定したパスワードをハッシュ関数によってハッシュ化したもの」とあります。
- 暗号学的ハッシュ関数には「入力を取得しても元の入力を容易に復元できない」という特性があり、これを一般に「一方向性」または「不可逆性」と呼びます。
- したがって、万一「会員テーブル」が流出しても、そこに保存されているのは「パスワードのハッシュ値」であり、攻撃者がその値だけから平文パスワードを求めることは著しく困難です。
- 以上より、「ハッシュ値は元のパスワードを容易に逆算できない」という特性が、情報漏えい時の被害低減につながります。
誤りやすいポイント
- 「暗号化」と「ハッシュ化」を混同する
ハッシュ化は復号キーを持たず、元に戻せない点が暗号化と異なります。 - 「ハッシュ値は絶対に復元不可能」と誤解する
辞書攻撃やレインボーテーブル攻撃で推測される場合があるため、ソルト・ストレッチングが必要です。 - 「同じ入力なら毎回異なるハッシュ値が出る」と思い込む
ソルトを付与しない限り、同じ入力からは常に同じハッシュ値が得られます。
FAQ
Q: ハッシュ関数の「一方向性」とは何ですか?
A: 入力からハッシュ値を算出することは容易でも、ハッシュ値から元の入力を導き出すことが極めて困難である性質を指します。
A: 入力からハッシュ値を算出することは容易でも、ハッシュ値から元の入力を導き出すことが極めて困難である性質を指します。
Q: なぜソルトやストレッチングが推奨されるのですか?
A: ハッシュ値単独では同じ平文パスワードが同じハッシュ値になるため、辞書攻撃やレインボーテーブル攻撃で推測されやすいからです。ソルトで一意性を持たせ、ストレッチングで計算コストを増大させることで攻撃を難化させます。
A: ハッシュ値単独では同じ平文パスワードが同じハッシュ値になるため、辞書攻撃やレインボーテーブル攻撃で推測されやすいからです。ソルトで一意性を持たせ、ストレッチングで計算コストを増大させることで攻撃を難化させます。
Q: レインボーテーブル攻撃はハッシュ値が漏えいした場合にのみ有効ですか?
A: はい。攻撃者は大量の平文―ハッシュ値対応表を用意し、漏えいしたハッシュ値と照合して平文を割り出します。ハッシュ値が手に入らなければ成立しません。
A: はい。攻撃者は大量の平文―ハッシュ値対応表を用意し、漏えいしたハッシュ値と照合して平文を割り出します。ハッシュ値が手に入らなければ成立しません。
関連キーワード: 一方向性ハッシュ、不可逆性、ソルト、ストレッチング、レインボーテーブル
設問2:
本文中の下線②について、会員テーブルのデータが漏えいした場合、情報セキュリティの3要素のどれが直接的に侵害されたといえるか。漢字3字で答えよ。
模範解答
機密性
解説
解答の論理構成
- 本文では、ペネトレーションテストの手順として「②SQLインジェクション攻撃によって会員テーブルのデータを取得する」と明記しています。
- ここで取得されたのは「会員番号、メールアドレス、パスワードのハッシュ値、姓、名、住所、電話番号」といった登録情報であり、外部に公開されるべきでない個人データです。
- 情報セキュリティの3要素(CIA)に照らすと、
• 機密性:許可されていない主体から情報を隠蔽する性質
• 完全性:改ざんから守る性質
• 可用性:必要なときにアクセスできる性質 - 今回の被害は「漏えい=本来見せてはいけない情報が外部に閲覧された」ことに該当し、直接的に脅かされたのは機密性です。可用性の低下や完全性の破壊は示されていません。
- 以上より、設問が求める3字の答えは「機密性」となります。
誤りやすいポイント
- 「会員テーブル」のデータが改ざんされたわけではないため、完全性と取り違えやすいです。
- 「ログイン不能になったら可用性」などの一般論を当てはめ、本問では該当しない要素を選択してしまうケース。
- 「ハッシュ値が暴かれた=暗号が破られた」と考え、機密性より暗号の話に意識が向きすぎる誤答。
FAQ
Q: ハッシュ値が漏えいしただけなら可用性や完全性も同時に侵害されたと考えられませんか?
A: 本文では閲覧されただけでシステム停止や改ざんは説明されていないため、直接的に侵害されたのは機密性と判断します。
A: 本文では閲覧されただけでシステム停止や改ざんは説明されていないため、直接的に侵害されたのは機密性と判断します。
Q: 「匿名化されているハッシュ値なら機密性は守られている」と考えて良い?
A: ハッシュ値自体も攻撃者がパスワードを推測する手掛かりになります。ハッシュ化されていても個人情報の一部とみなされ、漏えいは機密性の侵害です。
A: ハッシュ値自体も攻撃者がパスワードを推測する手掛かりになります。ハッシュ化されていても個人情報の一部とみなされ、漏えいは機密性の侵害です。
Q: SQLインジェクションでデータ取得が成功しても検知できれば機密性は守られる?
A: 検知は事後対応を可能にしますが、取得を阻止できなければ機密性は既に破られています。
A: 検知は事後対応を可能にしますが、取得を阻止できなければ機密性は既に破られています。
関連キーワード: 機密性、SQLインジェクション、データ漏えい、CIAトライアド、個人情報
設問3:
本文中のa、bに入れる適切な字句を解答群の中から選び、記号で答えよ。
解答群
ア:エスケープ
イ:許可リスト
ウ:サニタイズ
エ:中間者
オ:ブルートフォース
カ:プレースホルダ
キ:リプレイ
模範解答
a:オ
b:カ
解説
解答の論理構成
-
aに対応する記述
- 問題文には「稼働中のシステムのログインフォームに対してパスワードを総当たりで試行する a 攻撃」とあります。
- パスワードを総当たりで試行する手法は一般にブルートフォース攻撃と呼ばれます。
- 解答群でブルートフォース攻撃に該当するのは「オ:ブルートフォース」です。
➜ したがって a = オ。
-
bに対応する記述
- SQLインジェクション対策として「外部からの入力値が埋め込まれる箇所を専用の記号に置き換えたSQL文の雛形をあらかじめ作成しておき、専用の記号で置き換えた箇所にDB管理システム側で外部からの入力値を割り当てる」と問題文にあります。
- 上記特徴はプレースホルダ方式(プリペアドステートメント)そのものです。
- 解答群でプレースホルダに該当するのは「カ:プレースホルダ」です。
➜ したがって b = カ。
誤りやすいポイント
- 類義語の混同
エスケープ(ア)やサニタイズ(ウ)は入力値の無害化という点で対策手法に含まれますが、問題文が示す「専用の記号に置き換えた雛形」=プレースホルダである点を見落とすと誤選択しやすいです。 - ブルートフォースと辞書攻撃の取り違え
総当たり(全探索)か、既成リストを使うかで定義が異なります。本問は「総当たりで試行」と明示しているためブルートフォースが正解になります。 - 多層防御の意味
「③仮に対策の一つが破られても他の対策で攻撃を防ぐという考え方」とあるように、WAFだけでなくアプリ側でも防御することが重要です。WAFが検知できていた事実に惑わされて、アプリ側のプレースホルダ実装を不要と判断しないよう注意が必要です。
FAQ
Q: プレースホルダを使えば SQLインジェクションは完全に防げますか?
A: 高い防御効果がありますが、設定ミスや動的に生成されるSQL(ORDER BY句に列名を埋め込むなど)では依然としてリスクが残るため、入力値の検証や最小権限設定と併用することが推奨されます。
A: 高い防御効果がありますが、設定ミスや動的に生成されるSQL(ORDER BY句に列名を埋め込むなど)では依然としてリスクが残るため、入力値の検証や最小権限設定と併用することが推奨されます。
Q: ブルートフォース攻撃への一般的な追加対策は?
A: アカウントロック、CAPTCHA、IPレピュテーションチェック、多要素認証などが挙げられます。
A: アカウントロック、CAPTCHA、IPレピュテーションチェック、多要素認証などが挙げられます。
Q: レインボーテーブル攻撃に対してソルトだけで十分でしょうか?
A: ランダムソルトの導入で大幅に難度は上がりますが、ペッパーやストレッチングを組み合わせることで、ハッシュ総当たりや辞書生成コストをさらに押し上げることができます。
A: ランダムソルトの導入で大幅に難度は上がりますが、ペッパーやストレッチングを組み合わせることで、ハッシュ総当たりや辞書生成コストをさらに押し上げることができます。
関連キーワード: ブルートフォース攻撃、プレースホルダ、SQLインジェクション、レインボーテーブル
設問4:
本シナリオによって、表1に示す会員テーブルのデータが窃取され、会員番号21717202の会員のパスワードが推測され不正アクセスを受けたとすると、推測されたパスワードを利用して不正アクセスを受けるおそれが最も強い他の会員は誰か。該当する会員の会員番号を解答群の中から選び、記号で答えよ。
解答群
ア:21717203
イ:30781985
ウ:36150833
エ:45905900
オ:45917046
模範解答
イ
解説
解答の論理構成
- 攻撃者は「②SQLインジェクション攻撃によって会員テーブルのデータを取得する」とあります。取得したデータの一部が表1に示されています。
- 表1には、会員番号「21717202」のパスワードのハッシュ値が
「5e884898da28047151d0e56f8dc6292773603d0d6aabbbdd62a11ef721d1542d8」
であることが示されています。 - ハッシュ関数は「入力が同じなら出力(ハッシュ値)も必ず同じ」という性質を持ちます。したがって、同一のハッシュ値を持つレコードは同じパスワードを使用していると判断できます。
- 表1を見ると、会員番号「30781985」もまったく同じハッシュ値
「5e884898da28047151d0e56f8dc6292773603d0d6aabbbdd62a11ef721d1542d8」
を持っています。 - 攻撃者はすでにこのハッシュ値に対応する平文パスワードをレインボーテーブル攻撃で入手しているため、「③仮に対策の一つが破られても他の対策で攻撃を防ぐという考え方に基づき」実装されていても同じパスワードを用いる他会員のアカウントが最も狙われやすくなります。
- よって、最も不正アクセスを受けるおそれが強いのは会員番号「30781985」に該当する解答群「イ」となります。
誤りやすいポイント
- ハッシュ値が重複している行を見落とし、姓や名が同じだからといって別レコードを選んでしまう。
- 「ac9689e22724…」など別のハッシュ値でも重複があるが、攻撃者が必ずしもそのハッシュの平文パスワードを得ているとは限らない点を忘れる。
- 「21717202」と同じ氏名「T中 T郎」を持つ「45917046」に着目してしまうが、ハッシュ値が異なるため同じパスワードである保証はない。
FAQ
Q: 同じハッシュ値でもソルトやペッパーを導入すれば重複はなくなりますか?
A: はい。ソルトを「会員ごとに異なるランダムな文字列」として付加すれば、同じパスワードでも異なるハッシュ値になります。ペッパーの追加やストレッチングと併用することでさらに安全性が向上します。
A: はい。ソルトを「会員ごとに異なるランダムな文字列」として付加すれば、同じパスワードでも異なるハッシュ値になります。ペッパーの追加やストレッチングと併用することでさらに安全性が向上します。
Q: ハッシュ値が一致するだけで本当に同じパスワードだと断定できますか?
A: 現実的には断定できます。ハッシュ関数の衝突を意図的に起こすのは極めて困難であり、偶然同じハッシュ値が発生する確率は無視できるほど低いからです。
A: 現実的には断定できます。ハッシュ関数の衝突を意図的に起こすのは極めて困難であり、偶然同じハッシュ値が発生する確率は無視できるほど低いからです。
Q: パスワード長を「10字以上64字以下」に変更する効果は?
A: パスワードとして使用可能な文字が70種類あるため、長さが6字から10字に増えるとパターン数は
倍になり、レインボーテーブル攻撃の事前計算量が飛躍的に増加します。
A: パスワードとして使用可能な文字が70種類あるため、長さが6字から10字に増えるとパターン数は
倍になり、レインボーテーブル攻撃の事前計算量が飛躍的に増加します。
関連キーワード: SQLインジェクション、レインボーテーブル、ハッシュ値、ソルト、ペッパー
設問5:
本文中の下線③の考え方を、漢字4字で答えよ。
模範解答
多層防御
解説
解答の論理構成
- 問題文は、攻撃対策の基本方針として
「③仮に対策の一つが破られても他の対策で攻撃を防ぐという考え方に基づき」
と述べています。 - これは、同じ脅威に対して複数の異なる防御策を重ねることで、ある層が突破されても次の層で被害を食い止める設計思想を示しています。
- この思想を表す代表的な日本語の専門用語が「多層防御」です。
- よって解答は「多層防御」となります。
誤りやすいポイント
- 「ゼロトラスト」や「境界防御」と混同しやすいですが、問題文は“複数の対策を積み上げる”ことに焦点を当てています。
- 英語表現 “Defense in Depth” をそのままカタカナで「ディフェンスインデプス」と答えると漢字4字の条件を満たしません。
- “多重防御” と書く受験生もいますが、試験で一般的に採用される用語は「多層防御」です。
FAQ
Q: 「多層防御」は必ず物理層とアプリ層の両方を含める必要がありますか?
A: 必ずしも全層を網羅する義務はありませんが、複数層を意識して組み合わせることが重要です。
A: 必ずしも全層を網羅する義務はありませんが、複数層を意識して組み合わせることが重要です。
Q: WAF だけを強化しても十分ではないのですか?
A: WAF は有効な一層ですが、誤検知・回避技術が存在するため、アプリコード修正など別の層も必要です。
A: WAF は有効な一層ですが、誤検知・回避技術が存在するため、アプリコード修正など別の層も必要です。
Q: 多層防御を実装すると運用コストが上がりませんか?
A: 多少のコスト増はありますが、単一防御が破られた際の被害額や復旧コストを考慮すると、結果的にリスク低減効果が上回るケースが多いです。
A: 多少のコスト増はありますが、単一防御が破られた際の被害額や復旧コストを考慮すると、結果的にリスク低減効果が上回るケースが多いです。
関連キーワード: 多層防御、SQLインジェクション、WAF, ファイアウォール、レインボーテーブル
設問6:〔レインボーテーブル攻撃への対策の検討〕について答えよ。
(1)本文中の下線④について、ペッパーを付加してハッシュ化することで本シナリオにおいてレインボーテーブル攻撃が困難になる理由を、ソルトを用いた処理との違いに着目して35字以内で答えよ。
模範解答
会員テーブルの窃取だけではペッパーを得ることができないから
解説
解答の論理構成
- 本文では下線部④について「ペッパーとして、全ての会員に共通のランダムな文字列を用意し、Webサーバ内の外部からアクセスできない安全な領域に格納する。」と記載されています。
- これに対してソルトは「会員ごとに異なるランダムな文字列を用意し、会員テーブルに格納する。」とあります。
- 本シナリオで攻撃者が成功した手順は「②SQLインジェクション攻撃によって会員テーブルのデータを取得する」です。すなわち攻撃者が閲覧できるのは会員テーブル内のデータのみで、Webサーバの安全な領域には到達できません。
- ソルトはテーブルに含まれるため窃取されてもおかしくありませんが、ペッパーは「Webサーバ内の外部からアクセスできない安全な領域」に置かれ、同じ経路では取得できません。
- よって「会員テーブルの窃取だけではペッパーを得ることができない」ため、ハッシュ値から逆算しようにも未知のペッパーが計算を妨げ、レインボーテーブル攻撃が困難になります。
誤りやすいポイント
- ソルトとペッパーを同じ場所に保存すると考え、効果を過小評価してしまう。
- 「共通のランダムな文字列=推測しやすい」と誤解し、安全領域にあるという前提を見落とす。
- レインボーテーブル攻撃は総当たり攻撃aと同じ対策で止められると思い込み、テーブル窃取の脅威を軽視する。
FAQ
Q: ソルトが漏えいしても安全と言えるのですか?
A: はい。ソルトは「レインボーテーブルを無効化する」目的であり、漏えい自体は想定内です。ソルト+ストレッチングで計算量を増やし、さらにペッパーで未知情報を追加して安全性を高めます。
A: はい。ソルトは「レインボーテーブルを無効化する」目的であり、漏えい自体は想定内です。ソルト+ストレッチングで計算量を増やし、さらにペッパーで未知情報を追加して安全性を高めます。
Q: ペッパーはなぜ全ユーザ共通でも問題ないのですか?
A: 推測困難な十分長いランダム文字列であれば、未知である限り攻撃者は総当たりしか手段がありません。共通か否かより、「安全な領域に保存され漏えいしない」ことが重要です。
A: 推測困難な十分長いランダム文字列であれば、未知である限り攻撃者は総当たりしか手段がありません。共通か否かより、「安全な領域に保存され漏えいしない」ことが重要です。
Q: ストレッチングだけでは足りませんか?
A: ストレッチングは計算量を上げる対策ですが、ペッパーのように未知情報を追加する効果はありません。複数手法を組み合わせ「③仮に対策の一つが破られても他の対策で攻撃を防ぐ」という多層防御が推奨されます。
A: ストレッチングは計算量を上げる対策ですが、ペッパーのように未知情報を追加する効果はありません。複数手法を組み合わせ「③仮に対策の一つが破られても他の対策で攻撃を防ぐ」という多層防御が推奨されます。
関連キーワード: ソルト、ペッパー、レインボーテーブル、ストレッチング、多層防御
設問6:〔レインボーテーブル攻撃への対策の検討〕について答えよ。
(2)本文中のcに入れる適切な数を、のような指数を用いた表記で答えよ。
模範解答
c:
解説
解答の論理構成
-
文字種類の確認
本文には「パスワードとして使用できる文字は、英数字に一部の記号を加えた70種類である。」とあります。したがって、1文字当たりの取り得るパターン数は 通りです。 -
比較するパスワード長
変更前 ― 「パスワードは、6字以上16字以下で設定する。」
変更後 ― 「パスワード長を10字以上64字以下に変更した。」
今回求めるのは“10字の場合、6字の場合と比べて”の倍率です。 -
可能な文字列総数
・長さ6文字の総数:
・長さ10文字の総数: -
倍率の算出
倍率 = -
結論
c に入る数は となります。
誤りやすいポイント
- 「70種類」を「62種類(英数字のみ)」と誤って読み取る。問題文中の「一部の記号を加えた70種類」を必ず引用確認しましょう。
- 6字と10字の差を単に“4文字増えた”と解釈し、 など線形増加と勘違いする。実際には指数的に増える点が本質です。
- 最大長 64 字に注目してしまい、比較対象が“10字と6字”であることを見落とす。
FAQ
Q: 長さを 10→64 字に延ばした場合の倍率はどう計算しますか?
A: 同じ考え方で となります。指数の差に注意してください。
A: 同じ考え方で となります。指数の差に注意してください。
Q: 文字集合が増える場合はどうなりますか?
A: 例えば 70 → 94 種類に増えるなら、長さ に対し総数は 。倍率は底(文字種)と指数(長さ)の両方が効くため、さらに大きな差になります。
A: 例えば 70 → 94 種類に増えるなら、長さ に対し総数は 。倍率は底(文字種)と指数(長さ)の両方が効くため、さらに大きな差になります。
Q: “レインボーテーブル攻撃”ではなぜ文字列総数が重要ですか?
A: レインボーテーブルは“事前計算表”です。候補総数が指数的に増えるほど表のサイズが現実的に作成・保持できなくなり、攻撃コストが飛躍的に上昇します。
A: レインボーテーブルは“事前計算表”です。候補総数が指数的に増えるほど表のサイズが現実的に作成・保持できなくなり、攻撃コストが飛躍的に上昇します。
関連キーワード: パスワード強度、レインボーテーブル、ソルト、ストレッチング、組合せ数学


