※解答はIPAのサイトを引用しておりますが、解説は独自ですので参考程度にご覧ください
(1) 表2中の下線①について別の方法を答えよ
答: 資産管理システムへのWEBサイトの概要、システム構成をもとに洗い出す
表2の内容より、診断対象であるURLはWEBサイトの全てのURLであることがわかります。
これ手動で調べる方法について、2ページに”WEBサイト立ち上げ時は資産管理システムへのWEBサイトの概要、システム構成”を登録申請しているので、この情報から全てのページ一覧を洗い出すことができます。
よって解答は「資産管理システムへのWEBサイトの概要、システム構成をもとに洗い出す」となります。
(1) 表3及び本文中の[a]、[b]に入れる字句を記号で答えよ
答: [a]にイ.’ and ‘a’ = ‘a、[b] ウ.’ and ‘a’ = ‘b
SQLインジェクションとは、WEBアプリケーションにとって想定外のSQL文を実行させてデータベースを不正に操作する攻撃方法です。
例えばWEBアプリケーション内に次のようなSQL文を実行する処理があるとします。
SELECT topic_id,topic_name FROM topic_table WHERE keyword = ‘$VALUE’
このSQL文はトピック検索画面からの入力値が’$VALUE’部分に代入されてSQLが実行するような処理となるため、VALUEとして扱う入力値を受け取った場合は、そのVALUEのトピックが結果として得られます。
表3の1行目と2行目から、もし入力値がkeyword = manualの場合、WHERE keyword = ‘manual’ となり結果件数は10件、keyword = manual’とした場合、WHERE keyword = ‘manual”となり「manual’」というkeywordは存在しないため結果件数は0件になることがわかります。
[a]、[b]の選択肢について考えます。
ア…”の場合、WHERE keyword = ‘manual”’となり、「manual”」はkeywordとして存在しないため結果件数は0件になります。
イ…’ and ‘a’ = ‘aの場合、WHERE keyword = ‘manual’ and ‘a’ = ‘a’となり、keywordが「manual」かつ’a’ = ‘a'(成立)のため、keywordがmanualの10件が抽出されます。
ウ…’ and ‘a’ = ‘bの場合、WHERE keyword = ‘manual’ and ‘a’ = ‘b’となり、keywordが「manual」かつ’a’ = ‘b'(確実に不成立)のため、0件が抽出されます。
エ…and 1=0”の場合、WHERE keyword = ‘manual and 1=0’となり、「manual and 1=0」はkeywordとして存在しないため結果件数は0件になります。
オ…and 1=1”の場合、WHERE keyword = ‘manual and 1=1’となり、「manual and 1=1」はkeywordとして存在しないため結果件数は0件になります。
このことからイ、ウの場合、条件としてSQLが解釈してしまい結果を抽出してしまっていることが分かり、SQLで意味を持つような文字列を入力をすることでデータベースへ問合せを行うSQL文が意図しない挙動を起こし攻撃が成立します。
よって解答は[a]にイ.「’ and ‘a’ = ‘a」、[b]にウ.「’ and ‘a’ = ‘b」が入ります。
その対策として図2の7行目のようにSQL文の中で変数の場所を示す部分に記号の「?」を使い、”SELECT 情報番号,情報名 FROM 情報管理テーブル WHERE keywordkeyword = ?”とします。
この?部分にはプログラムコードで値をセットしますので、もしSQLで特別な意味を持つような文字列の入力があった場合は除去や無効化などの対処し不正操作を防ぐことが可能となります。このような方法をプレースホルダと呼びます。
(2) 本文中の[c]に入れる適切な機能を図1中の(1-1)~(1-8)から選び答えよ
答: [c]2-3
XSS(クロスサイトスクリプティング)とは利用者からの入力内容やHTTPヘッダの情報を処理し、Webページとして出力する処理に問題がある場合、攻撃者がその問題を利用してスクリプト等を埋め込み、不正な動作をさせる攻撃です。
XSS対策として、特殊文字をサニタイジング(無効化)する、記号文字(「<」「>」「&」「”」「’」等)をHTMLエンティティに置換(エスケープ)する、URL出力は「http://」や「https://」形式のみ許可することが挙げられます。
設問についてですが、7ページの上段のY氏の発言に”入力したスクリプトが二つ先の画面でエスケープ処理されずに”とあるとおり、URLによってXSS対策できていた画面とそうでない画面があったことがわかります。
そこでVツールの機能のうち、図1の(2-3)の”診断対象のURLの応答だけでなく、別のURLの応答も判定対象に”できる機能を使うことで、本来の診断対象のURL以外も対象に含めることができます。
よって解答は「2-3」になります。
答: アンケート入力1のURLの拡張機能設定画面を開き、拡張設定に、アンケート確認のURLを登録する
図1の(2-3)のVツールの具体的な設定についてですが、(2-3)の文中にあるように”本機能を設定するには診断対象URLの拡張機能設定画面を開き、拡張設定に、判定対象を含めるURLを登録する”とあります。今回脆弱性があったのは”アンケート入力1”から二つ先の遷移先である”アンケート確認”となるので、先ほどの設定内容の文章にこれを当てはめたものが解答になります。
よって解答は「アンケート入力1のURLの拡張機能設定画面を開き、拡張設定に、アンケート確認のURLを登録する」となります。
答: トピック検索結果が最低でも1件は存在する値にする
表3より、Zさんの送ったパラメータはキーワードがxyzとなり、この検証ではトピック検索結果がそもそも無くて0件なのか、SQLインジェクションの影響を受けて0件になったのかが判断できません。
そこでkeywordの初期値にmaualなどを指定して「トピック検索結果が最低でも1件は存在する値にする」必要があります。よって解答は「トピック検索結果が最低でも1件は存在する値にする」になります。
(1) 下線④について、URLが登録されなかった画面名を解答群の中から全て選び答えよ
答: ウ.検索結果 と エ.新規会員情報入力
自動登録機能では図1の(2-1)にあるように指定されたURLの画面に含まれるリンク、フォームの送信先をたどっていきます。
下線④の文中で”URLに図4のトップページを指定”とありますが、図4の「新規会員情報入力」はトップページから遷移できないので「新規会員情報入力」はURLが自動登録されません。
また、5ページの表2の自動登録機能の文中に遷移先のURLがJavaScriptなどで自動生成される場合は登録が漏れる場合がある、と記載されています。
図4の注記4でよくある質問検索の画面で検索する際に、次の画面に遷移するURLがJavaScriptで動的に生成されるとありますので「検索結果」もURLが自動登録されません。
よって解答は「新規会員情報入力」と「検索結果」になります。
(2) 下線④について、該当する画面遷移とエラーになってしまう理由を2組み挙げ、答えよ
答: 【画面遷移】(A) 【理由】パスワードを連続5回間違えるとアカウントをロックされるから 【画面遷移】(c) 【理由】1つのキャンペーンに対して会員Nは1回だけ申し込みできないから
同じ値の入力、登録を複数回行うとエラーとなる処理について考えます。
まず、図4の注1)で「パスワードを連続5回間違えるとアカウントをロックされる」とありますので”ログイン”から”ログイン後のトップページ”の遷移である(A)が1組目になります。
次に、図4の注記1で“1つのキャンペーンに対して会員Nは1回だけ申し込みできる”とありますので図4の”キャンペーン申込み”から”キャンペーン申込み完了”への遷移である(c)は複数回リクエストを送信するとエラーになるので2組目になります。
(1) 本文中の[d]に入れる字句を答えよ
答: JavaScriptでCookieにアクセスすること
HttpOnly属性とは、Cookieに付加できる属性の1つで、JavaScriptからCookieにアクセスできないようにすることができます。
これによりXSS攻撃を受けた際にCookieの内容を読み取られることを防ぐことができます。
(2) 下線⑥について攻撃の手口を答えよ
答: 正規のWebサイトにそっくりな偽の画面を用意して個人情報を入力させる
XSSの悪用例としてCookie情報を窃取する手口のほかに、フィッシングと呼ばれる正規の企業を装ったメールで攻撃者の用意した偽サイトのURLにユーザーを誘導し個人情報を入力させる手口や、正規のWebサイトにそっくりな偽の画面を用意して個人情報を入力させる手口があります。
今回はWebサイトを使った手口のため「正規のWebサイトにそっくりな偽の画面を用意して個人情報を入力させる」が解答になります。
(1) 下線⑦についてリクエストの内容を具体的に答えよ
答: group_codeを予測して別の値を設定する
7ページ下段で”会員Nは幾つかのグループに分けられており、申し込むことができるキャンペーンが会員の所属しているグループによって異なる”とあります。
また図4の注記3でログインすると”会員Nが所属しているグループを識別するためのgroup_codeというパラメータがリクエストに追加される”とあります。
上記2点より、下線⑦の文章の”会員Nが本来閲覧できないはずのキャンペーンへのリンクが表示”される現象を発生させるにはリクエストに「group_codeを予測して別の値を設定する」となります。
(2) [e]、[f]に入る適切なパラメータ名を図5中から選びそれぞれ答えよ
答: [e]JSESSIONID [f] group_code
[e]には「JSESSIONID」が入ります。図4の注2でログイン時にJSESSIONIDというセッションIDが発行されcookieに保持されるとあります。セッションIDは利用者個人を特定可能な一意となるIDになりますので、解答は「JSESSIONID」になります。
[f]には「group_code」が入ります。図4の注記3でログインすると”会員Nが所属しているグループを識別するためのgroup_codeというパラメータがリクエストに追加される”とあります。会員Nが所属しているグループが「group_code」の値と一致するかを検証すれば本来申し込みできないキャンペーンに不正に申し込むことができなくなります。よって解答は「group_code」になります。
(1) 診断開始までに要する時間の課題についてA社で取り入れている管理策を参考にした対策を具体的に答えよ
答: 資産管理システムへのWEBサイトの概要、システム構成を登録申請し、診断に必要な情報を一元管理する
8ページの中段で”サイトNについては診断に必要な情報が一元管理されていなかったので、回答までに1週間かかった。診断開始までに要する時間が課題として残った”とありますので、診断に必要な情報を一元管理することが対策となります。
また、A社で取り入れている管理策については、2ページの上段で”WEBサイト立ち上げ時は資産管理システムへのWEBサイトの概要、システム構成”を登録申請しているため、全てのページ一覧を把握し、一元管理できているため効率よく診断ができています。
上記のA社管理策も踏まえると解答は「資産管理システムへのWEBサイトの概要、システム構成を登録申請し、診断に必要な情報を一元管理する」となります。
(2) B社のサポート費用の課題についてB社に対して同じ問い合わせを行わず問い合わせ件数を削減するためにA社グループではどのような対策を実施すべきか
答: 開発者による個別の問合せをやめて問い合わせ内容をA社グループ内で共有する
10ページの中段で開発部Nは”B社へ頻繁に問い合わせること担った結果、B社のサポート費用が高額となった”とあります。
また、7ページ中段に”リスク及び対策について、開発者がB社へ直接問い合わせる”とあります。つまり、開発者がB社に対して直接の問合せをしないことと、同じ問い合わせを行わないようにするためにA社グループでは「過去の問い合わせ内容をA社グループ内で共有し、開発者がB社への直接問合せをやめる」対策を実施することが解答となります。
答: [a]○ [b]× [c]× [d]○ [e]○ [f]× [g]○ [h]○ [i]○
IaaSは、システムの構築に必要なハードウェアやネットワークの基盤を提供するサービスです。
「OS・ミドルウェア」、「アプリ」、「アプリに登録されたデータ」はW社側で管理する必要があります。
(例)Microsoft Azure
よって[a]に”○”、[d]に”○”、[g]に”○”が入ります。
PaaSは、OS・ミドルウェアなどのプラットフォームを提供するサービスで、アプリを実行するためのサーバやデータベースなどがあります。
IaaSに加え「OS・ミドルウェア」も提供されますので、「アプリ」、「アプリに登録されたデータ」をW社側で管理する必要があります。
(例)Amazon Web Services(AWS)
よって[b]に”×”、[e]に”○”、[h]に”○”が入ります。
SaaSは、アプリを提供するサービスで、具体的にはCRMやグループウェアなどがあります。
PaaSに加え「アプリ」も提供されますので、残る「アプリに登録されたデータ」だけW社側で管理する必要があります。
(例)Microsoft Office 365
よって[c]に”×”、[f]に”×”、[i]に”○”が入ります。
(1) 表7中の[j]~[l]に入る字句を記号で選び答えよ
答: [j] ウ.一般の閲覧権限 [k] エ.なし [l] イ.一般の権限、閲覧権限
[j]に入る仮想マシンサービスに付与すべき権限には「ウ.一般の閲覧権限」が入ります。14ページの中段で”移行後、表1の項番1~項番3の運用をD社に委託する”とあります。
また、表1の項番2で”サーバの一覧を参照する”とありますので、17ページ表6の仮想マシンサービスの欄で”一般の閲覧権限→仮想マシンの閲覧”とあるようにサーバの一覧を参照可能な「ウ.一般の閲覧権限」が必要となります。
[k]には「エ.なし」が入ります。
17ページ表6のDBサービスの欄で記載されている”一般の閲覧権限→スキーマ、テーブルの閲覧、閲覧権限→テーブルデータの閲覧、編集権限→テーブルの作成や削除”これらはすべてD社の作業範囲外となりますので「エ.なし」が解答となります。
[l]には「一般の権限、閲覧権限」が入ります。
モニタリングサービスでは表1の項番3で”性能指標を監視”とあります。
これを許可するためには現在の性能指標を監視し、過去の性能指標と比較も必要となるため、17ページ表6のモニタリングサービスの欄で”一般の閲覧権限→現在の性能指標を閲覧、閲覧権限→過去の性能指標の<値の閲覧、編集権限→監視する性能指標の追加”と記載されているので
「イ.一般の権限、閲覧権限」が必要となります。
(2) 下線①のイベント検知のルールをJSON形式で答えよ
答:
{
”system”: “4000”,
”account”: “[0-9][0-9][0-9][0-9]”,
”service”: “オブジェクトストレージサービス”,
”event”: “オブジェクトの削除”,
}
下線①の内容より”日記サービスのログを削除したときにそのイベントを検知してアラートをメールで通知するために検知するルール”とあります。
JSON形式とは {} の中にキーと値を1組としてコロンで区切って記述する形式のことで、図1よりイベント検知のルールは”system”、”account”、”service”、”event”の4つのキーと各値の組で構成されていることがわかります。
1つずつみていくと、まず”system”は表4よりシステムIDを指します。
図2より日記サービスのログはログ保管ストレージ内に保管されていることがわかり、ログ保管ストレージからそのログを削除したときの検知になるため、表5のシステムID「4000」(=ログ保管ストレージ)が”system”に設定する値になります。
また、同じく表5の”利用するL社のクラウドサービス”の欄よりログ保管のサービスは「オブジェクトストレージサービス」を利用していることもわかりますので、”service”には「オブジェクトストレージサービス」が入ります。
”event”は表4よりオブジェクトストレージサービスのイベント一覧のより「オブジェクトの削除」が入ります。
最後に、検知する利用者IDは表4より0000~9999の値とあり、注記に”[0-9]は0から9までの数字のいずれか1文字を表す”とあります。
そのため、0から9までの数字4桁の表現として「[0-9][0-9][0-9][0-9]」を入れます。
よって解答は下記のようになります。
{
”system”: “4000”,
”account”: “[0-9][0-9][0-9][0-9]”,
”service”: “オブジェクトストレージサービス”,
”event”: “オブジェクトの削除”,
}
(1) 本文中、図3中及び図4中の[m]~[o]に入れる適切な字句を”新日記サービス”又は”サービスT”から選び答えよ
答: [m]新日記サービス [n]サービスT [o]サービスT
利用者の端末(Webブラウザ)は、最初に「新日記サービス」の画面を表示する必要があるため「新日記サービス」のWebサーバに接続しサービスを要求します。
よって[m]は「新日記サービス」が入ります。
続いて、サービス要求を受けた「新日記サービス」のWebサーバは利用者端末(Webブラウザ)がSNSへの投稿を可能とするため「サービスT」の認可サーバへのアクセスの認可を要求します。
認証する側は「サービスT」になりますので、[n]はイ.「サービスT」になります。
「サービスT」による認証が成功した場合が「サービスT」が認可トークンを発行し、そのトークンを持つことで「サービスT」のリソースサーバへ利用者の端末はアクセスが可能となります。よって[o]は「サービスT」になります。
(2) 表8中の[p]、[q]に入れる適切な番号を図3の中から選び答えよ
答: [p] (3)[q] (7)
[p]は(3)認可要求が入ります。サービスTへ記事を投稿するために、利用者の端末(Webブラウザ)は新日記サービスのWebサーバへ(1)サービス要求を行います。
この時点では利用者の端末はサービスTに対してアクセス可能なトークンを持っていないため、(2)リダイレクトされて、認可サーバへ(3)認可要求を行いトークンを発行してもらう流れとなります。
このときの送信されるデータはGETメソッドを用いて、パラメータのredirect_uriに指定し、アクセストークンを発行してもらう形になります。
なお、redirect_uriは認可を受けたい元となるURI、つまり新日記サービスのWebサーバのURIが入ります。
※新日記サービスのWebサーバのURIを事前に登録済にしておく必要があります。よって[p]は(3)認可要求になります。
続いて[k]は(7)のアクセストークン要求が入ります。
(4)認可同意処理では、(3)認可要求で通知されたURIを用いたリダイレクトによってWebブラウザを経由して新日記サービスのWebサーバへ認可コードが通知されます。
そして新日記サービスのWebサーバは、POSTメソッドで認可コードとredirect_uriに指定し、サービスTの認可サーバに対してアクセストークンを要求します。
その後、サービスTの認可サーバはアクセスを許可するトークンを発行し(9)記事投稿が可能となります。
よって解答の[q]は(7)アクセストークン要求になります。
(3) 下線②についてCRYPTRECの電子政府推奨暗号リストでは利用していない暗号技術が含まれるTLS1.2の暗号スイートを解答群から全て選び答えよ
答: ウ、エ
CRYPTRECとは、電子政府推奨暗号の安全性を評価・監視し、暗号技術の適切な実装法・運用法を調査・検討するプロジェクトのことです。
CRYPTREC暗号リストとは、2003年に発表された「電子政府における調達のために参照すべき暗号のリスト(電子政府推奨暗号リスト)」を改定したものです。
推奨されているリストは各分野次のようになっています。
鍵交換アルゴリズム…RSA、DHE、ECDHE
共通鍵暗号方式…AES、Camellia、KCipher-2
暗号利用モード…CBC、CFB、CTR、OFB、CCM、GCM
ハッシュ関数…SHA-256、SHA-384、SHA-512
解答群のアは鍵交換はDHE-RSAで○、共通鍵暗号方式はAES128で○、暗号利用モードはGCMで○、ハッシュ関数はSHA-256で○
イは鍵交換はDHE-RSAで○、共通鍵暗号方式はAES256で○、暗号利用モードはCBCで○、ハッシュ関数はSHA-256で○
ウは鍵交換はRSAで○、共通鍵暗号方式は3DES EDEで×、暗号利用モードはCBCで○、ハッシュ関数はSHAで×
エは鍵交換はRSAで○、共通鍵暗号方式はRC4で×、ハッシュ関数はMD5で×
よって×が含まれているウ、エが推奨では無い暗号リストが含まれています。
※CRYPTREC暗号リストの詳細については電子政府における調達のために参照すべき暗号のリスト(令和3年4月1日最終更新)をご覧ください
(1) 下線③についてアクセストークンの取得に成功することが困難である理由を表8のパラメータを含めて具体的に答えよ
答: 異なる宛先に認可コードが通知されるため認可コードを入手できないから
アクセストークンを取得するリクエストを認可サーバへ送信したとしても、認可サーバが認可応答を行う宛先は、事前に登録済みのredirect_uriになります。
このURLの設定値は新日記サービスのWebサーバのURIになりますので、攻撃者に認可コードが通知されることは無くアクセストークンの取得に失敗します。
よって解答は「異なる宛先に認可コードが通知されるため認可コードを入手できないから」となります。
(2) 本文中の下線④について認可サーバがチャレンジコードと検証コードの関係を検証する方法を”ハッシュ値をbase64urlエンコードした値”という字句を含めて具体的に答えよ
答: 検証コードのハッシュ値をbase64urlエンコードした値をチャレンジコードの値と一致するか検証する
下線④にある2つのコードとはチャレンジコードと検証コードになります。
まず、チャレンジコードは、利用者の端末(Webブラウザ)が生成するランダムなコードのことです。
チャレンジコードを受け取った認可サーバはこのチャレンジコードを保管しておきます。
続いて、利用者の端末(Webブラウザ)は、このチャレンジコードをSHA256ハッシュ化したものをbase64URLエンコード化します。
この値はPKCEのキーとなる検証コード(code_verifier)と呼ばれる値になり、認可サーバにリクエストを送る値に付加して送信します。
認可サーバは、利用者から送られてきた検証コード(code_verifier)からSHA256ハッシュ化したものをbase64URLエンコード化します。
このとき得られた値と、保管しているチャレンジコードの値を比較し、一致すれば送信元のアクセストークンは正しく正当な利用者であることが検証できます。
よって解答は「検証コードからハッシュ値をbase64urlエンコードした値を算出し、チャレンジコードと一致していれば正当な利用者であることが検証できる」となります。
(1) 下線⑤について第三者がXトークンを取得するための操作を答えよ
答: OSSリポジトリ上の過去の履歴情報から取得した
リポジトリとは、バージョン管理システムのことで、ソースコードを過去の履歴や、変更前の情報、階層などを含め格納することが可能です。
22ページの中段に”OSSリポジトリ上にXトークンの情報が含まれるファイルがアップロードされていた”とあり、その後の文章で”ファイルを削除した”、”ファイルがアップロードされてから削除されるまでの間にダウンロードされていなかった”とありますが、第三者にXトークンを不正入手されたことから、OSSリポジトリ上の過去の履歴情報にはXトークンの情報が含まれるファイルが残ってしまっていたと考えられます。
よって解答は「OSSリポジトリ上の過去の履歴情報から取得した」となります。
(2) 下線⑥について権限管理の変更内容を答えよ
答: F社の開発者にソースコードのアップロード権限、X社CIにソースコードのダウンロード権限を付与する
20ページの表9の権限管理で”開発者、開発リーダーなど全ての利用者に対して設定できる権限全てを付与する”とあり、権限が適切でないことが問題となって不正アクセスされたため最小限の権限だけアクセス許可させるための内容に変更する必要があります。
表9のバージョン管理で開発者が”ソースコードをアップロード”する必要がある、また権限管理の内容より”ソースコードのダウンロード権限をX社CIに付与する必要がある”とありますので、解答は「F社の開発者にソースコードのアップロード権限、X社CIにソースコードのダウンロード権限を付与する」が解答となります。
(3) 下線⑦について見直し後の設定を答えよ
答: X社CIに発行するXトークンにはリポジトリWのソースコードのダウンロード権限だけを付与する
20ページの表9、”サービス連携でX社CIに発行するEトークンには、リポジトリWの全ての権限が付与されている”とあり、これにより第三者にXトークンを不正入手されたことから、Xトークンに対してリポジトリWのすべての権限ではなく、リポジトリWのソースコードのダウンロード権限だけを付与することでXトークンの不正ダウンロードを防ぐことができます。
よって解答は「X社CIに発行するXトークンにはリポジトリWのソースコードのダウンロード権限だけを付与する」となります。