書式文字列攻撃
問題は、printf() などの書式指定のあるC言語の関数で、ユーザーが入力した文字列をそのまま書式文字列として利用する場合に発生する。悪意のあるユーザーが %s や %x といった書式トークンを使い、スタックやその他のメモリ位置の内容をデータとして出力させることができる。また、%n トークンを使って任意のアドレス位置に任意のデータを書き込ませたりする。
これらのテクニックを組み合わせて、ライブラリ関数のアドレスを書き換えたり、コールスタック上のリターンアドレスを書き換えて不正なコードを実行させる。書式文字列を工夫することで書式文字列自体が変換対象の引数となるようにでき、書式文字列の先頭に %n で上書きされるアドレスを含めておくと、不正なコードを指定したアドレスに書き込める。
それまで書式のバグがあっても危険はないと考えられていたため、この種の脆弱性を持つツールが多数存在することがわかった。MITRE's CVE project のリストによれば、約 150 もの脆弱なプログラムがある。
この種のバグは、プログラマがユーザーの入力した文字列を表示しようとした場合に現れやすい。プログラマが printf("%s", buffer) と書くべきところを printf(buffer) と書いてしまう場合である。この場合、buffer が書式文字列として解釈され、変換文字が含まれているとそれを書式として翻訳しようとする。