書式文字列攻撃とは
書式文字列攻撃は、1999年頃に発見されたセキュリティ上の
脆弱性を利用した攻撃手法です。この攻撃は、プログラムをクラッシュさせたり、悪意のあるコードを実行させたりする可能性があります。当初、書式文字列の扱いの誤りは無害と考えられていましたが、実際には深刻なセキュリティリスクを引き起こすことが判明しました。
概要
この問題は、
C言語の`printf()`のような書式指定を行う関数において、ユーザーが入力した文字列をそのまま書式文字列として使用する場合に発生します。悪意のある攻撃者は、`%s`や`%x`のような書式指定子を悪用し、
スタックやその他のメモリ領域の内容を読み取ることができます。さらに、`%n`指定子を利用して、任意のメモリ位置に任意のデータを書き込むことも可能です。
これらの手法を組み合わせることで、ライブラリ関数のアドレスを書き換えたり、コール
スタック上のリターンアドレスを操作して、不正なコードを実行させることができます。攻撃者は、書式文字列を巧妙に操作することで、書式文字列自体が変換対象の引数となるように仕向け、`%n`によって上書きされるアドレスを事前に指定することができます。
当初、書式文字列のバグは危険ではないと考えられていたため、多くのツールにこの
脆弱性が存在していました。MITREのCVEプロジェクトによれば、約150もの脆弱なプログラムが確認されています。
この種のバグは、プログラマーがユーザーからの入力を表示する際に起こりやすいです。例えば、`printf("%s", buffer)`と書くべきところを、誤って`printf(buffer)`と記述してしまうケースです。この場合、`buffer`の内容が書式文字列として解釈され、変換指定子が含まれていると、それに対応する引数を
スタックから読み込もうとします。`printf("%s", buffer)`であれば、入力された文字列をそのまま出力するだけです。
C言語の引数処理における型の曖昧さが、この問題を引き起こす要因の一つです。特に、`printf`で使用されている可変引数機構(varargs)は、
サブルーチンに任意の数の引数を渡すことを可能にします。`printf`では、第一引数の書式文字列の内容によって必要な引数の数が決まり、それに応じてコール
スタックから引数を取得します。
このバグは、1990年にウィスコンシン大学で行われた研究で初めて発見されました。研究者たちは、APIにランダムな引数を与えてシステムがクラッシュしないかをテストする中で、この問題を発見しました。彼らはこの現象を「相互作用効果」と呼び、cshというシェルプログラムのテストでこの
脆弱性を確認しました。このような
脆弱性のテスト手法は、後にファジングと呼ばれるようになりました。
書式文字列の
脆弱性が攻撃に利用される可能性は、Tymm Twillman氏がProFTPDデーモンのセキュリティ監査中に発見しました。彼は、`snprintf`関数でユーザーからの入力がそのまま書式文字列として使用されていることを発見しました。詳細な調査の結果、この
脆弱性を利用してセキュリティを突破できることが判明しました。この結果は、1999年9月に
Bugtraqメーリングリストに新たな
脆弱性報告として投稿されました。しかし、この問題が重大なセキュリティリスクであると認識されるまでには、数ヶ月の時間を要しました。
危険な書式文字列を防ぐ方法
多くのコンパイラは、書式文字列を静的にチェックし、問題がある場合には警告を発します。GCC(GNU Compiler Collection)では、以下のコンパイラフラグが利用可能です。
`-Wall`
`-Wformat`
`-Wno-format-extra-args`
`-Wformat-security`
`-Wformat-nonliteral`
`-Wformat=2`
これらの警告を有効にすることで、書式文字列攻撃のリスクを低減することができます。
関連事項
`printf`
`scanf`
`syslog`
シェルコード
参考文献
Robert C. Seacord: Secure Coding in C and C++. Addison Wesley, September, 2005. ISBN 0-321-33572-4
Tobias Klein: Buffer Overflows und Format-String-Schwachstellen, Dpunkt Verlag, ISBN 3-89864-192-9.
Crispin Cowan: Software Security for Open-Source Systems, Published by the IEEE Computer Society, IEEE SECURITY & PRIVACY, JANUARY/FEBRUARY 2003,
http://computer.org/security
Barton Miller, Lars Fredriksen, Bryan So: An Empirical Study of the Reliability of UNIX Utilities, Communications of the ACM, vol. 33, no. 12 (December 1990). Also appears (in German translation) as Fatale Fehlerträchtigkeit: Eine empirische Studie zur Zuverlässigkeit von UNIX-Utilities, iX, March 1991.
http://www.cs.wisc.edu/~bart/fuzz/
Crispin Cowan: FormatGuard: Automatic Protection From printf Format String Vulnerabilities, Proceedings of the 10th USENIX Security Symposium, August 2001.
http://www.usenix.com/events/sec01/full_papers/cowanbarringer/cowanbarringer.pdf
外部リンク
scut / team teso Exploiting Format String Vulnerabilities v1.1
2001年3月24日
CERT Secure Coding Standards
Better Software Through Secure Coding Practices
* CERT Secure Coding Books