printf(str)のstrにユーザ入力値を指定してはいけない
昔の自分に心当たりがあったのでメモ。
Wikipedia:書式文字列攻撃
脆弱性の例
C言語で文字列strを表示したいとき、うっかり
printf(str);
printf("%s", str);
前者はstrに%xなどの書式トークンを含めると、メモリの内容を不正に読み出し・書き込みができてしまうため、セキュリティの脆弱性になる。
対策
前述した通り、書式文字列に文字列変数を指定しないようにする。
実際には「ユーザがstrの内容をどの程度コントロールできるか」にもよるのだが、あえてリスクを犯す必要はないので。
また、-Wallなどのコンパイラオプションを使う。
大抵のコンパイラは警告を出してくれるそうなので、素直に従って修正すればよい。
所感
セキュリティについて意識するようになった頃は、既にC言語を書く頻度が減ってたから意識したことがなかった。
初心者の頃は「あれ?どっち書いても同じかな?」と思ったりもするけど、全然違うので気をつけましょう。