開発部の D さんが,S システム改修の担当者に任命され,利用者のアクセス制御を次のように設計した。
プロジェクトを識別するプロジェクト ID を連番で採番する。
利用者 ID それぞれに対して,その利用者が参加するプロジェクトのプロジェクト ID を登録しておく。
S システムに格納される各情報に,作成者の参加するプロジェクトを示すプロジェクト ID をあらかじめ付与しておく。
プロジェクト ID を次に示す方法で取得し,そのプロジェクト ID を用いてアクセス制御する。
方法 1:ログイン時にその利用者 ID に対して登録されているプロジェクト ID を取得し,GET リクエストのクエリ文字列に,“id=プロジェクト ID”の形式で指定する。情報選択機能は,クエリ文字列からプロジェクト ID を取得する。
〔情報選択機能の脆弱性〕
S システム改修後の脆弱性検査で,情報セキュリティ部は,プロジェクトの情報番号と情報名を,そのプロジェクトには参加していない利用者が,③そのプロジェクトに参加しているかのように偽ってリスト可能であるという脆弱性を指摘した。これは,情報選択機能においてクエリ文字列で受け取ったプロジェクト ID をチェックせずに利用していることに起因していた。この指摘を受けて,D さんは,プロジェクト ID の取得方法として,次に示す別の方法を提示した。
方法 2:情報選択機能の利用時に,セッション情報から利用者情報を取得する。情報選択機能は,当該利用者情報からプロジェクト ID を取得する。
情報セキュリティ部は,④方法 1 の脆弱性が方法 2 で解決されることを確認した。D さんは,プロジェクト ID の取得方法を方法 2 に修正した。
方法 1:ログイン時にその利用者 ID に対して登録されているプロジェクト ID を取得し,GET リクエストのクエリ文字列に,“id=プロジェクト ID”の形式で指定する。
〔情報選択機能の脆弱性〕
情報選択機能においてクエリ文字列で受け取ったプロジェクト ID をチェックせずに利用していることに起因していた。
方法1では,ログイン後に取得したプロジェクト ID を,GET リクエストのクエリ文字列の“id=プロジェクト ID”として画面から情報選択機能に渡す。情報選択機能はこの値をチェックせずにそのまま使うので,利用者が自分でクエリ文字列の id の値を書き換えれば,書き換えた値のプロジェクトの情報を取得できる。これは,利用者が改変できる値を信頼してアクセス制御に使ったために起きる脆弱性である。
そこで,攻撃者は,クエリ文字列の id に,自分が参加していない(未参加の)プロジェクトのプロジェクト ID を指定して要求を送る。プロジェクト ID は連番で採番されているので,数を変えるだけで他のプロジェクトの ID を推測できる点も,この攻撃を容易にする。ブラウザのアドレス欄の編集でも,プロキシツールでの書換えでもできる。
方法 2:情報選択機能の利用時に,セッション情報から利用者情報を取得する。情報選択機能は,当該利用者情報からプロジェクト ID を取得する。
表2 注記
セッション ID は,ログイン時に発行される推測困難な値であり,secure 属性が付与された cookie に格納される。
方法1の脆弱性は,プロジェクト ID を利用者が書き換えられるクエリ文字列で受け取ることにあった。方法2では,情報選択機能がセッション情報から利用者情報を取得し,そこに登録されたプロジェクト ID を使う。セッション情報はサーバ側で管理され,利用者はセッション ID(推測困難な値)でそれを参照するだけなので,プロジェクト ID の値を書き換えることができない。
解答例は,二つの言い方のどちらでもよい。(1)プロジェクトを示すパラメタを外部から指定できないから,(2)セッション情報からプロジェクト ID を取得するから。どちらも,攻撃者が値を指定する余地がなくなったという同じ内容を,原因側と仕組み側から述べたものである。
30字以内なので,“プロジェクト ID を利用者が指定できなくなるから”のように,なぜ解決するか(利用者が値を指定できない)の理由を一つ入れる。“セッション管理をしているから”だけでは,何が解決の決め手かが不明確である。
c には変数名を答える。大文字小文字を含めて stmt と書く。b に入れた型名の PreparedStatement と取り違えない。
設問3解答欄1つ
図3中の d に入れる適切な字句を,図1中の属性名を含めて答えよ。
〔d〕解答例
情報番号 = ? AND プロジェクトID = ?
解説
本文の根拠
図3 3行目
int documentNo = Integer.parseInt(request.getParameter("no"));
図3 7〜8行目
int projectId = (省略); // 利用者の参加プロジェクトのプロジェクト ID を利用者テーブルから取得し,代入する処理
図1
情報管理テーブル(情報番号(主キー),プロジェクト ID(外部キー),情報名,情報内容,…)
図3 注記
注記 10 行目より後の(省略)に,projectId,documentNo を用いた処理はない。
情報表示機能は,3行目でクエリ文字列の no から documentNo(情報番号)を受け取り,7行目で利用者の参加プロジェクトの projectId をセッション情報から取得している。10行目より後には projectId と documentNo を使う処理が無いので,この2つの値は9行目と10行目の間の“SQL 文のひな型に変数を代入する処理”で SQL 文にバインドされる,つまり WHERE の条件に入る。
情報管理テーブルでは,情報番号が主キー,プロジェクト ID が外部キーである。情報番号だけを条件にすると,利用者が no の値を書き換えたとき,別のプロジェクトの情報も表示できてしまう。そこで,情報番号 = ? と同時に,利用者のプロジェクト ID と一致するという条件も付ける。したがって d は 情報番号 = ? AND プロジェクトID = ? となる。
Z 社は,Network Attached Storage(NAS)製品,ルータ製品などのネットワーク機器を開発,保守している従業員 200 名の会社であり,国内の中小企業の顧客を中心に事業を展開している。NAS 製品である製品 X は,ファイル共有の用途で利用され,ルータ製品である製品 Y は,インターネット接続の用途で利用されている。製品 X 及び製品 Y は,Linux をベースとした OS を搭載している。
Z 社では,インターネットドメイン名 z-sha.co.jp を取得している。製品 X の利用者は,インターネットから Web インタフェース経由で自身の製品 X にアクセスするに際して,Z 社が提供しているダイナミック DNS サービス(以下,DDNS-Z という)を利用することができる。
〔障害の発生〕
ある日,製品 X と製品 Y を利用している A 社から,Z 社の保守サポート窓口に障害の報告が入った。製品 X(以下,A 社に設置された製品 X を NAS-A という)上のファイルにおいて,ファイル名は表示されるがファイルを開くことができないとのことであった。
NAS-A は,DDNS-Z を使用して,https://nas-a.z-sha.co.jp/ の URL でアクセスできるようになっていた。ルータ-A のグローバル IP アドレスが変更された場合,Z 社の DNS サーバの設定でホスト名 nas-a に割り当てている IP アドレスを変更するために,a レコードを更新する。そのレコードの b は,300 秒に設定されていた。
A 社のネットワーク構成を図1に,NAS-A の設定内容を表1に,ルータ-A の設定内容を表2に示す。
図1 A 社のネットワーク構成(抜粋)表1 NAS-A の設定内容(抜粋)表2 ルータ-A の設定内容(抜粋)
K 氏が NAS-A を調査した結果,次のことが分かった。
デザインデータのファイルが暗号化され,ファイル名の拡張子が変更されていた。
A 社では身に覚えのない,英語で書かれた脅迫文のテキストファイルが,NAS-A に保存されていた。
ファイル共有機能でも Web 操作機能でもアクセスできない /root ディレクトリ配下のファイルも暗号化されていた。
K 氏は,今回の障害がランサムウェアに起因するものであり,さらに,②A 社の PC がランサムウェアに感染したのではなく,NAS-A 自体がランサムウェアに感染したことによって NAS-A のファイルが暗号化された可能性が高いと判断した。そこで,脆弱性,アクセスログ,DDNS-Z の三つの観点から更に調査を進めることにした。
〔脆弱性の調査〕
NAS-A における脆弱性修正プログラムの適用状況を確認したところ,数週間前にリリースされた製品 X の脆弱性修正プログラム(以下,パッチ M という)が未適用であった。パッチ M は,Web 管理機能に関する二つの脆弱性(以下,脆弱性 1 と脆弱性 2 という)について対策したものである。脆弱性 1 及び脆弱性 2 の概要を図2に示す。
図2 脆弱性 1 及び脆弱性 2 の概要図2 脆弱性 1 及び脆弱性 2 の概要(続き)
パッチ M では,脆弱性 1 の対策として,認証なしアクセスの処理の流れにパス名の正規化の処理を加え,さらに,図3に示す順序にした。パス名の正規化とは,相対パスで記述されたパス名を,相対パス記法を含まない形式に変換することである。
表3からは,GET メソッドを使用して実行された OS コマンドの内容は分かったが,③POST メソッドを使用して実行された OS コマンドの内容は分からなかった。WebShell が配置されたディレクトリは,書込み不可であるが,root アカウントを用いれば書込み可能に変更できる。製品 X では,sudo コマンドの設定ファイルが図4のようになっている。
図4 sudo コマンドの設定ファイル(抜粋)
tar コマンドは,標準の OS コマンドであり,複数のファイルを一つのアーカイブファイルにまとめたり,アーカイブファイルを展開したりできる。製品 X では,ファームウェアのアップデート時,www アカウントの権限で sudo コマンドを使用して tar コマンドを実行することで,root アカウントの権限でアーカイブファイルを展開している。この tar コマンドには,任意の OS コマンドを実行できるオプションがある。ただし,ファームウェアのアップデート時にこのオプションは使用していない。当該オプションを悪用する例を図5に示す。
図5 tar コマンドのオプションを悪用する例
K 氏は,“攻撃者が,Web 管理機能の脆弱性と tar コマンドのオプションを悪用し,書込み不可のディレクトリを書込み可能に変更して WebShell を配置した後,WebShell を使用してランサムウェアを実行した”と推測した。そこで,④製品 X で tar コマンドのオプションが悪用されるのを防ぐ対策を検討することにした。
〔DDNS-Z の調査〕
DDNS-Z を使用して製品 X にアクセスするための URL は,インターネットの検索エンジンで特定のキーワードを検索すると容易に見つけることができてしまい,攻撃対象になりやすいことが分かった。インターネットの検索エンジンで検索されないようにするために,各 Web ページの <head> セクションに <meta name="robots" content="h"> を記載することを検討した。
本文中の a ,b に入れる適切な字句を,解答群の中から選び,記号で答えよ。解答群 ア A イ MX ウ TLS エ TTL オ TTY カ TXT
〔a〕解答例
ア
〔b〕解答例
エ
解説
本文の根拠
〔NAS-A 及びルータ-A の調査〕
ルータ-A のグローバル IP アドレスが変更された場合,Z 社の DNS サーバの設定でホスト名 nas-a に割り当てている IP アドレスを変更するために,a レコードを更新する。
〔NAS-A 及びルータ-A の調査〕
そのレコードの b は,300 秒に設定されていた。
DNS で,ホスト名に IPv4 アドレスを対応付けるリソースレコードは A レコードである。ルータ-A のグローバル IP アドレスが変わったとき,DDNS-Z はホスト名 nas-a の A レコードの値を新しいアドレスに更新する。したがって a はア(A)である。
レコードには,その内容を DNS キャッシュサーバが保持してよい時間を秒で示す値があり,これが TTL(Time To Live)である(RFC 1035)。TTL が 300 秒なら,アドレスが変わってもキャッシュが切れる最長 300 秒の間は古いアドレスが返されることがある。DDNS のように IP アドレスが頻繁に変わる用途では TTL を短くしておく。したがって b はエ(TTL)である。
ファイル共有機能でも Web 操作機能でもアクセスできない /root ディレクトリ配下のファイルも暗号化されていた。
表1 ファイル共有機能
有効に設定したプロトコルで,ファイルを共有する。
A 社の PC がランサムウェアに感染して NAS-A のファイルを暗号化した場合,PC から NAS-A に対してできる操作は,ファイル共有機能(SMB)や Web 操作機能の範囲に限られる。暗号化できるのは,それらの機能でアクセスできるファイルだけである。
ところが,今回は“ファイル共有機能でも Web 操作機能でもアクセスできない /root ディレクトリ配下のファイル”まで暗号化されていた。これは,NAS-A の OS 上でマルウェア自体が動作し,OS の権限でファイルを読み書きしたと考えるのが自然である。したがって,NAS-A 自体が感染した可能性が高いと判断できる。
c は15字以内で,“パストラバーサル”(8字)が解答例である。入力検証の不備で起きる別の攻撃(OS コマンドインジェクションなど)と取り違えない。
設問2(2)15字以内解答欄1つ
図2中の d に入れる適切な字句を,15 字以内で答えよ。
〔d〕解答例
OSコマンドインジェクション
解説
本文の根拠
図2 脆弱性2
この IP アドレスの処理に脆弱性があり,任意の OS コマンドを実行できてしまう。
図2 脆弱性2
“ping 127.0.0.1;whoami”というコマンドが実行される。
脆弱性2は,ping を実行する機能に渡す IP アドレスの処理に不備があり,利用者が入力した文字列の中の OS コマンド(図の例では whoami)が実行されてしまうものである。入力した addr=127.0.0.1;whoami は,“ping 127.0.0.1”の後ろに“;”を挟んで別のコマンドをつなげたものとして実行される。“;”はシェルでコマンドの区切りに使われる記号である。外部からの入力を OS のコマンドに渡すとき,入力の中のシェルの特殊文字を無害化しないと起きる。
このように,外部からの入力を利用して OS コマンドを不正に実行させる攻撃手法を OS コマンドインジェクションという。同じインジェクションでも,SQL 文に紛れ込ませるのは SQL インジェクションで,今回の“;”とコマンドの例は OS コマンドである。
15字以内で,解答例の“OSコマンドインジェクション”は14字で収まる。
設問2(3)解答欄3つ
図3中の e ~ g に入れる適切な字句を,解答群の中から選び,記号で答えよ。解答群 ア URL デコード イ 除外リストとの比較 ウ パス名の正規化
〔e〕解答例
ア
〔f〕解答例
ウ
〔g〕解答例
イ
解説
本文の根拠
〔脆弱性の調査〕
パッチ M では,脆弱性 1 の対策として,認証なしアクセスの処理の流れにパス名の正規化の処理を加え,さらに,図3に示す順序にした。
B さんは,上司である情報処理安全確保支援士(登録セキスペ)の C 課長に表1をレビューしてもらった。C 課長は,Q サービス及び Q アプリが他人名義で利用されたり,他人のアカウントで不正にログインされたりすることを防ぐためには,表1のアカウント作成と Q サービスへのログインの方法では本人確認が不十分であると指摘した。
C 課長は,経済産業省が 2020 年に公表した“オンラインサービスにおける身元確認手法の整理に関する検討報告書”を確認するように指示した。当該報告書では,本人確認の構成要素は,身元確認と当人認証であると整理されている。身元確認は,“登録する氏名・住所・生年月日等が正しいことを証明/確認すること”と定義されている。また,当人認証は,“認証の 3 要素のいずれかの照合で,その人が作業していることを示すこと”と定義されている。したがって,Q サービスにおいては,表1の a 時に身元確認を,表1の b 時に当人認証を実施することになる。
〔身元確認〕
B さんは,身元確認についてどのような方法があるのかを調査したところ,“犯罪による収益の移転防止に関する法律施行規則”(以下,犯収法規則という)に規定があることが分かった。犯収法規則の規定を参考にすると,銀行側が利用者の身元確認を行い,かつ,銀行がその記録を保存していることを L 社が確認すれば,Q サービスの a 時の身元確認を実施したとみなせると B さんは考え,C 課長に相談した。
C 課長は,表1の銀行口座とのひも付けでは,キャッシュカードの所持が確認されず,暗証番号で照合されるだけなので,攻撃者が他人の氏名でアカウント作成を行い,①他人の銀行口座とのひも付けを行うリスクを低減するためには,L 社が表1の a 時に身元確認を実施する必要があると指摘した。
L 社には対面で身元確認できる店舗がなく,身元確認の手続を郵送で行うことになると,利用者が Q サービスを利用するまでに時間が掛かる。B さんは,身元確認をオンラインで行う方法を C 課長に相談した。
C 課長は,将来,Q サービスには利用者間の送金機能などが追加されることを考慮し,金融庁が公表している“犯罪収益移転防止法におけるオンラインで完結可能な本人確認方法の概要”の個人顧客向けの本人確認方法が採用できると考えた。そこで,表2のように整理して B さんに説明した。
表2 個人顧客向けの本人確認方法
次は,表2についての B さん及び C 課長の会話である。
B さん:項番 5 のセキュリティが強固だと思うので,項番 5 を Q サービスに導入する場合の本人確認方法について詳しく教えてください。
C 課長:マイナンバーカードには,地方公共団体情報システム機構が発行した署名用電子証明書などが格納されている。Q サービスの利用者は,NFC 機能のあるスマートフォンを利用して,マイナンバーカードを読み取り,署名用電子証明書のパスワードを Q アプリに入力する。入力されたパスワードが正しい場合,マイナンバーカード内の d で Q サービスの申込用のデータにデジタル署名し,当該デジタル署名,当該データ本体,署名用電子証明書を Q サービスに送付する。Q サービス側で,デジタル署名が利用者本人のものであり,改ざんされていないことを Q サービスの利用者の e を用いて確認した後,地方公共団体情報システム機構に f を確認する。
B さん:項番 5 の方法では,利用者が NFC 機能のあるスマートフォンとマイナンバーカードを用意する必要があるのですね。それならば,項番 1 の方が,利用者にとっては利用しやすい方法と言えそうです。項番 1 では,注意点はありますか。
C 課長:項番 1 では事前に準備した他人の画像を用いられないようにする必要がある。
B さん:どうすればよいでしょうか。
C 課長:完全な対策はないが,政府が犯収法規則の改正において意見公募を実施した際の“警察庁及び共管各省庁の考え方”に記載されている方法を採用すると,“Q アプリが毎回ランダムな数字を表示し,利用者が g して,直ちに送信することによって,L 社では提出された画像が事前に準備されたものではないことを確認する”という方法が考えられる。この方法で身元確認しよう。
B さん:分かりました。
〔当人認証〕
B さんは,Q サービスの当人認証を強化する方法を検討し,利用者 ID とパスワードによる認証後に SMS で認証コードを利用者に送り,入力させる方法を実装することを考えた。
“Q サービスへのログイン”は,利用者 ID とパスワードという認証の要素(知識)を照合して,その人が操作していることを示す手順なので,当人認証に当たる(b=ア)。アカウント作成で登録した情報が正しいかを確かめるのが身元確認,その後に毎回,本人が操作していることを確かめるのが当人認証,と分けて考える。
解答群から記号を選ぶ設問で,a と b を逆にしやすい。a は“登録する氏名・住所・生年月日等が正しい”の確認という定義から選ぶ。