脆弱性
書式文字列脆弱性
別称: 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 に渡してしまう組込みルーター。
関連用語
メモリ破壊
プログラムが意図したメモリ境界の外に書き込み、型安全性・制御フロー・データ整合性を損なうタイプの脆弱性を総称する用語。
Secure Coding
Secure Coding — definition coming soon.
バッファオーバーフロー
メモリ安全性の欠陥で、確保済みバッファの末尾を超えて書き込みが行われ、隣接メモリが破壊されてしばしばコード実行を可能にする。
脆弱性
システム、アプリケーション、または運用プロセスに存在する弱点で、攻撃者が機密性・完全性・可用性を侵害するために悪用できるもの。
エクスプロイト
脆弱性を悪用して、コード実行・権限昇格・情報漏えいなど意図しない動作を引き起こすコード、データ、または手法。
SAST(静的アプリケーションセキュリティテスト)
ソースコード・バイトコード・バイナリを実行せずに自動解析し、インジェクションや安全でない API、弱い暗号などのセキュリティ欠陥を検出する手法。