リンク先にも、「the application must validate the format string before using it.」とあるように、 何らかの方法でuser_defined_formatの内容を確認しても、問題が無いことをチェックする必要がある。 (そのツールは悪意を持った入力が入り得ない場所でのみ使う、悪意を持たれても問題の無い用途にだけ使う、などでも可)
If the format string may come from the user or from a source external to the application, the application must validate the format string before using it.
他のプログラム (スコア:0)
stringsは使わない人は一生使わないコマンドなんで、その脆弱性を狙って悪用するのは難しいでしょうね。
しかし他の似たようなプログラムは大丈夫なんでしょうかね?自分はxxdを多用してますが。
printf (スコア:0)
ふと思ったのだが、printfの処理に使われている内部のインタプリタに脆弱性があって悪用されるなんて可能性はないのだろうか?
杞憂かもしれないが、何であれ動的な処理をしている部分は攻撃のターゲットになると思われるので.......
Re:printf (スコア:5, 参考になる)
Format string exploits ですね.
10年くらい前ですが,printfにもセキュリティーホールがある,ということで問題になりました
今ではGCC等のコンパイラレベルで対策がとられていて
コンパイル時にコンパイラが printf の書式を解析し,問題があれば警告やエラーを出すようになっています
Wikipediaにエントリがあったので,リンクを貼っておきます
http://en.wikipedia.org/wiki/Uncontrolled_format_string [wikipedia.org]
Re:printf (スコア:3, 参考になる)
いろいろ間違ってる。
まず、「printfにセキュリティーホール」というと、
「printfを正しく使っているのに(printfが仕様通りには動かず)問題が起こる」という意味になってしまうので違う。
「不適切にprintfを使うと(printfは仕様通りに動いていても)、セキュリティーホールとなってしまう」というのが問題。
よくよく言われる話だけど、printfは、ユーザが何かの方法で入力した値を格納しているuser_nameがあったとして、
printf(user_name);
というように、1つめの文字列が動的であるような用途は、設計上の想定外だから、やってはいけない。
この場合、ユーザ名を"%x%x%x%n"などとすると、
printf("%x%x%x%n");
とやったことになって、スタックの中身が見れた上で、%nによって値が値が書き換えられたりと、
(おそらく)プログラマが想定していない動作になる。つまり、セキュリティホール。
SQLインジェクションとかXSS脆弱性とかと同根。
printf("%s", user_name);
とすればこの問題は起こらないので、これが清く正しいprintfの使い方。第1引数はあくまで固定の文字列を渡す。
効率が気になるというなら、fputsを使うなど、他の出力方法を検討する。
GCC等のコンパイラレベルの対策というのは、printfの第1引数が上記のように変数などではなく、
"%d\n"のように固定の文字列の場合には、引数の数や型が、2個目以降の引数と整合性が取れているかどうか等をチェックしてくれるのみ。
コンパイル時に値が確定していない文字列は、コンパイラがチェックしようがない。危ないぞ、と警告を出すぐらいは出来るけど。
(もしくは、いろいろと解析した結果、固定の文字列を指す固定のポインタらしいと分かったときなどはチェックしてくれるかも知れない)
どうしても「ユーザが指定したフォーマットでデータを表示をする機能を付けたい」と言うような場合に、横着してprintfを使い、
printf(user_defined_format, x, y, z, a, b, c);
というようなコードにすると、これだけでは安全を保つことは出来ない。
リンク先にも、「the application must validate the format string before using it.」とあるように、
何らかの方法でuser_defined_formatの内容を確認しても、問題が無いことをチェックする必要がある。
(そのツールは悪意を持った入力が入り得ない場所でのみ使う、悪意を持たれても問題の無い用途にだけ使う、などでも可)
Re: (スコア:0)
おお、参考になります(日本語の情報が少なくて俺が知らなかっただけなのか...)
Re: (スコア:0)
動的にどーやってチェックするだろうね。