アカウント名:
パスワード:
int xxx_func(...){ char *str; str = (char *)malloc(sizeof(char) * x); (strに文字が入る処理) printf(str); return ret;}
printf("%s",str);
でも、実際、そう習った覚えがあります。 理由は、今回のように、ちゃんと把握して使用しないと、 色々と想定外の制限や誤動作に悩まされるから。
あと、 リンクするライブラリが巨大で、実行モジュールが大きくなる ってのも言われました。
むかしは、メモリモデルって言って…(ry
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
人生の大半の問題はスルー力で解決する -- スルー力研究専門家
よくやっちゃうんだよね (スコア:5, 参考になる)
# printf Injectionとでも言うのだろうか
M-FalconSky (暑いか寒い)
Re:よくやっちゃうんだよね (スコア:5, おもしろおかしい)
# 晒しなのでACなM-FalconSky
Re:よくやっちゃうんだよね (スコア:3, 参考になる)
一般的には、format string bug とか、format string vulnerability とか
呼ばれてます。
"vulnerability" なのは、場合によっちゃ攻撃可能だから。
携帯電話でどうなのかはよくわかりませんが。
参考: http://www.acm.uiuc.edu/sigmil/talks/general_exploitation/format_strings/
Re:よくやっちゃうんだよね (スコア:0)
それができたらある意味うれしい。
Re:よくやっちゃうんだよね (スコア:3, 参考になる)
SH902iのメール件名に「%」が入っていると異常動作 [itmedia.co.jp]を真っ先に思い出しました。
カシオ日立モバイルコミュニケーションズはW42CA・W42Hから
KCP [itmedia.co.jp]に切り替えたようで、
今回のバグはBREW化されたメーラーが臭いですね。
Re:よくやっちゃうんだよね (スコア:2, 参考になる)
%S=%lsで、ふつーの%sがchar*を期待するのに対して、%Sはwchar_t*だ。なんで%sは大丈夫なんだろう。%Sはマイナーだから対策を忘れてたのかな。
%nもあんまり使わないから忘れてたのかな。
Re:よくやっちゃうんだよね (スコア:0)
Re:よくやっちゃうんだよね (スコア:1)
# ずいぶん昔にCから足を洗った(ということになっている)のでtuneo。
Re:よくやっちゃうんだよね (スコア:1)
例で上げたのは、%系一般で問題を起すだけです。
# やたら+モデもらっちゃって悪い気がする。
あと、最近NetBSDのカーネル周りを見ているんですが、
コンパイル時に引数の数と型をチェックできてるんですよね。
これコンパイラのオプションだろうか。
# フォーマットはstaticな文字列だけ+型チェック+引数の数チェックでだいぶマシ
# でもカーネル内の関数なので使えるフォーマットはとても少い...
# そしてprintf家系は最終的にvsnprintfに到達していました。
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」は影響ナシです。ふしぎふしぎ。
printf, scanf は使うな! (スコア:0)
でも、実際、そう習った覚えがあります。
理由は、今回のように、ちゃんと把握して使用しないと、
色々と想定外の制限や誤動作に悩まされるから。
あと、
リンクするライブラリが巨大で、実行モジュールが大きくなる
ってのも言われました。
むかしは、メモリモデルって言って…(ry
Re:よくやっちゃうんだよね (スコア:0)
Re:よくやっちゃうんだよね (スコア:2, すばらしい洞察)
理解したつもりで使わない奴はただの馬鹿
Re:よくやっちゃうんだよね (スコア:0)
Re:よくやっちゃうんだよね (スコア:0)
理解しきれずバグが埋め込まれるので、それを大馬鹿とは言えますまい。
バグというのは、よく理解しきれない部分が、いつでも誰にでもある、
だが解ってるつもりだから仕事にしている状況で発生するものでしょう。
容易にわかるバグを放置して出荷なら、その会社は大馬鹿でしょうが。
Re:よくやっちゃうんだよね (スコア:0)
ここはツッコミを入れていい所?
Re:よくやっちゃうんだよね (スコア:0)
>ここはツッコミを入れていい所?
パクッってきて自分のものとにするという示唆があるのですよ多分。
Re:よくやっちゃうんだよね (スコア:0)
素人が作ってんだから当然でしょ。
だから辞めた。
Re:よくやっちゃうんだよね (スコア:-2, よけいなもの) (スコア:1, おもしろおかしい)
とか言って欲しいか?
Re:よくやっちゃうんだよね (スコア:-3, よけいなもの) (スコア:0)
>とか言って欲しいか?
いいや。
だって『元』関係者だもの。今はもう関係者じゃない。幸いなことに。
現関係者だったら、今頃スラドを読んでる暇なんてなくなってるって。
Re:よくやっちゃうんだよね (スコア:-2, よけいなもの) (スコア:0)
みんなprintf()だっていってるけど (スコア:0)
ケータイ開発はしたことがないけど、標準出力がディスプレイに行くように設計しないとじゃない?
# snprintf()は第2引数で揉めたことのあるAC
## Windowsのは_snprintf()だ!
BREWでの文字列の扱い (スコア:2, 興味深い)
http://plusd.itmedia.co.jp/mobile/0311/14/n_bapp.html [itmedia.co.jp]
をみると画面描画文字列はラップされているが、
デバッグ用関数がprintfっぽい。
ということでログ出力用のprintfの不具合くさいかな。
もしデバッグ用ログでリセットなら最悪ですな。まさにミイラ取りがミイラ。
Re:BREWでの文字列の扱い (スコア:0)
デバッグ用にビルドしないと DBGPRINTF は空文字に置き換えられるんだし。
どこかで 素の sprintf につながってたとか。最近の組込みは標準ライブラリの大半が使えること多いですからね。少なくとも BREW のアプリなら普通は ADS だから使ますね。
Re:みんなprintf()だっていってるけど (スコア:0)
# 空気読もうよ
ともかくケータイの開発ってコードレビューできないほど忙しいんでしょうね (スコア:0)
でも、
printf(str);
で、文字列を表示したくなるのはともかく
snprintf(buf, size, str);
って、文字列コピーにsnprintf()を使うのって、結構気持ち悪くない?(人それぞれかな)
それともディスプレイ出力関数の引数が可変長で第1引数あたりが、書式文字列だったりするのかな?
# そもそもprintf()を使ったHello Worldがいまいちだと思っているAC
Re:ともかくケータイの開発ってコードレビューできないほど忙しいんでしょうね (スコア:0)
>でも、
からsnprintf()に話が繋がるのかはわからないんだけど・・・
とりあえず、snprintf()使うよりはsprintf()にしたいかな。
どうしても出力文字数の調整が必要なら書式指定子とかで調整するんで。
print関数やstr関数で、なるべくならn付き関数は使いたくないチキンです。ハイ
Re:ともかくケータイの開発ってコードレビューできないほど忙しいんでしょうね (スコア:0)
# 戻り値チェックさせてNGなら異常系に落とすのも強制
# 当然、snprintf()が正しく実装されていることも確認
だって、コードレビューのときにバッファサイズと書式文字列を確認するの面倒なんだもの。
# 自分本位のひどいリーダだと思うのでAC