メモリ破壊攻撃とソフトウェア脆弱性対策
メモリ破壊攻撃とは、プログラムが確保した領域の範囲を越えて書き込んだり、解放済みの領域を参照したりすることで、メモリの内容を攻撃者の意図どおりに書き換える攻撃である。書き換えられた制御情報によって処理の流れが乗っ取られ、任意の攻撃コードが実行され得る状態になる。過去問は、この種の脆弱性を前提として、攻撃の成立条件から対策までを段階的に問う形式をとっている。
原理と仕組み
バッファオーバーフローは、固定長の領域にその長さを超えるデータを書き込むことで、隣接する領域を上書きしてしまう脆弱性である。関数の呼出し時に戻り先アドレスがスタック上に置かれている場合、溢れたデータによってそのアドレスが書き換えられ、関数の復帰時に攻撃者が用意した位置へ処理が移る。
攻撃者は、書き換えたいアドレスを入力値のバイト列として埋め込む必要がある。リトルエンディアンのマシンでは多バイトの値の下位バイトが先頭に格納されるため、入力値を組み立てる際にはバイトの並びを逆にして考えなければならない。また、読込み処理が改行コードを区切りとして扱う場合には、その改行コードも入力値の構成要素として考慮する必要がある。過去問では、攻撃者の指定するアドレスと改行コードを前提に、入力値の具体的なバイト列を求める問いが立てられている。
フォーマットストリングバグは、書式文字列を利用者の入力に依存させた場合に、書式指定子の解釈を通じて任意のメモリを読み書きされる脆弱性である。Use-After-Free は、解放済みのオブジェクトへのポインタが残っている状態でそのポインタを使うことで、同じ領域に別の用途のデータが置かれた後に誤った処理が行われる脆弱性である。いずれも、メモリの管理や解釈の誤りが攻撃の起点となる。過去問の解答群には、こうしたメモリ破壊系の名称とともに、クロスサイトスクリプティングやSQLインジェクションなどの脆弱性名が並んでいる。
攻撃対象と判断の基準
攻撃の成否は、どのメモリ領域のどの値を書き換えられるかで決まる。典型的な対象は、スタック上の戻り先アドレス、ヒープ上のデータ、オブジェクトが保持する関数ポインタである。過去問では、攻撃の対象となるメモリ領域の名称を答えさせる設問がある。
この節の続き
- 脆弱性対策の実務
- 試験で問われやすい区別
ここまでが冒頭部分です。ログインすると、無料でも1日2節まで全文をお読みいただけます。
アプリでこの節を読む