ハッカーが利用するフォーマットストリング攻撃とは。書式の落とし穴からシステムが乗っ取られるまで
ペネトレーションテスト&バグバウンティ
C言語のプログラムでは「×××を画面に表示してね」と命令するときに、printf()や、scanf()といった関数を使いますね。
でも、その使い方をちょっと間違えると・・・
なんとメモリの中身をのぞかれたり、書き換えられたりしてしまうのです。
※イメージです。
フォーマットストリング攻撃とは
C言語で、printf(buf);のようにユーザー入力をそのまま書式関数に渡すと、攻撃者に「フォーマット指定子(例:%x, %n)」を使わせてしまい、任意のメモリ操作が可能になる脆弱性です。
フォーマット指定子とは
%x:16進数で表示(スタックの中身を読める)
%s:文字列として読み取る(アドレスを辿る)
%n:書き込む(指定のアドレスにバイト数を書き込む)
発生原因として
・printf("%s", buf); は安全(指定子が固定されている)
・printf(buf); は危険(入力内容によって動作が変わる)
危険なコード例(C言語)
char buf[100];
scanf("%s", buf);
printf(buf); // ←ここが脆弱!
攻撃者が %x%x%x%x などを入力することで、
スタック上の値を読み取れたり、書き換えたりできます。
実際の攻撃例
1.情報漏洩
・%xや%sを使い、スタックからパスワードやカナリア値を読み取る。
2.任意書き込み
・%nを使って、特定のアドレスに任意の値を書き込む。
・システム関数のアドレスを上書きしてシェルを起動する例も。
エクスプロイト手法の流れ
1.書き込み先アドレスのリーク
2.%nの位置を調整(オフセット把握)
3.フォーマット指定子でバイト数を制御
4.printfで任意アドレスに任意値を書き込み
開発者が取るべき対策
・常に printf("%s", buf) のように書式指定子を明示する
・C言語のセキュリティを高めるために使われる「コンパイラの設定オプション」である、-Wformat-securityや、-D_FORTIFY_SOURCE=2 を有効にする
ハッカーが利用するフォーマットストリング攻撃とは。書式の落とし穴からシステムが乗っ取られるまでのまとめ
フォーマットストリング攻撃は、C言語の printf() などの書式付き出力関数に、ユーザーの入力をそのまま渡してしまうことで起きる脆弱性です。たとえば printf(buf); のように使うと、攻撃者は %x や %n などの「フォーマット指定子」を入力に含めることで、メモリの中身を読み取ったり、書き換えたりできるようになります。これにより、パスワードや機密データの漏洩、最悪の場合は任意のコード実行につながることもあります。対策としては、常に printf("%s", buf); のように書式を明示し、セキュアなプログラミングを心がけることが重要です。
安全な出力はセキュリティの第一歩です。