バッファオーバーフロー
バッファオーバーフロー攻撃の結果として、write-what-where状態("write-what-where condition"、CWE-123。任意の場所に任意の値を書き込むことができる状態)になる危険がある。
write-what-where状態になると、セキュリティポリシーのスコープ外にメモリのデータを書き込むことができる。セキュリティポリシーのスコープ外にコードを置くことで、攻撃者はほぼ確実に任意のコードを実行できるようになる。管理者権限を制御しているフラグ等が書き換えられる場合も、攻撃者は任意のコードが実行可能になる。
バッファオーバーフローがある程度公に文書化されたのは1972年の初めで、Anderson 1972 で以下のように説明されている。
Anderson 1972, p. 61: The code performing this function does not check the source and destination addresses properly, permitting portions of the monitor to be overlaid by the user. This can be used to inject code into the monitor that will permit the user to seize control of the machine.
この処理を実行するコードは読み込み元と書き込み先のアドレスに対するチェックを適切に行なっておらず、モニターの一部に対しユーザによる上書きを許すことになっている。これはモニターにコードを挿入するのに利用される可能性があり、結果としてユーザがマシンの制御を掌握する可能性がある。
モニターとは、現在カーネルと呼ばれているのと同じものである。
バッファオーバーフローを利用した悪意のあるエクスプロイトで最初に文書化されたのは、1988年に書かれたMorris wormがインターネット上で増殖するのに利用していたエクスプロイトのうちの一つである。攻撃対象のプログラムはUNIXのサービスであるfingerであった。
バッファオーバーフローを検出するコードをコンパイル時に実行コードに挿入する手法がある。典型的手法としては、ローカル変数とSFPの間に、カナリア(canary)もしくはクッキーと呼ばれる領域を挿入する方法である。プログラムは実行中カナリアを監視し続け、バッファオーバーフローによりカナリアが書き換わったらプログラムを停止する。
StackGuard
Microsoft Visual C++のGSオプション