今回も情報処理安全確保支援士の試験勉強の内容をアウトプットをしていきます。
勉強に使ったのはこちら
章の終わりにあるCheck問題に私なりの答えで解答していきます。
今回は2.3章:バッファオーバーフロー攻撃のCheck問題です。
【Q1】スタック領域のデータ構造上の特徴を挙げよ。
後入れ先出し(LIFO)の構造。
プログラム内でサブルーチンを呼び出す際に使われる。
【Q2】メモリのスタック領域とヒープ領域の違いについて述べよ。
スタック領域は後入れ先出し(LIFO)のメモリ領域。
ヒープ領域は動的に確保と解放を繰り返せるメモリ領域。
【Q3】C/C++言語のどのような特徴がBOF攻撃を成立させているのか。
C/C++言語では、変数への入力データが確保されていたサイズよりもはるかに大きい場合、関数によってはサイズの制限なしに入力データをメモリ内の変数領域にコピーしてしまう。
その結果、確保された変数の領域を超え、スタック内の他の領域まで上書きしてしまう。その場合、サブルーチンの処理終了の際、スタックに格納されていたはずの戻り先が上書きされおり本来の戻り先に戻れなくなる。
本来の戻り先に不正なコードが実行されるような戻り先をセットし、不正なコードによるバッファオーバーフロー攻撃が成立する。
【Q4】BOF攻撃によって、なぜ管理者の権限が奪われてしまうのか。
侵入者は、所有者がrootでsetuid/setgid属性をもつプログラムを実行し、非常にサイズの大きい入力データを与えることでBOF状態を引き起こし、root権限を手に入れる。
【Q5】Use-After-Freeを悪用したBOF攻撃の特徴を挙げよ。
ヒープ領域を使用することで攻撃者に任意のコードの実行を許してしまう可能性のある脆弱性。
スクリプト言語を用いて攻撃を行うことが可能であり、スクリプト実行機能を有する多くのソフトウェアが攻撃に悪用される可能性がある。
【Q6】setuid/setgid属性とは何か、なぜ必要なのか。
ファイルやディレクトリに設定する属性の一つ。
setuid(set userID)はユーザーに対する属性(権限)を、setgid(set groupID)はグループに対する属性(権限)を指定する。
ユーザーやグループごとに対象システムで利用可能な権限を変更するためなどに必要な属性である。
【Q7】setuid/setgid属性をもつプログラムの危険性とは何か。
Q4のように管理者の権限が奪われるおそれがある。
【Q8】市販ソフトウェアに対するBOF攻撃への有効な対策としては何があるか。
ソフトウェアのバージョンアップ・パッチの適用を適切に行い、既知のセキュリティホールを塞ぐ。
【Q9】ソフトウェア開発者としてとるべきBOF対策としては何があるか。
・gets,strcpy,strcatなど、BOFを引き起こす危険性のある関数は使わないようにする。
・入力データのレングスチェックを確実に行う。
・スタック上に埋め込んだ攻撃検知用の値によってBOF攻撃を検知する。改ざんを検知した場合はプログラムを強制的に停止させる。
・BOF防止機能を追加したライブラリを使用する。
【Q10】setuid/setgid属性を悪用したBOF攻撃への対策としては何が有効か。
所有者がrootでsetuid/setgid属性をもつプログラムを可能な限り作成しない。
また、定期的に棚卸を実施し、不要なプログラムを削除し、setuid/setgid属性が不要なものについてはパーミッションを変更する。
私が使っているのは2022年版のテキストですが、2023年版も出ています。