【しょしきもじれつこうげき】

書式文字列攻撃 とは?

💡 "%x" と叫んだだけで、金庫の中身が全部読み上げられた
📌 このページのポイント
書式文字列攻撃のしくみ 危険なコード printf(input) input = "%x %x %x" 0xDEAD 0xBEEF 0xC0FF 漏洩 漏洩 漏洩 安全なコード printf("%s", input) 書式文字として解釈しない 0xDEAD 0xBEEF 0xC0FF 漏洩なし
printf(input)は危険。printf("%s", input)が正しい書き方
ひよこ ひよこ

書式文字列攻撃って何をする攻撃なの?

ペンギン先生 ペンギン先生

printf(user_input) という書き方をしていると、攻撃者が「%x%x%x」のような書式文字を入力したとき、printfがスタックの値を勝手に読み出して表示してしまうんだよ。

ひよこ ひよこ

%x って何をするの?

ペンギン先生 ペンギン先生

printfは書式文字列の %x ごとにスタックから値を1つ取り出して16進数で表示するんだ。攻撃者がいくつも並べると、スタック上のアドレスや秘密の値をどんどん読み出せてしまうんだよ。

ひよこ ひよこ

%n というのも聞いたことがあるけど、それはどう使われるの?

ペンギン先生 ペンギン先生

%n は「これまでに出力した文字数を変数に書き込む」という特殊な書式文字だよ。スタック上のアドレスを指す位置に %n を来させると、攻撃者が指定したアドレスに任意の値を書き込む手段として使われていたんだ。

ひよこ ひよこ

修正するのは難しいの?

ペンギン先生 ペンギン先生

printf("%s", user_input) と一文字変えるだけで直るんだよ。こうするとuser_inputは書式文字列として解釈されず、ただの文字列として出力されるだけになる。静的解析ツールでも検出できるから、今は見つけやすいんだね。

ひよこ ひよこ

古い攻撃手法だけど、まだ現役なの?

ペンギン先生 ペンギン先生

C言語のコードが現役で動いている組み込みシステムや産業系ソフトウェアでは今でも見つかることがあるんだよ。CTF(セキュリティ競技)でも定番の問題として出続けているから、セキュリティを学ぶなら必ず押さえておきたい古典的なバグだね。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「書式文字列攻撃」って出てきたら「%x を使ってメモリを読み書きする古典的バグ」と思えればだいたいOK!
📖 おまけ:英語の意味
「Format String Attack」 = 書式文字列攻撃
💬 C言語のprintf()などが「書式文字列(format string)」を解釈する仕組みを悪用するため、この名前がついているんだよ。
← 用語集にもどる