情報処理安全確保支援士 2022年 春期 午後2 問01
Webサイトのセキュリティに関する次の記述を読んで、設問1~6に答えよ。
A社は、従業員1,500名の中堅システム開発会社である。A社では、セキュリティ品質の高いWebサイトを開発するために、表1に示すWebセキュリティ管理基準を定めて運用している。

〔A社によるB社の子会社化〕
B社は、従業員200名の新興のITサービス会社であり、各種SaaSを提供している。アジャイル開発の能力が高く、機能の追加や性能の改善を頻繁に行っている。B社とA社とは協業関係にあったが、両社の経営陣は、双方の強みを生かせると判断し、A社によるB社の子会社化について合意した。
B社のクラウド環境には、コーポレートサイト(以下、サイトBという)、及びB社が提供中の三つのSaaSそれぞれのWebサイト(以下、サイトX、サイトY、サイトZという)がある。それらの概要を表2に示す。

子会社化に当たって、B社のWebサイトのセキュリティ水準を確認することになり、A社の品質管理部でセキュリティ技術を担当しているRさんが対応することになった。
〔B社のWebサイトのセキュリティ水準の確認〕
Rさんは、サイトB、サイトX、サイトY及びサイトZに対する脆弱性診断をD社に依頼した。診断の結果、検出された脆弱性を表3に示す。

〔サイトBのXSS脆弱性〕
D社は、サイトBに①診断用リクエストを送ることで、XSS脆弱性があることを確認した。このリクエストは、ライブラリMを使ってプログラムCが処理する。ライブラリMのコードを図1に示す。


ライブラリMは、SEOのためのライブラリである。
B社では、開発部のメンバそれぞれが、開発時に利用可能なライブラリを収集している。使用するライブラリは、マルウェアが含まれていない、既知の脆弱性が修正された、安全性が確認できているライブラリを公開しているWebサイトから、ファイルサーバにダウンロードし、利用している。ファイルサーバは、開発部のメンバであればアクセス可能である。
今回使われていたライブラリMは、既知のXSS脆弱性の対策をしていないバージョンであった。その結果、ライブラリMを使っているサイトB、サイトX、サイトY及びサイトZにおいて、同じXSS脆弱性が検出された。
これを受けて、B社における②再発防止策について検討した。
〔サイトXのCSRF脆弱性〕
サイトXは、セッションIDをJSESSIONIDというcookieに格納している。D社は、サイトXのキャンペーン応募ページでCSRF脆弱性を検出した。
CSRF脆弱性を確認した手順は、次のとおりであった。
(1)診断用利用者(以下、利用者Aという)の利用者IDでサイトXにログインし、キャンペーン応募ページで送信されるリクエストの内容をツールを使って確認した。リクエストの内容を図2に示す。

リクエストの内容を確認後、cstftokenをCSRF対策用のパラメタと考え、リクエスト中のcsrftokenの値を削除して送信した場合と1文字変更して送信した場合を試したところ、どちらもエラーになった。
(2)利用者Aとは別の診断用利用者(以下、利用者Bという)の利用者IDでサイトXにログインし、キャンペーン応募ページで送されるリクエスト中のcsrftokenの値に、図2のcsrftokenの値を設定して送信したところ、利用者Bとして処理された。
この結果から、csrftoken とa又はbとをひも付けるという対策ができていないことが分かった。
〔サイトXのクリックジャッキング脆弱性〕
サイトXでは、クリックジャッキングによって、利用者が気付かずに利用者情報の公開範囲を変更させられてしまう脆弱性が検出された。攻撃者が図3の画面を用いてクリックジャッキングを行う場合を仮定してみる。このとき、クリックイベントは、利用者から見て手前にある画面上で発生するものとする。

攻撃者は、画面cを利用者から見てdにe状態で罠サイトに公開し、サイトXの画面fを利用者から見てgにh状態で重ねて表示する。この状態のサイトにアクセスした利用者は、意図せず利用者情報の公開範囲を変更させられてしまう可能性がある。
クリックジャッキング脆弱性の対策には、レスポンスヘッダにiを含める方法とjを含める方法がある。後者は標準化されている。
〔サイトYのSSRF脆弱性〕
サイトYでは、例えば、図4のリクエストを受け取ると、A社のニューストピックを取得し、表示するようになっている。

この処理にSSRF脆弱性があった。D社は、③図4のリクエスト中の値を変更してサイト Y に送り、サイト Y の DB サーバのメンテナンス用の Web インタフェースにアクセスできることを確認した。
〔サイトZのSSRF脆弱性〕
サイトZでは、最近、新機能が開発された。新機能の一つである、旅行会社 P 社の宿泊サイト(以下、P 社宿泊サイトという)との連携機能でSSRF脆弱性が検出された。その機能は、駅名を入力すると、その駅近辺のホテルの割引クーポンなどの“お得情報”を表示できるというものである。利用者が、P 社宿泊サイトに登録されている駅名の一つ、“東京”を入力したときの流れを図5に、登録されていない架空の駅名である“abc”を入力したときの流れを図6に、D社の専門技術者 V氏がSSRF脆弱性を検出した手順を表4に示す。



