printf(str)のstrにユーザ入力値を指定してはいけない

昔の自分に心当たりがあったのでメモ。
Wikipedia:書式文字列攻撃

脆弱性の例

C言語で文字列strを表示したいとき、うっかり

printf(str);
と書きそうになるが、
printf("%s", str);
と書かなければいけない。

前者はstrに%xなどの書式トークンを含めると、メモリの内容を不正に読み出し・書き込みができてしまうため、セキュリティの脆弱性になる。

対策

前述した通り、書式文字列に文字列変数を指定しないようにする。
実際には「ユーザがstrの内容をどの程度コントロールできるか」にもよるのだが、あえてリスクを犯す必要はないので。

また、-Wallなどのコンパイラオプションを使う。
大抵のコンパイラは警告を出してくれるそうなので、素直に従って修正すればよい。

所感

セキュリティについて意識するようになった頃は、既にC言語を書く頻度が減ってたから意識したことがなかった。
初心者の頃は「あれ?どっち書いても同じかな?」と思ったりもするけど、全然違うので気をつけましょう。

関連記事


  1. Spring Security + ThymeleafでAjaxリクエストにCSRF対策トークンを適用
  2. 一部のパスだけSpring SecurityのCSRF対策を無効化する
  3. SRIによってCDN上のスクリプト改ざんを検知する
  4. OpenSSL+パスワードでファイルの暗号化/復号処理
  5. TrueCryptのレビューレポートを読んでみた
  6. Google ChromeのSSL/TLS暗号化アルゴリズム設定
  7. 2013年 クレジットカード情報流出事件

tosi avatar
tosi
Web Application Engineer, Java / Spring / Azure / GCP
comments powered by Disqus