CyberGlossary

脆弱性

書式文字列脆弱性

別称: printf 書式バグ

定義

printf 系関数の書式文字列に利用者由来の入力をそのまま渡してしまうことにより、任意のメモリ読み書きを許す欠陥。

書式文字列脆弱性は、開発者が printf("%s", user_input) ではなく printf(user_input) と書いた場合に発生します。%x はスタックメモリを漏えいさせ、%s は任意のポインタを参照、%n はそれまでに出力されたバイト数を指定アドレスに書き込み、結果として任意読み書きプリミティブが得られます。古典的な悪用対象は GOT/PLT エントリ、関数ポインタ、スタックカナリアです。最新のツールチェーンは警告(-Wformat-security、FORTIFY_SOURCE)を出し、多くの言語ではこのパターン自体が禁止されますが、レガシー C、組込みファームウェア、シェルでは今も登場します。防御は単純で、信頼できない入力を書式文字列として渡さず、fmtlib、Rust の println!、Go の fmt のように明示的な動詞を持つ型付きフォーマッタを使うことです。

  • CVE-2000-0573(wu-ftpd):site exec における書式文字列でリモート root 取得。
  • 攻撃者が操作可能なフィールドをそのまま syslog に渡してしまう組込みルーター。

関連用語