(Translated by https://www.hiragana.jp/)
書式文字列攻撃 - Wikipedia

書式しょしき文字もじれつ攻撃こうげき

書式しょしき文字もじれつ攻撃こうげき(しょしきもじれつこうげき、えい: Format string attack)は、1999ねんごろ発見はっけんされた(それまでは無害むがいかんがえられていた)セキュリティホール利用りようした攻撃こうげきのクラスである。書式しょしき文字もじれつ攻撃こうげきは、プログラムをクラッシュさせたり、不正ふせいなコードを実行じっこうさせたりできる。

概要がいよう

編集へんしゅう

問題もんだいは、printf() などの書式しょしき指定していのあるC言語げんご関数かんすうで、ユーザーが入力にゅうりょくした文字もじれつをそのまま書式しょしき文字もじれつとして利用りようする場合ばあい発生はっせいする。悪意あくいのあるユーザーが %s や %x といった書式しょしきトークンを使つかい、スタックやそののメモリ位置いち内容ないようをデータとして出力しゅつりょくさせることができる。また、%n トークンを使つかって任意にんいのアドレス位置いち任意にんいのデータをませたりする。

これらのテクニックをわせて、ライブラリ関数かんすうのアドレスをえたり、コールスタックうえのリターンアドレスをえて不正ふせいなコードを実行じっこうさせる。書式しょしき文字もじれつ工夫くふうすることで書式しょしき文字もじれつ自体じたい変換へんかん対象たいしょう引数ひきすうとなるようにでき、書式しょしき文字もじれつ先頭せんとうに %n で上書うわがきされるアドレスをふくめておくと、不正ふせいなコードを指定していしたアドレスにめる。

それまで書式しょしきのバグがあっても危険きけんはないとかんがえられていたため、このたね脆弱ぜいじゃくせいつツールが多数たすう存在そんざいすることがわかった。MITRE's CVE project のリストによれば、やく 150 もの脆弱ぜいじゃくなプログラムがある。

このたねのバグは、プログラマがユーザーの入力にゅうりょくした文字もじれつ表示ひょうじしようとした場合ばあいあらわれやすい。プログラマが printf("%s", buffer)くべきところを printf(buffer)いてしまう場合ばあいである。この場合ばあいbuffer書式しょしき文字もじれつとして解釈かいしゃくされ、変換へんかん文字もじふくまれているとそれを書式しょしきとして翻訳ほんやくしようとする。printf("%s", buffer) であれば、たん入力にゅうりょくされた文字もじれつ表示ひょうじするだけである。

この問題もんだいは、C言語げんご引数ひきすう解釈かいしゃくかた意識いしきしないために発生はっせいする。とくprintf でも使つかわれている varargs 機構きこうサブルーチン任意にんい引数ひきすうわたせる。printf ではだいいち引数ひきすうである書式しょしき文字もじれつ内容ないようによって必要ひつよう引数ひきすう個数こすうまり、それによってコールスタックから引数ひきすうを pop して使用しようする。

このバグは1990ねんにウィスコンシン大学だいがくおこなわれた評価ひょうか各種かくしゅAPIにでたらめな引数ひきすうあたえてシステムクラッシュなどの問題もんだい発生はっせいしないかを調査ちょうさ)で最初さいしょつかった(Miller, Fredriksen, So 1990 参照さんしょう)。かれらはこれを "interaction effects" とび、csh評価ひょうかでそれをつけている。このような不具合ふぐあい評価ひょうか手法しゅほうのちしゃによって体系たいけいされ、ファジングばれることになる。

書式しょしき文字もじれつのバグで攻撃こうげきされる可能かのうせいは Tymm Twillman が ProFTPD デーモンのセキュリティ検査けんさちゅう発見はっけんした。その検査けんさで、snprintf にユーザーが入力にゅうりょくしたデータがそのまま書式しょしき文字もじれつとして使つかわれているのがつかった。さらなる評価ひょうか結果けっか、このバグを利用りようしてセキュリティをやぶることが可能かのう判明はんめいした。この結果けっかを 1999ねん9がつBugtraqメーリングリストにあらたな脆弱ぜいじゃくせい報告ほうこくとしてポストした[1]。しかし、これが重大じゅうだい問題もんだいであると認識にんしきされるまで数ヶ月すうかげつようすることになった。

危険きけん書式しょしき文字もじれつふせ方法ほうほう

編集へんしゅう

おおくのコンパイラは書式しょしき文字もじれつ静的せいてきにチェックし、問題もんだいがある場合ばあいには警告けいこくはっする。

GNUコンパイラコレクションでは、適当てきとうなコンパイラフラグとして、-Wall,-Wformat, -Wno-format-extra-args, -Wformat-security, -Wformat-nonliteral, -Wformat=2 がある[2]

関連かんれん項目こうもく

編集へんしゅう

参考さんこう文献ぶんけん

編集へんしゅう
  • 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

脚注きゃくちゅう

編集へんしゅう

外部がいぶリンク

編集へんしゅう