アカウント名:
パスワード:
int xxx_func(...){ char *str; str = (char *)malloc(sizeof(char) * x); (strに文字が入る処理) printf(str); return ret;}
printf("%s",str);
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
物事のやり方は一つではない -- Perlな人
よくやっちゃうんだよね (スコア:5, 参考になる)
# printf Injectionとでも言うのだろうか
M-FalconSky (暑いか寒い)
Re:よくやっちゃうんだよね (スコア:0)
さっそく%nで自分の携帯が再起動することを確認しつつ
すぐに%dとか%sとかのprintfな識別子を試したんですが
こっちはまったく問題ありませんでした。
うーん、謎。どういうサニタイジングしてるんだろ?
サニタイズ?? (スコア:1, 参考になる)
format string脆弱性はどんな文字列でも発動するわけじゃないんだって。
「%n」はスタックに書き込む機能だから攻撃に使われる。
ちなみに、対策が「%をサニタイズすること」とか
「%をエスケープすること」ってのは大間違いなので
勘違いしないように。
正しくは sprintf(var) を sprintf("%s", var) にすること。
参考:JPCERT/CCの判断力も蝕む サニタイズ脳の恐怖 [takagi-hiromitsu.jp]
Re:サニタイズ?? (スコア:1)
s/sprintf/printf/g
だね。
書式化文字列出力が要らんのなら、遅いprintfなんかではなくputs()あたりでstdoutに吐けば良いじゃんとか思いもするけど。
# 今一歩セキュアでないというのはご愛嬌。
Re:サニタイズ?? (スコア:1)
きっちりサニタイズできているとしても、その方がいい理由ってあるのでしょうか。
(全部の%を%%にするだけじゃだめなの?)
# まあ、高木浩光氏の言う通り
# > さらに言えば、フォーマット文字列引数(printfなどの第一引数)には常に定数文字列しか与えないようにするのが正しい。
# のようにしてたら、こんなことが起こりようがないとは思いますが、
# とにかく納期優先で、そんなこと気にしてる暇もなかったのかなぁ……
1を聞いて0を知れ!
Re:サニタイズ?? (スコア:0)
サニタイズ言いたいだけちゃうんかと。
Re:よくやっちゃうんだよね (スコア:0)
あと、このふたつは直接ポインタを参照するからふっとぶんじゃなかろか。ポインタでミスると即リセットとは、DOS時代のようだ。
Re:よくやっちゃうんだよね (スコア:0)
いや、だから「どういうサニタイジングしてるんだろう?」と。
個別にサニタイジングするより「%」をエスケープしたほうが手っ取り早い上に確実だと思うのだけど…。
>あと、このふたつは直接ポインタを参照するからふっとぶんじゃなかろか。
「%S」と同意味のはずの「%ls」は影響ナシです。ふしぎふしぎ。