【しょしきもじれつこうげき】
書式文字列攻撃 とは?
最終更新:
💡 表示するはずの入力が、書式の指示として解釈される
信頼できない入力をprintfなどの書式文字列として解釈させ、メモリの情報漏えい・書き換えやクラッシュなどを起こす攻撃。起きる結果は実装と実行環境にも依存する。
📌 このページのポイント
書式文字列攻撃って、何が問題なの?
例えば printf(input) のinputを外部から指定できると、入力に含まれる書式指定が解釈されるよ。本来は表示したいデータなのに、関数への指示として扱われるのが問題。条件によって、情報漏えいやメモリの書き換え、クラッシュなどにつながるんだ
%xや%sは何をするの?
%nは何が違うの?
%nは表示するための指定ではなく、それまでに出力した文字数を、対応するポインターが指す整数へ書き込む指定だよ。信頼できない書式を解釈すると、書き込みにつながる場合がある。ただ入力に%nを含めれば、どの環境でも好きな場所へ好きな値を書けるという意味ではないんだ
どう修正するの?
printfだけを探せばいいの?
fprintfや、POSIXのsyslogなど、書式を解釈する他の関数も確認しよう。入力から組み立てたメッセージを、後で再び書式として渡す経路にも注意が必要だよ。コンパイラーの警告や静的解析も役立つけれど、見つかる範囲は設定や道具に左右されるんだ
📖 おまけ:英語の意味
「Format String Attack」 = 書式文字列攻撃
💬 C言語のprintf()などが「書式文字列(format string)」を解釈する仕組みを悪用するため、この名前がついているんだよ。