※解答はIPAのサイトを引用しておりますが、解説は独自ですので参考程度にご覧ください
(1) 表1中の下線①について適切な文字列の例を記号で答えよ
答: ア.%0D%0A
改行コードを意味する文字列は「%0D%0A」です。%0DはCR(Carriage Return)という行末から行頭に戻す復帰コード、%0AはLF(Line Feed)という改行を意味するコードです。この2つを順につなぎ合わせたコードをCRLFといい、テキスト中に”行頭に戻して改行”をするというコードになります。
このコードを対処せずに入力をさせてしまうと「%0D%0A」以降の文字列が次の要素として扱われてしまい、HTTPレスポンスにHTTPヘッダを挿入され攻撃をされてしまいます。
イの「%20」はスペースを表す文字コード、ウの<br>はHTTPではなくHTML文書内で使用可能な改行を表すタグ。エの<P>も同じくHTML文書で使用可能な要素で、段落を意味するタグです。
(2) 表1中の下線②の名称を答えよ
答: プレースフォルダ
SQLインジェクションとは、WEBアプリケーションにとって想定外のSQL文を実行させてデータベースを不正に操作する攻撃方法です。
例えばWEBアプリケーション内に次のようなSQL文を実行する処理があるとします。
SELECT 情報番号,情報名 FROM 情報管理テーブル WHERE プロジェクトID = ‘$ID’
このSQL文はWEB画面からの入力値が’$ID’部分に代入されてSQLが実行するような処理となるため、IDとして扱う入力値を受け取った場合は、そのIDのプロジェクト情報が結果として得られますが、もし入力値が or ‘1’=’1’という文字列の場合、SELECT 情報番号,情報名 FROM 情報管理テーブル WHERE プロジェクトID = ” or ‘1’=’1′ となり、WHERE句の記述条件が無視され情報管理テーブルの全ての内容が抽出されてしまいます。
このようにSQLで意味を持つような文字列を入力をすることでデータベースへ問合せを行うSQL文が意図しない挙動を起こし攻撃が成立します。
その対策として図2の7行目のようにSQL文の中で変数の場所を示す部分に記号の「?」を使い、”SELECT 情報番号,情報名 FROM 情報管理テーブル WHERE プロジェクトID = ?”とします。
この「?」部分にはプログラムコードで値をセットしますので、もしSQLで特別な意味を持つような文字列の入力があった場合は除去や無効化などの対処し不正操作を防ぐことが可能となります。このような方法を「プレースホルダ」と呼びます。
(3) [a]に入れる字句を答えよ
答: 改行コード
メールヘッダは次のような形式で項目名:(コロン)項目値で記述され、項目ごとに改行が入ります。
From: “試験 太郎”
To: “情報 花子”
Subject: これが件名です
Date: Wed, 30 Mar 2022 19:41:22 +0900
Message-ID: <123456aaaaaa$bbbbbbbb$cccccccc@dxnote.co.jp>
MIME-Version: 1.0
例えば利用者が画面の件名(Subject)に%0D%0A0aBcc%3a%20dummy@dxnote.co.jpのような入力を行うと、次のように意図しないBCCの宛先を追加できることになります。
※%0D%0Aは改行コード、%3Aはコロン、%20はスペースを表す特殊記号です。
==============================================
From: “試験 太郎”
To: “情報 花子”
Subject: これが件名です
Bcc: ” ”
Date: Wed, 30 Mar 2022 19:41:22 +0900
Message-ID: <123456aaaaaa$bbbbbbbb$cccccccc@dxnote.co.jp>
MIME-Version: 1.0
===============================================
この対策として値に改行コードを表す%0D%0Aを削除することで、項目追加を防ぐことができます。
よって[a]には改行コードが入ります。
(1) 下線③について未参加のプロジェクトに参加しているかのように偽るための操作を具体的に述べよ
答: クエリ文字列のidに未参加のプロジェクトのプロジェクトIDを指定する
4ページの方法1にて「ログイン時にその利用者IDに対して登録されているプロジェクトIDを取得し、GETリクエストの文字列に”id=プロジェクトID”の形式で指定する。情報選択機能は、クエリ文字列からプロジェクトIDを取得する」と記載があります。このことから表示するプロジェクトのリストはクエリ文字列のidで判断しているため、クエリ文字列のidに未参加のプロジェクトのプロジェクトIDを指定することで、プロジェクトIDに自由な値を設定できますので未参加のプロジェクトに参加しているかのように偽ることが可能となってしまいます。
(2) 下線④について方法1の脆弱性が方法2で解決されるのはなぜか。
答: 他者になりすますことが困難なセッション情報から利用者情報を取得し、それに紐付くプロジェクトIDを表示するため
下線④では情報選択機能利用時にセッション情報から利用者情報を取得すると記載してあります。表2の注記に記載がありますが、セッションIDはWEBブラウザ側が発行するcookieに格納されている情報で、利用者ごとに一意の文字列になります。ユーザーとのやり取りは、このセッションIDを使用し、受け取ったセッションIDからWEBブラウザ側で利用者情報を照合し、照合できた利用者の参加プロジェクトを表示するようにすれば、なりすましたり他のプロジェクト情報を表示されることが不可能になります。 セッションIDを書き換えることも可能ですが、”予測困難な”とありますので他者のセッションIDを予測して偽ることができません。
(3) [b]に入れる適切な字句を解答群の中から記号で答えよ
答: [b] ウ.PreparedStatement
SQLの実行パラメータとして後から指定する部分には、実際の値を記述する替わりに「?」を記述したSQL文を作成し、そのSQLを元にプリペアドステートメントを作成します
java.sql.Connection…データベースとの接続を管理するパッケージです。
java.sql.DriverManager…データベースとの接続の確立に必要なパッケージです。
図3の6行目のようにgetConnectionメソッドでデータベースに接続し、java.sql.Connectionのオブジェクトの変数conに代入しています。
getConnectionメソッドで引数(省略)と記載されていますが、指定されたデータベースのURL、ユーザーID、パスワードの引数を渡します。
残りの選択肢のjava.sql.PreparedStatementとjava.sql.StatementはどちらもSQL問合せを実行したり結果を取得するオブジェクトになりますが、Statementは静的なSQLのみ扱うことができ、PreparedStatementはプレースホルダを使った動的SQLも扱うことができるという違いがあります。よって解答はウ.PreparedStatementになります。
(4) [c]に入れる適切な字句を答えよ
答: [c]stmt
setIntはPreparedStatementオブジェクトが持つメソッドの1つです。図2の8行目でPreparedStatement stmt と宣言しているため、解答はstmtになります。
ちなみにsetInt(1,projectID)の意味は、PreparedStatementにセットされているSQL文中に記述された”1”番目の「?」に”projectID”をint型として代入するという処理になります。もしSQL内に「?」が複数存在する場合はこのようにsetIntメソッドでは1番目の引数には先頭から数えた「?」の番号を指定し、2番目の引数に設定したい値を渡します。
(1) [d]に入れる適切な字句を図1の属性名を含めて答えよ
答: [d]情報番号=? AND プロジェクトID=?
FROM句で情報管理テーブルが指定されているためWHERE句には情報管理テーブルの属性が使われます。 4ページの最後の行に「当該利用者情報からプロジェクトIDを取得する」とあるように、WHERE句はプロジェクトIDを指定する条件になります。図3の7行目でint projectIDと記述されており、ここで当該利用者情報のプロジェクトIDを取得しています。また、図1より情報管理テーブルは主キーが情報番号となっており、一意に特定するためには情報番号も指定する必要があります。よってWHERE句ではプレースフォルダを利用して情報番号とプロジェクトIDを指定する記述をすればよいことになります。よって解答は情報番号=? AND プロジェクトID=?になります。
(1) 本文中の[a]、[b]に入れる適切な字句を答えよ
答: [a]ア.A
[b]エ.TTL
[a]にはア.Aが入ります。DNSで定義されるAレコードとは特定のホスト名に対応するIPアドレス(IPv4アドレス)を定義するレコードのことです。
※ちなみにIPv6アドレスの場合、AAAAレコードになります。
[b]にはエ.TTLが入ります。TTLとはリソースレコードをキャッシュに保持する時間設定です。設定値は単位は秒になります。
TTLを0秒に設定した場合、キャッシュしないことを意味します。
次のようなレコードの場合
nas-a 300 IN A 142.250.111.200
「300」の部分がTTLになり、300秒間キャッシュを保持する設定になります。
この秒数を長くした場合はキャッシュを保持する時間が増え、その間にキャッシュされている内容であれば再度問合せしなくて済むので時間が短縮されるメリットがあります。
しかし、もしレコード情報が変更になった場合にはTTLで設定した秒数の間は更新されないため変更に時間がかかってしまいます。
(2) 表2中の下線①についてWAN側でUPnP機能を有効にできる仕様とした場合、ルータAが操作されることによってどのようなセキュリティ問題が発生するか。発生する問題を述べよ
答: 外部から社内のネットワークに侵入することが可能となってしまう問題
UPnP機能とは、ネットワーク上の機器や端末がポートを開閉しお互いに自動的に接続できるようにする機能です。UPnP機能をWAN側の有効にした場合、外部の機器からルータAの設定を書き換える操作が可能となってしまい、外部から攻撃者が社内ネットワークに侵入することが可能となってしまう問題が発生します。
(3) 下線②のように判断した理由を述べよ
答: PCから通常アクセスすることはできないNAS-Aの/rootディレクトリ配下のファイルが暗号化されていたため
8ページの文頭に”・ファイル共有機能でもweb操作機能でもアクセスできない/rootディレクトリ配下のファイルも暗号化されていた。”とあります。もしもPCがマルウエアに感染し、ネットワーク内の機器へ感染を拡大される場合には/rootディレクトリ配下のファイルへのアクセス権限がないため暗号化できないと考えられます。よって解答はPCから通常アクセスすることはできないNAS-Aの/rootディレクトリ配下のファイルが暗号化されていたためとなります。
(1) 図2中の[c]に入れる字句を答えよ
答: [c]ディレクトリトラバーサル
[c]には60が入ります。”..%2f”の%2fは/(スラッシュ)を意味する文字コードになります。つまり”../”と解釈でき、これはカレントディレクトリの1つ上の階層のディレクトリを指します。このようにすることでhttp://192.168.0.1/images/../status.cgiとなり、http://192.168.0.1/status.cgi と解釈されます。除外リストに指定されている/css、/images、/jsの階層下ではなくなるためstatus.cgiに認証なしでアクセスができてしまいます。このように攻撃者がコードによる不正にディレクトリ操作を行い任意のファイルを指定して意図しない処理をさせる攻撃をディレクトリトラバーサル攻撃と呼びます。
(2) 図2中の[d]に入れる字句を答えよ
答: [d]OSコマンドインジェクション
[d]には「OSコマンドインジェクション」が入ります。OSコマンドインジェクションとは、不正なコマンドを渡すことでWEBサーバのOSコマンドを不正に実行する攻撃です。これにより、サーバー内ファイルの改ざん、削除、流出などの被害を受ける恐れがあります。
(3) [e]~[g]に入れる字句を記号で答えよ
答: [e]ア.URLデコード [f]ウ.パスの正規化 [g]イ.除外リストとの比較
設問2(1)の解答となっているディレクトリトラバーサル攻撃の脆弱性について対策になります。
まずは、解答の意味について説明します。
ア.URLデコード は、指定されたURLに含まれているエンコードされた文字列を元の文字に変換する処理のことです。
例えば「%2f」はデコードすると/(スラッシュ)になります。
イ.除外リストとの比較は、P10の図2に記載されている通り製品Xで設定されているリストのことで、リストにはディレクトリ/css、/images、/jsが指定されています。これらの配下ではないディレクトリには認証なしでアクセスできないようになります。
ウ.パスの正規化とは、規定のルールに従いパス名を変換する処理のことです。
変換前と変換後で実際に指定されているパスの意味が変わらないようになっており、
例えばhttp://192.168.0.1/images/../status.cgiの場合、パス名中に/../ を含まない形式で同じ意味を持つパスであるhttp://192.168.0.1/status.cgiに変換します。このような置き換えの処理を正規化といいます。
問ではディレクトリトラバーサルと疑われる”http://192.168.0.1/images/..%2fstatus.cgi”へ認証なしでアクセスさせないことが目的となるため、まず「URLデコード」で文字列中の%2fを/(スラッシュ)に変換し”http://192.168.0.1/images/../status.cgi”とし、続いて「パスの正規化」で「http://192.168.0.1/status.cgi」に変換させます。
このような形にすると最「除外リストとの比較」の比較で、ディレクトリ/css、/images、/js 以外のディレクトリという判断がされ、認証なしでアクセスできない、つまりディレクトリトラバーサル攻撃の対策になります。
これらの順番を誤ると「除外リストとの比較」がうまく機能せず問題文のように脆弱性となってしまいます。
よって解答は[e]ア.URLデコード [f]ウ.パスの正規化 [g]イ.除外リストとの比較 となります。
(1) 下線③について実行されたOSコマンドの内容がわからなかった理由を答えよ
答: POSTによる送信データはボディ部に含まれるため、NAS-Aのアクセスログに記録されないから
HTTPリクエストは、大きく分けるとHTTPリクエスト行、ヘッダー行、ボディ部の3つに分けられます。 表3の内容のようにWebShellに記録されるHTTPアクセスログは「HTTPリクエスト行」しか記録されません。 もしGETメソッド通信でOSコマンドを実行する場合には、HTTPリクエスト行のURLの後ろにパラメータとしてOSコマンドの内容が付与されるためアクセスログで確認が可能です。 一方でPOSTメソッドによる通信では、URLの情報以外はボディ部に定義されますので、OSコマンドの内容がアクセスログに記録されません。よって解答は「POSTによる送信データはボディ部に含まれるため、NAS-Aのアクセスログに記録されないから」となります。
(2) 下線④について対策を具体的に述べよ
答: 管理者権限以外の最小限の権限で稼働させる
製品Xを必要最低限の権限で稼働するようにすれば、「tarコマンドを使ったアクセス権限の変更」ができなくなります。そのほかにも「iptablesコマンドを使ったFWルールの変更」、「curlコマンドでのダウンロード実行」、「rmコマンドでのログファイルの削除」などのようなコマンドの悪用を防ぐことが可能となります。
答: [h] noindex
解答はnoindexになります。noindex は、メタタグの一つでサイト内のあるページを検索エンジンにインデックスさせない(検索順位を下げてページにヒットしにくくする)ために使います。不特定多数のユーザーが検索エンジンでサイトを見つけて、不正な行為を行われることを防ぐ効果があります。
実際の設定は<meta name=”robots” content=”noindex”> となります。
答: [a]イ.アカウント作成
[b]ア.Qサービスへのログイン
[a]にはアカウント作成が入ります。表1のアカウント作成の説明で”Qサービスのアカウント情報として、利用者IDとパスワード、氏名、生年月日、携帯電話番号を登録する”と記載があります。アカウント作成時に氏名、生年月日、携帯電話番号に存在しない虚偽の入力を行われるとサービスが不正利用されるため、このタイミングで登録時の個人情報が正しいことを証明/確認するという目的で「身元確認」を行う必要があります。
[b]にはQサービスへのログインが入ります。15ページ[本人確認]の「当人認証」の説明の中で”認証の3要素のいずれかの照合でその人が作業していることを示すこと”と記載があります。作業というのはQサービスを利用する作業のことを指しますので、ログイン時に他人のID情報など虚偽の入力を行い他人のアカウントになりすまして不正利用されないため、このタイミングでログイン作業を行っているのが本人で間違いないかを確認するという目的で「ア.Qサービスへのログイン」時に「当人認証」を行う必要があります。
(1) 下線①について攻撃者はどのようにして他人の銀行口座とひも付けを成功させるか。その方法を二つ挙げそれぞれ述べよ
答: ・不正に取得した他人の口座番号と4桁の暗証番号を入力する
・ありがちな4桁の暗証番号を入力し、口座番号を変えながら試行する
表1の(2)にて口座番号と4桁のキャッシュカードの暗証番号を入力するとあり、キャッシュカードや通帳を持っている必要がないので、他人の口座番号と暗証番号さえ知っていれば不正に他人の銀行口座とひも付けを成功できてしまいます。
「不正に取得した他人の口座番号と4桁の暗証番号を入力する」になります。
また、「ありがちな4桁の暗証番号を入力し、口座番号を変えながら試行する」ことでも自力でひも付けを成功できてしまいます。
(2) [c]に入れる適切な字句を述べよ
答: [c] 顔写真
本人確認書類では顔写真が必要です。
(3) [d]、[e]に入れる適切な字句を記号で答えよ
答: [d] ウ.秘密鍵
[e] イ.公開鍵
署名を付与するのは秘密鍵になります。電子署名を検証するのは公開鍵になります。鍵の仕組みとしては、利用者本人しか知り得ないのが秘密鍵で、その秘密鍵に紐付く鍵が公開鍵になります。
(4) [f]に入れる適切な字句を述べよ
答: [f] 署名用電子証明書の有効性
署名用電子証明書の有効期限が切れていないか、失効していないかの有効性を確認する必要があります。
(5) [g]に入れる適切な設定内容を答えよ
答: [g] 表示されたランダムな数値と本人であることを証明する顔写真データ
表2の項番1では、顔写真付き本人確認書類の画像と容貌の画像で本人確認をする方法です。
わかりやすい例で言えば免許証やパスポートとカメラで撮影した顔写真を送り、書類に写っている写真と撮影された写真データが同じ人物かどうかで本人であることを確認します。
事前に準備した他人の本人確認書類の画像と他人の顔写真を送ると証明ができてしまうため、「表示されたランダムな数値を入力し、アプリの機能で顔写真を直接撮影して」、その本人であることを照合します。
(1) 下線②について、スマートフォンの画面ロックを設定していないとどのような場合に不正利用が行われるか
答: 盗難または紛失した場合
スマートフォンを盗難または紛失した場合、画面ロックがされていなければそのまま利用されてしまいます。
(2) 下線③について、どのような機能が考えられるか
答: 重要な操作の前にスマートフォンによる生体認証を行う機能
重要な操作の前に生体認証(指紋や虹彩での認証など)で更に本人である可能性を高めます。