[問題文・解答]
平成28年度10月に実施された情報セキュリティスペシャリスト試験の午後1試験の問題・解答はIPA公式ページからダウンロード出来ます。(以下リンク)
[H28秋 午後1 問題文] [H28秋 午後1 解答]
[問題概要]
題材は、ソフトウェア開発における脆弱性対策についてです。ソフトウェアの脆弱性の1つとしてバッファオーバフロー(BOF)脆弱性、特にヒープベースBOF脆弱性をもったプログラムの脆弱性対策について検討するという内容です。
一部知らないと答えるのが困難な問題があり、その他の設問もある程度の知識と読解力が要求される問題です。難易度は普通〜やや高めです。
[設問1]
CVE識別子(共通脆弱性識別子)
個別製品に含まれる脆弱性に対してアメリカ政府の支援を受けた非営利団体MITRE社が付与している一意の識別番号。ゼロデイ攻撃
ソフトウェアの脆弱性に対して修正パッチが提供されるより前にその脆弱性を利用した攻撃を行うこと。標的型攻撃
特定の組織や個人を狙って行われるサイバー攻撃。ファジング検査
検査対象のソフトウェアに問題を引き起こしそうなデータ(fuzz)を送り込んで、その応答や挙動を監視して脆弱性を検査する手法。[答] a) ア b) イ c) ウ d) エ
[設問2]
(1)
スタックベースBOF脆弱性を悪用する攻撃では、関数呼出し時にスタックに積まれる関数の戻り先アドレスの値を攻撃コードを埋め込んだメモリへのアドレスに書き換えることで攻撃が開始されます。よって、「呼出し元関数への戻りアドレス」となります。
[答] 呼出し元関数への戻りアドレス
[答] 呼出し元関数への戻りアドレス
(2)
図1よりまず、sample3及びsample4はファイルの所有者がsuzukiとなっているため、ユーザsuzukiで実行した場合にrootで実行されることはありません。
一方、sample1とsample2は所有者がrootとなっており、10文字目がxとなっていることから所有者・グループ以外のユーザでも実行可能です。ここでP.6下段「実行権限の属性に"s"が表示されているファイルは、ファイルの所有者権限で実行される」とあることから、実行権限がsとなっているsample2については他ユーザ(suzuki等)で実行しても、root権限で動作することが分かります。
[答] sample2
図1よりまず、sample3及びsample4はファイルの所有者がsuzukiとなっているため、ユーザsuzukiで実行した場合にrootで実行されることはありません。
一方、sample1とsample2は所有者がrootとなっており、10文字目がxとなっていることから所有者・グループ以外のユーザでも実行可能です。ここでP.6下段「実行権限の属性に"s"が表示されているファイルは、ファイルの所有者権限で実行される」とあることから、実行権限がsとなっているsample2については他ユーザ(suzuki等)で実行しても、root権限で動作することが分かります。
[答] sample2
一方、sample1とsample2は所有者がrootとなっており、10文字目がxとなっていることから所有者・グループ以外のユーザでも実行可能です。ここでP.6下段「実行権限の属性に"s"が表示されているファイルは、ファイルの所有者権限で実行される」とあることから、実行権限がsとなっているsample2については他ユーザ(suzuki等)で実行しても、root権限で動作することが分かります。
[答] sample2
[設問3]
(1)
図2のプログラムYでは、第1引数は利用者ID、第2引数はパスワードを受け取って、登録済みのIDとパスワードの組との照合を行います。
ここで、ID・パスワードの長さは半角英数字8文字が上限とされており、プログラム上では変数uid及び変数passがchar型8文字のサイズで確保されています(20、21行目)。
そして、パスワードについては第1引数で入力された利用者IDを基に登録済みパスワードをpassに格納しています(22行目)。
一方、利用者IDについては第1引数の値をuidにそのままコピーしています(23行目)。この時、第1引数が8文字を超える文字列でかつ、ヒープ上でのuidの格納領域の後ろがpassの格納領域だった場合にpassに格納された正しいパスワードが書き換えられる可能性があります。この条件を満たす為の引数は、適当な半角英数字8文字の後に第2引数と同じ値が続き第1引数を入力した場合です。従って、「ウ」の引数の組が適切です。
[答] ウ
ここで、ID・パスワードの長さは半角英数字8文字が上限とされており、プログラム上では変数uid及び変数passがchar型8文字のサイズで確保されています(20、21行目)。
そして、パスワードについては第1引数で入力された利用者IDを基に登録済みパスワードをpassに格納しています(22行目)。
一方、利用者IDについては第1引数の値をuidにそのままコピーしています(23行目)。この時、第1引数が8文字を超える文字列でかつ、ヒープ上でのuidの格納領域の後ろがpassの格納領域だった場合にpassに格納された正しいパスワードが書き換えられる可能性があります。この条件を満たす為の引数は、適当な半角英数字8文字の後に第2引数と同じ値が続き第1引数を入力した場合です。従って、「ウ」の引数の組が適切です。
[答] ウ
(2)
上記[設問3](1)の解説より、バッファオーバフローが発生するコードの行番号は23行目です。[答] 23
(3)
20行目でuidのサイズはchar型8文字(UID_SIZE+1)で確保されているため、第1引数からコピーする場合はこのサイズまでに制限してコピーする必要があります。よって、サイズを指定してコピーしているイとオが適切です。
ア及びウは、第1引数のサイズに合わせてコピーしているためバッファオーバフローは防げません。また、ウは変数passのメモリ確保を行っており、意味がありません。
[答] イ、オ
ア及びウは、第1引数のサイズに合わせてコピーしているためバッファオーバフローは防げません。また、ウは変数passのメモリ確保を行っており、意味がありません。 [答] イ、オ
[設問4]
(1)
この設問は解答が思いつき辛い問題です。
[設問3](1)の解説より、[設問3](1)の引数の組で利用者認証が回避されるのはヒープ上でのuidの格納領域の後ろがpassの格納領域だった場合です。しかし、実際にはヒープメモリの確保の仕方は、メモリ確保のライブラリによって異なるため、[設問3](1)の引数を入力しても利用者認証を回避されない可能性もあります。
[答] ヒープメモリの確保方法が、メモリ確保のライブラリによって違うから。
[設問3](1)の解説より、[設問3](1)の引数の組で利用者認証が回避されるのはヒープ上でのuidの格納領域の後ろがpassの格納領域だった場合です。しかし、実際にはヒープメモリの確保の仕方は、メモリ確保のライブラリによって異なるため、[設問3](1)の引数を入力しても利用者認証を回避されない可能性もあります。
[答] ヒープメモリの確保方法が、メモリ確保のライブラリによって違うから。
(2)
プログラムYで利用者認証を回避する攻撃では、ヒープ上に何らかの攻撃コードを格納して実行させるわけではなく、あくまでヒープ領域の変数passを格納している部分を書き換えて、プログラムに正しいパスワードが入力されたと誤認証させるだけです。従って、ヒープ領域の書き換え防止が出来ないデータ実行防止機能はこの攻撃に対して有効に機能しません。
[答] ヒープ領域を書き換える行為を防止できないから。
[答] ヒープ領域を書き換える行為を防止できないから。
上記の解説は問題と解答を元に自分なりの考え方を記述しており、間違っている部分もあるかと思いますので、ご了承願います。また、誤りについては正しい考え方をご指摘・ご教授頂けると助かります。
ものすごく参考になりました。ありがとうございます
返信削除