この記事では,令和6年度 春期 情報処理安全確保支援士試験 午後問題 問1の解説(独自の見解)を行います.
情報処理安全確保支援士試験に向けて勉強されている方の参考になれば幸いです.
本記事における出典:令和6年度 春期 情報処理安全確保支援士試験 午後 問1
IPA(問題冊子・解答例・採点講評)のリンク
本記事内の解答例については,全てIPA公式からの引用になります.
設問1 本文中の a に入れる適切な字句
RESTful APIに関する知識問題でした.早速,空欄aを見てみましょう.
(前略)RESTful API の設計原則の一つにセッション管理を行わないという性質がある.この性質を【 空欄a 】という.(後略)
解答例
ステートレス
解説
「RESTful API」とは,REST(Representational State Transfer)と呼ばれるシンプルかつ効率的な通信を実現するために考えられた仕組みです.
RESTful APIの設計原則には様々な決まり事があり,例えば,クライアント・サーバの分離,一貫性のあるインターフェース(URLでリソースを識別し,GET・POST・PUT・DELETEのHTTPメソッドを用いてCRUD処理を行うこと),階層構造などが挙げられます.
今回の解答であったステートレスもRESTful APIの設計原則の中に含まれます.
では,「セッション管理を行わない」とはどういうことでしょうか?
セッション管理は,会員制のサイトにおいてユーザのログイン状態を保持するための仕組みとして,従来から用いられてきました.セッションは通常,サーバ側のメモリやデータベースで管理されます.
サーバによるセッション管理は,複数のリクエストを跨いでもその状態を維持できる(ページ遷移の度にログインする必要が無い)反面,その分サーバのリソースを消費するというデメリットがあります.
ステートレスでは上記のようなセッション管理を行わないため,代わりに状態を維持するために必要な情報を都度,クライアントからサーバに添付して送信する必要があります.代表例としては,問1内のテーマの1つにもなっているJWT(JSON Web Token)です.JWTについては,後述します.
設問2 〔脆弱性診断の結果〕
設問2は,計算問題から文章記述問題まで多岐にわたります.
(1) 表3中の b に入れる適切な数値
(前略)1秒間に10回試行する総当たり攻撃を行った場合,文字列Xの検証において,平均的な認証成功までの時間は【 空欄b 】秒になり,突破される可能性が高い.
解答例
500
解説
問題冊子4ページの表2「S-APIの仕様(抜粋)」より,文字列Xは4桁の数字から構成されていることが分かります.
つまり,文字列Xを対象に総当たり攻撃を行う場合は,「0000」~「9999」の
計$10^4=10,000$パターンが考えられます.
「1秒間に10回試行」するということは,比例計算により,「0.1秒間に1回試行」すると読み替えることができます.
総当たりを昇順で試行するとして,仮にXが「0000」であった場合,所要時間は0.1秒になります.
Xが「9999」であった場合,$10^4/10=1,000$より,所要時間は1,000秒になります.
以上より,最短所要時間は0.1秒,最長所要時間は1,000秒であることが分かります.
最短所要時間から最長所要時間までは,$\Delta=0.1$の等差数列が成り立ちます.
平均所要時間を求めたいので,等差数列の総和をパターン数で割ります.
$\frac{\Sigma}{10^4}=\frac{1}{2}n(a+l)=\frac{1}{2} \times 10^4(0.1+1000) \times \frac{1}{10^4}=500.05\simeq500$
問題文に「小数点以下を四捨五入して,整数で答えよ.」とあるので,答えは500になります.
(2) 検証対象となるデータとその内容
修正後のライブラリQで行うJWTの検証では,どのようなデータに対してどのような検証を行うべきでしょうか?
解答例
・データ:JWTヘッダ内のalgに指定された値
・内容:NONEでないことを検証する
同じような意味合いの記述であれば,正解扱いとして採点されたものと思われます.
解説
問題冊子6ページの下部に以下のような記述があります.
ここで,表4中の“RS256”の代わりに“NONE”を指定し,“user01”を他の利用者IDに改ざんしたJWTを送信したところ,改ざんしたJWTの検証が成功し,他の利用者へのなりすましができた.
上記の記述から,解答の骨子としては「JWTの改ざんを検知する(JWT検証時に弾く)仕組みを取り入れる」といったものになります.そして,改ざんを検知する具体的な方法を問われているわけです.
まずはJWTの仕組みについて確認しましょう.
問題冊子5ページの図4にもある通り,JWTは基本的にヘッダ・ペイロード・署名(シグネチャ)の3つから構成されています.システムにとって必要なユーザ識別子などの情報が含まれるのは,ペイロードのみですが,ヘッダと署名はJWTの改ざんを防ぐのに重要な役割を担っています.
前述の通り,開発方針としてステートレスを取り入れた場合,サーバでは認証状態を管理しないので,クライアントから送信されるJWTに依存することになります.従って,何の対策も施さない場合,クライアントから改ざん(偽造)されたJWTが送信されたとしても,サーバはそれを鵜呑みにしてしまうことになります.
そこで,改ざんを検知してくれるのがJWTに含まれる署名です.ヘッダに指定されたアルゴリズムとシステムが生成した秘密鍵(サーバ管理者のみが知る極秘情報)を使用し,ヘッダとペイロードの内容に対する署名をします.
もし,ここでペイロードのユーザ識別子を改ざんしようとしても,攻撃者はシークレットを知らないので,正しい署名を付与することができず,サーバ側で行われるJWTの署名検証に失敗するという仕組みです.
ところが,問題文にあるように,algを“NONE”にしてしまうと,JWTに対して署名が付与されません.従って,前述のように「改ざんされたJWTをサーバが無批判に受け取ってしまう」事態が発生してしまいます.
以上を踏まえると,最終的な答えは自ずと「JWTヘッダ内のalgが“NONE”でないことを検証」といった枠組みになります.
(3)P呼出し処理に追加すべき処理
パラメータmidに他の利用者IDを指定すると,他の利用者IDにひも付く利用者情報を取得,改変できてしまう.
→ P呼出し時にどのような処理を追加すべきか?
解答例
JWTに含まれる利用者IDがmidの値と一致するかどうかを検証する処理
解説
この問題も前問と同様の考え方で,midの値が書き換えられたことを検出する仕組みが必要になりそうです.
書き換えを検出するには,基準となるものが必要です.そう考えて,問題用紙を眺めてみると…
JWTがあります.JWTのペイロードには,利用者IDが格納されています.midも実質的には利用者IDのことです.
従って,JWTのペイロードとmidの利用者ID同士を比較して,両者が一致しなければ「midが不正に書き換えられた」と判断できそうです.
丁度,前問でJWTの改ざんを防ぐ対策を行ったことで,JWTは絶対的な存在になりました.
これなら,JWTを比較対象の基準としても問題無さそうです.
心置きなく「JWTに含まれる利用者IDがmidの値と一致するかどうかを検証する処理」と書けますね.
(4) 表5中の c に入れる適切な字句
(前略)指定されたパラメータを検証せず全て【 c 】に送信していた.ここで,送信内容を改ざんしてパラメータ “status”を追加してリクエストを送信すると,【 c 】は利用者ステータスを変更できる.
解答例
共通モジュールP
解説
問題文に「表2中の用語で答えよ」とあるので,表2を参照します.表2下部には,以下の記述があります.
(前略)共通モジュールP(中略)は,利用者ステータスの管理にも利用される.共通モジュールPは,サービスMを呼び出して,次の処理を行う.(略)
-PUTメソッドが使われた場合,パラメータmidで指定された利用者IDにひも付く利用者情報を更新する.
共通モジュールPやらサービスL,サービスMなど登場人物が多く,混乱してしまいますが,赤や黄色のマーカーで重要な部分を強調し,落ち着いて文章を読み解いてみると,あくまでもステータス変更の主体は共通モジュールPであることが分かります.
念のため,表1でサービスLやサービスMの概要を確認してみます.これらの記述からは,サービスLやサービスMがステータス変更の主体ではないことが読み取れ,やはり共通モジュールPが答えであるという結論に至ります.
(5) 表5中の d に入れる適切な処理内容
文字列Xを使った認証メカニズムを総当たり攻撃で突破されることへの対策
解答例
連続失敗回数がしきい値を超えたらアカウントをロックする処理(29字)
解説
総当たり攻撃 ← 「一定回数失敗したら,アカウントロック」という組み合わせは,頻出の定番パターンなので,ぜひ覚えておきたいものです.
この問題では,空欄dの後に「そのしきい値は10とする.」というヒントかつ答えを単一に絞るための条件まで書いてありました.
解答について何の縛りも無ければ,「CAPTCHA」や「二要素認証」などの解答も考えられます.
設問3 〔新たな脆弱性への対応〕
(1) コマンドが実行されたことを確認する仕組みの実装
LDAP通信のコマンドが実行されたことを確認する仕組みをテストサーバに実装したい.
解答例
テストサーバのindex.htmlへのアクセスを記録し,確認する仕組み
解説
図8の注記2に以下のような記述があります.
d2dldC … のデコード結果は,wget http://a2.b2.c2.d2/index.html である.これは,コマンドCに相当する.
ここで,「wget URL」というのは指定したURLにアクセスするLinuxコマンドです.
つまり,コマンドC(図8で指定したコマンド)が実行されると,index.htmlにアクセスされます.
Webサーバへのアクセスはログとして記録できるので,これを確認すれば,コマンドCの実行を検証できます.
(2) 空欄 e, f に入れる適切な字句
| ルール | 検証対象 | パターン | 動作 |
| 1 | 【 e 】 | ¥Wjndi¥W | 遮断 |
| 2 | 【 f 】 | ¥Wldap¥W | 遮断 |
解答例
e, fともにHeader
解説
問題冊子9ページ中の図6に以下のような記述があります.
(前略)LDAPリクエストWを含み,脆弱性Vを悪用するJNDI Lookupを行う攻撃コードを準備する.
(3) 準備した攻撃コードをHTTPリクエストの x-api-version ヘッダの値として指定したHTTPリクエストを攻撃対象サーバに送信する.
以上の脆弱性Vについての関連情報から,空欄e・fにはHeaderが入ることが分かります.
(3) WAFルールのパターン
“jnDI”のように,大文字・小文字を入れ替えられても,WAFで検知/遮断できるために設定すべきパターン.
正規表現に関する問題(なお,正規表現のルールは問題冊子の5ページ中の図5に記載)
解答例
¥W[jJ][nN][dD][iI]¥W
( ¥W(j|J)(n|N)(d|D)(i|I)¥W も可)
解説
問題冊子の5ページ中の図5に記載されている正規表現のルールに従って記述します.
・大文字/小文字のいずれでもマッチするようにパターンを変更する.
・上記のパターンに対応できるのは,(x|y)z と [xyz] の2つである.
自ずと,\W[jJ][nN][dD][iI]\W( または \W(j|J)(n|N)(d|D)(i|I)\W )という解答を導けます.
(4) “検知”モードの利点と被害最小化の工夫
(前略)WAFルールの動作に“遮断”ではなく“検知”を設定することによる利点と,“検知”に設定した際に被害を最小化するために実施すべき内容を,それぞれ25字以内で答えよ.
解答例
・利点:誤検知による遮断を防ぐことができる.(18字)
・内容:アラートを受信したら攻撃かどうかを精査する.(22字)
解説
安全性と可用性のトレードオフを問う定番問題です.
遮断モードと検知モードの2つについて,それぞれ安全性と可用性の観点からメリット・デメリットをまとめてみました.
これらを総括して考えると,「利点:誤検知による遮断を防ぐことができる.」,「内容:アラートを受信したら攻撃かどうかを精査する.」といった内容の解答を導くことができます.