表4の手順によって、V氏は、Authorizationヘッダの値を受け取ることができた。P社の協力の下、この値を用いることで、本来許可なしではアクセスできないP社宿泊サイトや同じAuthorizationヘッダの値を利用するP社保有のサーバへのアクセスが可能になることを確認した。
D社からは、P社宿泊サイトからのレスポンスに含まれるURLが想定されたものかを調べて想定外の値の場合はそのURLにはアクセスしないようにするという、SSRF脆弱性への対策が提案された。加えて、④別の対策も実施することが望ましいとのことであった。
Rさんは、D社の脆弱性診断で検出された脆弱性について、B社の開発部のE課長に報告した。その後、B社の開発部によって対策が実施され、D社による再度の脆弱性診断で問題が修正されたことが確認された。
〔開発プロセスの見直し〕
B社のWebサイトのセキュリティ水準について、Rさんは、開発プロセスの観点からも調査を進めた。
B社では、顧客に機能の追加要望や性能の改善要望をヒアリングしながら、開発部内で目標を設定し、アジャイル開発を行っている。また、社外の研修などでセキュアプログラミングの知識を習得し、その知識を生かしてWebサイトを開発している。
B社の開発プロセスの概要を図7に示す。

Rさんは、B社のWebサイトのセキュリティ水準を十分なものにするためには、A社のようなWebセキュリティ管理基準をB社に導入する必要があると考えた。次は、B社の開発プロセスについてのRさんとE課長の会話である。
Rさん:B社でも表1のとおりに実施できますか。
E課長:開発フェーズにおいてはできると思います。しかし、改良リリースの周期は2週間程度です。専門技術者による脆弱性診断には、その周期の大半を費やしてしまうので、省略できないでしょうか。
Rさん:⑤ソースコードレビューやツールによる脆弱性診断では発見できないが、専門技術者による脆弱性診断では発見できる脆弱性が多くあります。専門技術者による脆弱性診断を改良リリースにおいて毎回実施できない場合でも、当該診断が長期間行われないことを避けるために、⑥時期を決めて実施することや、⑦開発プロセスを見直すことを検討してみてください。
E課長:分かりました。そのほかに、アジャイル開発に合った脆弱性対策はないでしょうか。
Rさん:Webサイトの実装に必要となる一般的な機能や定型コードを、ライブラリとしてあらかじめ用意したフレームワークには、⑧脆弱性対策が組み込まれていて、それがデフォルトで有効になっているものもあるので、利用を検討してみてください。
その後、B社は、セキュリティを考慮したアジャイル開発を行うことになった。
設問1:〔サイトBのXSS脆弱性〕について、(1)、(2)に答えよ。
(1)本文中の下線①における診断用リクエストの構成要素を、解答群の中から選び、記号で答えよ。
解答群
ア:リクエストライン:GET/confirm?"><img src=1 onerror=alert(1)><"
イ:リクエストライン:GET/confirm?><img src=1 onerror=alert(1)><"
ウ:リクエストライン:POST/confirm
リクエストボディ:"><img src=1 onerror=alert(1)><"
エ:リクエストライン:POST/confirm
リクエストボディ:><img src=1 onerror=alert(1)><"
模範解答
ア
解説
解答の論理構成
-
問題文に示されたライブラリ M のコード
1: out.println("<meta property="og:url" content="https://"+serverName+"/"+scriptName+"?"+queryString+"">");
では、queryString が タグの content 属性値内にそのまま出力されます。 -
属性値は既に " で始まっているので、ここにユーザ入力が入る場合、 ① 属性値を閉じるための " を先頭に入れる
② 直後に > を入れて タグ自体を閉じる
③ 続けて悪意のあるタグ(ここでは<img src=1 onerror=alert(1)>)を挿入する
④ 最後にダミーの " を置いて字面を整える
――という典型的な属性内インジェクション型 XSS が成立します。 -
したがって診断用リクエストは
・メソッドが GET(queryString を使うため)
・URI が /confirm?"><img src=1 onerror=alert(1)><"
という形になります。 -
解答群を照合すると、上記の条件を満たすのは
ア:リクエストライン:GET/confirm?"><img src=1 onerror=alert(1)><"
だけです。 -
よって解答は 「ア」 となります。
誤りやすいポイント
- 先頭の "(")を忘れると の content 属性を閉じられず XSS が成立しません。
- POST メソッドを選ぶと queryString が空になるため、ライブラリ M のコード行には注入されず不発となります。
- scriptName の後に ? が自動で付くことに気づかず、? を二重に書いてしまうケース。
FAQ
Q: alert(1) の数字は何でもよいのですか?
A: ブラウザ上で動けば数字は任意ですが、診断では識別しやすいように「1」など短い値を使うのが一般的です。
A: ブラウザ上で動けば数字は任意ですが、診断では識別しやすいように「1」など短い値を使うのが一般的です。
Q: POST でもボディを解析して取り込むアプリなら XSS になりますか?
A: はい。ただし今回のライブラリ M は queryString(=URL のクエリ部)しか使っていないので、POST でボディに悪性データを入れてもコード行には反映されません。
A: はい。ただし今回のライブラリ M は queryString(=URL のクエリ部)しか使っていないので、POST でボディに悪性データを入れてもコード行には反映されません。
Q: HTML 属性値内 XSS とタグ間 XSS に対策の違いはありますか?
A: 基本は「入力値の適切なエスケープ」ですが、属性値内では " や ' のエスケープを忘れやすい点に注意が必要です。
A: 基本は「入力値の適切なエスケープ」ですが、属性値内では " や ' のエスケープを忘れやすい点に注意が必要です。
関連キーワード: クロスサイトスクリプティング、属性値インジェクション、HTTPリクエスト、入力値検証、エスケープ
設問1:〔サイトBのXSS脆弱性〕について、(1)、(2)に答えよ。
(2)本文中の下線②について、考えられる再発防止策を、35字以内で述べよ。
模範解答
「ダウンロードするライブラリに既知の脆弱性がないかを確認する。」
または
「特定のWebサイトからの入手をルール化し、明文化する。」
解説
解答の論理構成
- 原因の把握
- 問題文より「今回使われていたライブラリMは、既知のXSS脆弱性の対策をしていないバージョンであった。」
- さらに「開発部のメンバそれぞれが…ライブラリを収集している。」とあり、個々人の判断でバージョン管理されていない。
- 再発防止の方向性
- 脆弱なバージョンを混入させないこと、入手経路を統制することが鍵。
- そこで「ダウンロードするライブラリに既知の脆弱性がないかを確認する。」という手順を明確化する。
- 解答
- 上記を35字以内に要約し、再発防止策として提示する。
誤りやすいポイント
- 「最新版を使う」とだけ書くと、最新版にも脆弱性が残存する可能性があるため不十分。
- 「社内でテストする」など検証方法を答えてしまい、再発防止の仕組み(事前確認)に触れない。
- ライブラリ使用禁止やソースコード改修のような“運用を止める策”を記述し、開発スピードとの両立を欠く。
FAQ
Q: ライブラリのダウンロード先を限定するだけでは不十分ですか?
A: はい。限定先に置かれたファイルが安全とは限らないため、「既知の脆弱性がないかを確認する」手順が必須です。
A: はい。限定先に置かれたファイルが安全とは限らないため、「既知の脆弱性がないかを確認する」手順が必須です。
Q: 自動ツールでのスキャンを導入すれば再発防止になりますか?
A: 助けになりますが、ツールの定義ファイル更新や誤検知確認が必要です。手動レビューとの併用が望ましいです。
A: 助けになりますが、ツールの定義ファイル更新や誤検知確認が必要です。手動レビューとの併用が望ましいです。
Q: 全メンバが自由にアクセスできるファイルサーバは問題ですか?
A: 無秩序なバージョン混在を招きやすいので、権限制御や承認フローを追加することを推奨します。
A: 無秩序なバージョン混在を招きやすいので、権限制御や承認フローを追加することを推奨します。
関連キーワード: XSS, ライブラリ管理、既知脆弱性、セキュア開発
設問2:
本文中のa、bに入れる適切な字句を答えよ(aとbは順不同)。
模範解答
a:利用者ID
b:セッションオブジェクト
解説
解答の論理構成
- 問題文は「この結果から、csrftoken とa又はbとをひも付けるという対策ができていないことが分かった。」と述べています。
- CSRF 対策では、発行したトークンを「誰のリクエストであるか」と結び付けなければ再利用を防げません。
- 手順(2)では「利用者Aとは別の診断用利用者(以下、利用者Bという)の利用者IDでサイトXにログインし … 図2のcsrftokenの値を設定して送信したところ、利用者Bとして処理された。」とあります。
- 異なる利用者でも同一トークンが通用した事実から、トークンが利用者を識別する情報――すなわち「利用者ID」と紐付いていないと判断できます。
- もう一つの典型的な結合対象はサーバ側で管理される「セッション」を一意に表す情報です。問題文では cookie に「JSESSIONID」が設定されている記述があり、これに対応するサーバ側の「セッションオブジェクト」とトークンを関連付ける実装が想定されます。
- 以上より、aは「利用者ID」、bは「セッションオブジェクト」と結論づけられます。
誤りやすいポイント
- 「JSESSIONID」自体を答えにしてしまう
→ 問題が求めるのはサーバ側で保持するオブジェクト名であり、Cookie 名ではありません。 - 「IPアドレス」や「User-Agent」を選んでしまう
→ 変化しやすく、CSRF 防御のひも付け対象としては適切でないため不正解です。 - a と b を固定の順序で覚えてしまう
→ 設問は「順不同」と明記しているため、どちらが a/b でも正解になります。
FAQ
Q: なぜ「セッションID」ではなく「セッションオブジェクト」と書くのですか?
A: サーバ側でトークンと結び付ける対象は、セッション ID で参照されるデータ構造全体(セッションオブジェクト)だからです。
A: サーバ側でトークンと結び付ける対象は、セッション ID で参照されるデータ構造全体(セッションオブジェクト)だからです。
Q: トークンを利用者 ID とセッションの両方に結び付ける必要がありますか?
A: どちらか一方でも実装上の安全性は大きく向上しますが、二重に結び付ける方がより堅牢です。
A: どちらか一方でも実装上の安全性は大きく向上しますが、二重に結び付ける方がより堅牢です。
Q: SameSite 属性を設定すれば今回の CSRF は防げましたか?
A: 多くのケースで有効ですが、外部連携など SameSite を緩くする必要がある場面では別途トークン結合が必須です。
A: 多くのケースで有効ですが、外部連携など SameSite を緩くする必要がある場面では別途トークン結合が必須です。
関連キーワード: CSRF, トークンバインディング、セッション管理、サイト間攻撃、脆弱性診断
設問3:〔サイトXのクリックジャッキング脆弱性〕について、(1)、(2)に答えよ。
(1)本文中のc〜hに入れる適切な字句を、それぞれの解答群の中から選び、記号で答えよ。
c, fに関する解答群
ア:a、イ:β
d, gに関する解答群
ア:奥、イ:手前
e, hに関する解答群
ア:可視の、イ:透明な
模範解答
c:イ
d:ア
e:ア
f:ア
g:イ
h:イ
解説
解答の論理構成
-
与えられた条件を把握
参照箇所:【問題文】「クリックイベントは、利用者から見て手前にある画面上で発生するものとする。」
すなわち、実際にクリックイベントを受け取るのは最前面(手前)に配置された画面です。 -
典型的なクリックジャッキングの仕組み
・利用者には攻撃者が用意した“おとり”ページを見せて誘導する。
・その背後(または前面の透明レイヤ)に本来のターゲット画面を配置し、クリックを奪う。 -
選択肢の整理
c, f の候補:ア「a」/イ「β」
d, g の候補:ア「奥」/イ「手前」
e, h の候補:ア「可視の」/イ「透明な」 -
画面配置の決定
攻撃者はまず「おとり画面」をユーザに見せる必要があります。引用:【問題文】
「攻撃者は、画面cを利用者から見てdにe状態で罠サイトに公開し、サイトXの画面fを利用者から見てgにh状態で重ねて表示する。」(1) “おとり”はユーザに見えていなければならない → e =「可視の」。
(2) その“おとり”より前面にターゲット画面を透明で重ねることでクリックを奪う →
・ターゲット画面 α は「手前」かつ「透明な」。
・“おとり”画面 β は「奥」かつ「可視の」。 -
画面名の割り当て
図ではユーザ設定を行う本物の UI が「画面α」、誘導用 UI が「画面β」で示されている。したがって
・おとり=β → c=「β」(イ)
・ターゲット=α → f=「a」(ア) -
位置と状態の確定
・画面β:奥・可視 → d=「奥」(ア)、e=「可視の」(ア)
・画面α:手前・透明 → g=「手前」(イ)、h=「透明な」(イ) -
以上より
c:イ、d:ア、e:ア、f:ア、g:イ、h:イ が導出される。
誤りやすいポイント
- 「クリックイベントは最前面で発生」という一文を読み落とし、可視画面を手前に配置してしまう。
- “画面α/β”を図のイメージだけで判断し、どちらがターゲットかを取り違える。
- 「透明=見えない=背面」と早合点し、透明レイヤを背面にしてしまう。
- 位置(奥/手前)と状態(可視/透明)の二軸を混同し、一部だけ正しくても全体が崩れる。
FAQ
Q: 透明にした画面が最前面にあってもユーザには見えないのでは?
A: 透明化により視覚的には見えませんが DOM 要素は存在し、最前面にあるためクリックイベントを受け取れます。これがクリックジャッキングの核心です。
A: 透明化により視覚的には見えませんが DOM 要素は存在し、最前面にあるためクリックイベントを受け取れます。これがクリックジャッキングの核心です。
Q: “X-Frame-Options”や“Content-Security-Policy”は今回の設問に関係ありますか?
A: クリックジャッキング対策として後段の設問に登場しますが、本小問(c~h)の解答には影響しません。画面配置だけを考えれば導出できます。
A: クリックジャッキング対策として後段の設問に登場しますが、本小問(c~h)の解答には影響しません。画面配置だけを考えれば導出できます。
Q: 奥と手前の判断基準は Z-index の大小と考えて良いですか?
A: はい。一般に Z-index が大きいほど手前(最前面)に描画され、ユーザのクリックもそこで発生します。
A: はい。一般に Z-index が大きいほど手前(最前面)に描画され、ユーザのクリックもそこで発生します。
関連キーワード: クリックジャッキング, レイヤ配置, Z-index, 透明化, UIレドレス
設問3:〔サイトXのクリックジャッキング脆弱性〕について、(1)、(2)に答えよ。
(2)本文中のi、j|に入れる適切な字句を、解答群の中から選び、記号で答えよ。
解答群
ア:Content-Disposition
イ:Content-Security-Policy
ウ:X-Content-Type-Options
エ:X-Frame-Options
模範解答
i:エ
j:イ
解説
解答の論理構成
- 本文には「クリックジャッキング脆弱性の対策には、レスポンスヘッダにiを含める方法とjを含める方法がある。後者は標準化されている。」と記載されています。
- クリックジャッキング対策として広く使われてきた従来のヘッダは “X-Frame-Options” です。これは RFC 化されておらず非標準(ベンダ拡張)扱いですが、多くのブラウザに実装されています。
- その後、新しい標準仕様として “Content-Security-Policy” に frame-ancestors ディレクティブが取り込まれ、クリックジャッキング対策を含む多目的な機能が標準化されました。ここでいう「後者は標準化されている」に合致します。
- よって
・i = 「X-Frame-Options」
・j = 「Content-Security-Policy」
が妥当となります。 - 解答群と照合すると
ア:Content-Disposition
イ:Content-Security-Policy
ウ:X-Content-Type-Options
エ:X-Frame-Options
から、 i:エ、j:イ が正答です。
誤りやすいポイント
- 「標準化」のキーワードから X-Frame-Options を選んでしまう。実際には非標準であり、標準化済みは Content-Security-Policy です。
- X-Content-Type-Options と X-Frame-Options を混同する。前者は MIME スニッフィング対策であり、クリックジャッキングとは無関係です。
- Content-Disposition ヘッダはファイルダウンロード時の挙動制御であり、本設問の文脈には該当しません。
FAQ
Q: X-Frame-Options を設定すれば Content-Security-Policy は不要ですか?
A: 長期的には Content-Security-Policy を推奨します。後者は標準仕様で細粒度な制御が可能なため、ブラウザ対応状況を確認しつつ移行してください。
A: 長期的には Content-Security-Policy を推奨します。後者は標準仕様で細粒度な制御が可能なため、ブラウザ対応状況を確認しつつ移行してください。
Q: X-Frame-Options に指定できる値には何がありますか?
A: 一般的には DENY、SAMEORIGIN、ALLOW-FROM の3種類です。ただし ALLOW-FROM はブラウザによって実装状況が異なります。
A: 一般的には DENY、SAMEORIGIN、ALLOW-FROM
Q: Content-Security-Policy を導入する際の注意点は?
A: 既存のフレーム埋込要件(広告やウィジェット等)がある場合は frame-ancestors で許可ドメインを明示する必要があります。設定を誤ると正規機能も表示できなくなるため、段階的にテストすることが重要です。
A: 既存のフレーム埋込要件(広告やウィジェット等)がある場合は frame-ancestors で許可ドメインを明示する必要があります。設定を誤ると正規機能も表示できなくなるため、段階的にテストすることが重要です。
関連キーワード: クリックジャッキング、X-Frame-Options, Content-Security-Policy, HTTPレスポンスヘッダ、フレーミング制御
設問4:
本文中の下線③について、図4のリクエスト中のどの値をどのような値に変更したか。45字以内で具体的に述べよ。
模範解答
topicの値をhttps://db-yb-sha.co.jp/に変更した。
解説
解答の論理構成
-
SSRF 脆弱性の説明
【問題文】には「D社は、③図4のリクエスト中の値を変更してサイト Y に送り、サイト Y の DB サーバのメンテナンス用の Web インタフェースにアクセスできることを確認した。」とあります。
つまり“図4”で指定している取得先 URL を、内部にある管理用 URL に書き換えたことがポイントです。 -
書き換え対象の特定
“図4”の GET 例は「GET /news?topic=https://www.a-sha.co.jp/news/20220417.html HTTP/1.1」と示されています。ここでパラメタ名は topic です。 -
書き換え先の特定
表2脚注に「サイトY の DB サーバ: https://db-y.b-sha.co.jp/」と明記されています。これは“メンテナンス用の Web インタフェース”の URL です。 -
以上より導出
変更内容は「topic の値を “https://db-y.b-sha.co.jp/” に差し替える」となります。
これが「DB サーバのメンテナンス用 Web インタフェース」に対してサーバ側リクエストを発生させ、SSRF が成功する理由です。
誤りやすいポイント
- Host ヘッダを書き換えたと勘違いする
— 図4で問題になっているのはクエリパラメタ topic です。 - URL を「http://」にしてしまう
— 表2脚注は「https://db-y.b-sha.co.jp/」と HTTPS を示しています。 - ドメインのピリオドを抜かして「db-yb-sha.co.jp」と誤記する
— 正しくは「db-y.b-sha.co.jp」です。
FAQ
Q: topic 以外のパラメタを追加しても SSRF は起こりますか?
A: 本件では topic が直接取得先 URL になるため最も簡単に SSRF を再現できます。他パラメタ追加だけでは内部 URL へのアクセスは成立しません。
A: 本件では topic が直接取得先 URL になるため最も簡単に SSRF を再現できます。他パラメタ追加だけでは内部 URL へのアクセスは成立しません。
Q: なぜクライアント側ではなくサーバ側リクエストになるのですか?
A: サイトYの実装が topic の URL をサーバ側でフェッチして内容を利用者に返しているためです。従って内部向け URL でも到達できます。
A: サイトYの実装が topic の URL をサーバ側でフェッチして内容を利用者に返しているためです。従って内部向け URL でも到達できます。
Q: WAF で防げますか?
A: 部分的には可能ですが、パラメタ値をホワイトリスト検証するなどアプリ側の対策が推奨です。
A: 部分的には可能ですが、パラメタ値をホワイトリスト検証するなどアプリ側の対策が推奨です。
関連キーワード: SSRF, クエリパラメータ、内部URLアクセス、HTTPS, サーバサイドフェッチ
設問5:〔サイトZのSSRF脆弱性〕について、(1)、(2)に答えよ。
(1)表4中のkに入れる適切な字句を、15字以内で答えよ。
模範解答
k:V氏が用意したサイト
解説
解答の論理構成
- 表4の手順1には
「Hostヘッダの値を、V氏が用意したサイトのFQDNに変更して、サイトZにリクエストを送る。」
とあり、最初のリクエストで “だまし先” のホスト名を仕込んでいることが分かります。 - 図5の注2には
「サイトZは、(1)のHostヘッダの値を、returnURL中のホスト名として指定する。」
という仕様が明記されています。したがってサイトZがP社宿泊サイトへ転送する際、returnURL= のホスト部分も V氏が用意したサイト になります。 - 手順2で P社宿泊サイトに送られたリクエストには、上記 returnURL が含まれています。
- 手順3では
「P社宿泊サイトは、Locationヘッダに k のURLを含めたレスポンスをサイトZに返す。」
とあり、P社は returnURL の値をそのまま Location: に入れてリダイレクトを指示しています。 - 以上より k に入るべき内容は、手順1・手順2で埋め込まれた V氏が用意したサイト の URL でなければ筋が通りません。
答え
k:V氏が用意したサイト
k:V氏が用意したサイト
誤りやすいポイント
- 「returnURL が https://z.b-sha.co.jp/error で固定」と早合点し、本来のホスト名の置換処理を見落とす。
- Location: を P社宿泊サイト自身の URL と想定し、認可トークンの流出経路を理解できない。
- 手順1と手順3の主体(利用者→サイトZ、P社→サイトZ)を混同し、どの段階でホスト名が変わるのかを取り違える。
FAQ
Q: なぜ Host ヘッダを改ざんするだけでリダイレクト先を乗っ取れるのですか?
A: サイトZが「(1)のHostヘッダの値を、returnURL中のホスト名として指定する」という実装であったためです。攻撃者が任意ホスト名を設定すると、その値が returnURL → Location: と伝搬します。
A: サイトZが「(1)のHostヘッダの値を、returnURL中のホスト名として指定する」という実装であったためです。攻撃者が任意ホスト名を設定すると、その値が returnURL → Location: と伝搬します。
Q: P社宿泊サイト側でホワイトリストを設ければ防げますか?
A: 有効です。returnURL パラメータの値を P社側で検証し、許可したドメインのみを Location: に使用すれば SSRF につながる外部リクエストを遮断できます。
A: 有効です。returnURL パラメータの値を P社側で検証し、許可したドメインのみを Location: に使用すれば SSRF につながる外部リクエストを遮断できます。
Q: サイトZ側でできる追加対策は?
A: 「想定外のURLにはアクセスしない」に加え、DNS 逆引き/正引きチェックや、認可用ヘッダを外部転送前に除去することが挙げられます。
A: 「想定外のURLにはアクセスしない」に加え、DNS 逆引き/正引きチェックや、認可用ヘッダを外部転送前に除去することが挙げられます。
関連キーワード: SSRF, Hostヘッダ、リダイレクト、Locationヘッダ、トークン漏えい
設問5:〔サイトZのSSRF脆弱性〕について、(1)、(2)に答えよ。
(2)本文中の下線④について、別の対策とは何か。B社で実施することが望ましい対策を、25字以内で述べよ。
模範解答
returnURLの値を固定値にする。
解説
解答の論理構成
- 攻撃の成立要因
- 表4「Hostヘッダの値を、V氏が用意したサイトのFQDNに変更」
- 注2「returnURLには、登録されていない駅名が入力されたときに利用されるURLを指定する。サイトZは、(1)のHostヘッダの値を、returnURL中のホスト名として指定する。」
利用者が入力できる Host ヘッダと returnURL が連動し、最終的に 任意の外部サイト へサーバ側からリクエストが送られてしまいます。
- 現状の対策案
- 問題文「想定外の値の場合はそのURLにはアクセスしないようにする」
これはレスポンスを検査する受動的対策であり、入口でのコントロールは残っています。
- 問題文「想定外の値の場合はそのURLにはアクセスしないようにする」
- 入口での追加対策の必要性
送信前に外部 URL への変換自体を許さない設計が最も確実です。具体的には returnURL を利用者入力から切り離し、サーバ側で固定してしまえば「外部ドメインへリダイレクト→再アクセス」という流れが消滅します。 - 結論
したがって④に入る「別の対策」は
「returnURLの値を固定値にする。」
となります。これにより利用者や攻撃者が returnURL を改変しても、サーバはあらかじめ用意した特定ページ(例:https://z.b-sha.co.jp/error)以外へは遷移せず、SSRF を根本から防止できます。
誤りやすいポイント
- 「Host ヘッダの検証だけで十分」と考えてしまう
→ returnURL が書き換えられる限り、内部で生成されるリダイレクト先も操作可能です。 - 「CSRF トークンの導入で対処できる」と誤解する
→ 本件はサーバサイドリクエストフォージェリであり、利用者の操作とは無関係です。 - 「URL ホワイトリスト」はレスポンス検証と同義と勘違い
→ ホワイトリストは入口(returnURL を受け付ける段階)で適用しなければ効果が限定的です。
FAQ
Q: returnURL を固定するとユーザビリティは下がりませんか?
A: エラーページへの遷移先は固定で問題なく、他の画面遷移には別パラメータを使用する設計にすれば影響を最小化できます。
A: エラーページへの遷移先は固定で問題なく、他の画面遷移には別パラメータを使用する設計にすれば影響を最小化できます。
Q: 出力側での URL 検証と固定値化、どちらを優先すべきですか?
A: まずは固定値化など入口での制御を行い、念のため出力側でも検証を行う多層防御が推奨されます。
A: まずは固定値化など入口での制御を行い、念のため出力側でも検証を行う多層防御が推奨されます。
Q: 既存システムで returnURL を多用途に使っている場合の代替策は?
A: 署名付きトークンで遷移先を制限する方式が有効です。サーバが発行したトークンのみ許可することで任意 URL への悪用を防ぎます。
A: 署名付きトークンで遷移先を制限する方式が有効です。サーバが発行したトークンのみ許可することで任意 URL への悪用を防ぎます。
関連キーワード: SSRF, リダイレクト、入力検証、多層防御、パラメータ固定
設問6:〔開発プロセスの見直し〕について(1)〜(4)に答えよ。
(1)本文中の下線⑤について、該当する脆弱性を二つ挙げ、それぞれ15字以内で答えよ。
模範解答
・一部のセッション管理の脆弱性
・認可・アクセス制御の脆弱性
解説
解答の論理構成
- 【問題文】の表1「項番2 ツールによるソースコードレビュー」「項番3 プロジェクトメンバによるソースコードレビュー」「項番4 ツールによる脆弱性診断」には共通して
――「セッション管理の脆弱性は、一部だけが対象である。」
――「認可・アクセス制御の脆弱性は、対象外である。」
と明記されています。 - 一方、同じ表1の「項番5 専門技術者による脆弱性診断」では
――「セッション管理の脆弱性は、対象である。」
――「認可・アクセス制御の脆弱性は、対象である。」
とされ、専門技術者だけがフルスコープで診断することが示されています。 - したがって R さんの下線⑥「ソースコードレビューやツールによる脆弱性診断では発見できないが、専門技術者による脆弱性診断では発見できる脆弱性」に該当するのは、
・ソースコードレビュー/自動診断で“部分的にしか扱わない”セッション管理の欠陥
・そもそも“対象外”とされている認可・アクセス制御の欠陥
の二つです。 - 【模範解答】として提示されている
「・一部のセッション管理の脆弱性
・認可・アクセス制御の脆弱性」
がそれに合致します。
誤りやすいポイント
- 「セッション管理の脆弱性」とだけ書くと“全部”を意味するため減点の恐れがあります。表1に「一部だけが対象」とあることから「一部の〜」と限定する必要があります。
- 「アクセス制御」だけを書くと抽象度が高過ぎます。「認可・アクセス制御の脆弱性」と表記を合わせることが重要です。
- XSS や CSRF など他の脆弱性はツール診断でも検出範囲なので設問の条件に当てはまりません。
FAQ
Q: なぜ「一部のセッション管理の脆弱性」と“部分”を付けるのですか?
A: 表1の記述に「セッション管理の脆弱性は、一部だけが対象である。」と明記されているため、専門技術者診断で初めて“残りの部分”がカバーされることを示す必要があります。
A: 表1の記述に「セッション管理の脆弱性は、一部だけが対象である。」と明記されているため、専門技術者診断で初めて“残りの部分”がカバーされることを示す必要があります。
Q: 「認可」と「アクセス制御」は同じ意味ですか?
A: 広義には近い概念ですが、試験では表1にある原文「認可・アクセス制御の脆弱性」をそのまま引用して記述するのが安全です。
A: 広義には近い概念ですが、試験では表1にある原文「認可・アクセス制御の脆弱性」をそのまま引用して記述するのが安全です。
Q: 専門技術者診断を毎回実施できない場合の代替策は?
A: 問題文の会話にある通り「⑥時期を決めて実施する」や「⑦開発プロセスを見直す」など、定期的な実施スケジュールやプロセス改善でカバーする方法が推奨されています。
A: 問題文の会話にある通り「⑥時期を決めて実施する」や「⑦開発プロセスを見直す」など、定期的な実施スケジュールやプロセス改善でカバーする方法が推奨されています。
関連キーワード: セッション管理、アクセス制御、脆弱性診断、ソースコードレビュー、セキュリティ要件レビュー
設問6:〔開発プロセスの見直し〕について(1)〜(4)に答えよ。
(2)本文中の下線⑥について、専門技術者による脆弱性診断が長期間行われないことを避けるためには、どのような時期に実施すればよいか。改良リリースの実施に影響を与えないことを前提に、20字以内で答えよ。
模範解答
改良フェーズにおける1か月の休止期間
解説
解答の論理構成
-
目的の整理
Rさんは「“専門技術者による脆弱性診断”が長期間行われないことを避ける」よう求めています。さらに「改良リリースの実施に影響を与えない」ことが条件です。 -
B社のスケジュール上の余裕を確認
図7の注記2には、 「改良フェーズにおいて、半年に1回、1か月の休止期間を設けている。」
とあります。この期間は開発部のメンバが「長期休暇の取得、長期研修の受講、Webサイトの点検など」を行うと説明されており、通常の実装・テストは停止しています。 -
条件への適合
・休止期間はリリースを伴わないため「改良リリースの実施に影響を与えない」。
・半年ごとに必ず到来するので「長期間行われないことを避ける」ための定期実施時期に最適です。 -
結論
よって⑥の実施時期は「改良フェーズにおける1か月の休止期間」となります。
誤りやすいポイント
- 「大規模な改修で改良リリース間隔を1か月とすることがある」を選ぶと、実装が走る可能性があり診断実施で開発が止まるリスクがあります。
- 新規リリース直後を想定すると、次の改良サイクルがすぐ始まるため同じく影響が出ます。
- “半年に1回”の意味を取り違え、「毎月どこかで調整する」など頻度を誤認すると条件不一致になります。
FAQ
Q: なぜ休止期間中ならリリースに影響しないのですか?
A: 図7注記2が示すとおり、この1か月は実装・テストが行われず、主業務が停止しているため追加の診断作業を差し込んでもリリース予定を遅延させません。
A: 図7注記2が示すとおり、この1か月は実装・テストが行われず、主業務が停止しているため追加の診断作業を差し込んでもリリース予定を遅延させません。
Q: 半年ごとで十分ですか?
A: Rさんの意図は「長期間行われないことを避ける」ことであり、半年以内に1回行われれば基準を満たします。必要に応じて大規模改修時にも追加で実施する運用も検討できます。
A: Rさんの意図は「長期間行われないことを避ける」ことであり、半年以内に1回行われれば基準を満たします。必要に応じて大規模改修時にも追加で実施する運用も検討できます。
Q: 休止期間が短縮された場合はどう対応しますか?
A: 開発計画変更に合わせ、休止期間確定後に診断日程を前倒しまたは次周期に繰り越すなど、プロジェクト計画側で調整し、必ず半年以内の実施を維持します。
A: 開発計画変更に合わせ、休止期間確定後に診断日程を前倒しまたは次周期に繰り越すなど、プロジェクト計画側で調整し、必ず半年以内の実施を維持します。
関連キーワード: 脆弱性診断、アジャイル開発、リリース管理、セキュリティプロセス
設問6:〔開発プロセスの見直し〕について(1)〜(4)に答えよ。
(3)本文中の下線⑦について、専門技術者による脆弱性診断が長期間行われないことを避けるためには、開発プロセスをどのように見直せばよいか。アジャイル開発の継続を前提に、40字以内で述べよ。
模範解答
「専門技術者による脆弱性診断が必要なときは、改良リリースを次回に持ち越す。」
または
「半年に一度、改良リリースの期間を長くする。」
または
「定期的に、期間の長い改良リリースを設ける。」
解説
解答の論理構成
-
現状の課題
- 開発部は「改良リリースの周期は2週間程度」です。【問題文】
- しかし「専門技術者による脆弱性診断には、その周期の大半を費やしてしまう」ため毎回は実施できません。【問題文】
-
専門技術者診断の重要性
- 「ソースコードレビューやツールによる脆弱性診断では発見できないが、専門技術者による脆弱性診断では発見できる脆弱性が多くあります。」【問題文】
- 従って “省略” は不可であり、実施間隔を空け過ぎない仕組みが必要です。
-
Rさんの提案
- 「専門技術者による脆弱性診断を改良リリースにおいて毎回実施できない場合でも、当該診断が長期間行われないことを避けるために、⑥時期を決めて実施することや、⑦開発プロセスを見直すことを検討してみてください。」【問題文】
- ここで問われるのが “開発プロセスの見直し” です。
-
解答の帰結
- アジャイルを続けつつ診断の時間を確保するには、短いサイクルを維持しつつ「定期的に期間の長いイテレーション(改良リリース)を挿入する」か「診断が必要なときはリリースを次回へ持ち越す」仕組みが合理的です。
- これにより “長期間行われない” 状態を防ぎつつ、アジャイル開発の継続も両立できます。
誤りやすいポイント
- 「毎回実施できない → 不要」と誤解し、診断自体を削減する回答を書いてしまう。
- “時期を決めて実施” の指示を見落とし、単に「頻度を上げる」と述べるだけになる。
- 2週間サイクルを固定と考え、柔軟なスプリント長変更というアジャイルの特徴を活かせていない記述にする。
FAQ
Q: 毎回診断できないならツール診断のみで代替できませんか?
A: 「専門技術者による脆弱性診断では発見できる脆弱性が多くあります。」【問題文】とあるため代替は不可です。
A: 「専門技術者による脆弱性診断では発見できる脆弱性が多くあります。」【問題文】とあるため代替は不可です。
Q: 休止期間(半年に1回の1か月)を利用する案でも良いですか?
A: はい。既存の「半年に1回、1か月の休止期間」【図7注記2】を専門技術者診断に充てるのも有効です。
A: はい。既存の「半年に1回、1か月の休止期間」【図7注記2】を専門技術者診断に充てるのも有効です。
Q: イテレーションを長くするとアジャイルではないのでは?
A: アジャイルは“柔軟な計画変更”が特徴であり、目的達成のためにスプリント長を調整すること自体はアジャイルの範囲内です。
A: アジャイルは“柔軟な計画変更”が特徴であり、目的達成のためにスプリント長を調整すること自体はアジャイルの範囲内です。
関連キーワード: アジャイル開発、脆弱性診断、スプリント計画、リリース管理、セキュア開発
設問6:〔開発プロセスの見直し〕について(1)〜(4)に答えよ。
(4)本文中の下線⑧について、CSRF脆弱性の場合では、どのような処理を行う機能が考えられるか。その処理を、55字以内で具体的に述べよ。
模範解答
CSRF対策用トークンの発行、HTMLへの埋め込み、必要なひも付け、及びこれを検証する処理
解説
解答の論理構成
- 本文では、Rさんがアジャイル開発に合った対策として「⑧脆弱性対策が組み込まれていて、それがデフォルトで有効になっているものもある」と発言しています。ここで言う「脆弱性対策」は、対象箇所の前段で指摘された CSRF 脆弱性を含む各種脆弱性を自動で防ぐ仕組みを指します。
- CSRF 脆弱性については、診断結果から「csrftoken とa又はbとをひも付けるという対策ができていない」ことが判明しており、トークンの管理・検証処理の欠落が根本原因であると読み取れます。
- 一般的なフレームワークが提供する CSRF 防御機能は、
• サーバ側で推測困難なトークンを生成しセッションなどと関連付ける
• 生成したトークンを HTML フォームや AJAX リクエストに自動埋め込みする
• 受信時にトークンを検証し、一致しないリクエストを拒否する
という一連の処理を内包します。 - したがって、⑧に対応する CSRF 向け具体処理は「CSRF対策用トークンの発行、HTMLへの埋め込み、必要なひも付け、及びこれを検証する処理」となります。
誤りやすいポイント
- 「トークンを付与するだけ」と書き、ひも付けや検証工程を漏らす。
- CSRF と XSS を混同し、「入力値エスケープ」など別脆弱性の対策を挙げる。
- SameSite 属性の設定を主眼にしてしまい、問題が求めるフレームワーク内蔵処理を外す。
FAQ
Q: トークン発行はセッションと必ず結び付ける必要がありますか?
A: はい。本文には「csrftoken とa又はbとをひも付ける」対策が欠如とあり、セッションやユーザ/リクエストごとに一意に結合することが重要です。
A: はい。本文には「csrftoken とa又はbとをひも付ける」対策が欠如とあり、セッションやユーザ/リクエストごとに一意に結合することが重要です。
Q: SameSite 属性を設定するだけで十分ではないのですか?
A: SameSite も有効な補助策ですが、本問はフレームワークが自動で行う CSRF 基本対策(トークン生成・検証)の有無を問うています。
A: SameSite も有効な補助策ですが、本問はフレームワークが自動で行う CSRF 基本対策(トークン生成・検証)の有無を問うています。
Q: AJAX リクエストにも同じトークンを使えますか?
A: 使えます。多くのフレームワークは HTTP ヘッダやカスタムパラメータでトークンを送信し、サーバ側で同様に検証します。
A: 使えます。多くのフレームワークは HTTP ヘッダやカスタムパラメータでトークンを送信し、サーバ側で同様に検証します。
関連キーワード: CSRF, トークン、フレームワーク、セッション、検証


