アカウント名:
パスワード:
char buf[BUFSIZE]; . . .
} Q.何年も前からわかっていながら、なぜ対処しないのですか。 A.このようなコードを書いてある本が存在するからという説と わざと入れているという説があります。 Q.信じられません。自分のプログラムに穴をあけるなんて。 A.一部のプログラマーは、これを指摘すると「仕様です」というので 間違いありません。意図的にやっているのです。 Q.彼らの目的は何なのです
こういういいかげんな対応がバッファオーバーフローの元だという事に、たいがいで気付きましょう。 バッファから溢れた部分を切り捨てる場合でも、内部の処理によっては不正なコードの実行を許す温床と成り得ます。
「バッファが溢れる」という事象が確認できるのは、実際にデータを取って来てたり、データをコピーするというかなり下位の部分でしょ。 だけど、その対応はもっと上位の部分でたとえばセッション丸ごと捨てるとか、
失敗したようですね。 って言うかもうバグ治った? Slashcodeはサブジェクトが長すぎる場合、「溢れたら捨てる」という方法を無思慮に行っているの
そこら中に char buf[1024] などというコードが散乱していることが多い、というのが現状ではないでしょうか。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
皆さんもソースを読むときに、行と行の間を読むような気持ちで見てほしい -- あるハッカー
質問形式でお送りします (スコア:3, おもしろおかしい)
A.不定長のデーターに対して下のようなコードを書くからです。
void func()
{
}
Q.何年も前からわかっていながら、なぜ対処しないのですか。
A.このようなコードを書いてある本が存在するからという説と
わざと入れているという説があります。
Q.信じられません。自分のプログラムに穴をあけるなんて。
A.一部のプログラマーは、これを指摘すると「仕様です」というので
間違いありません。意図的にやっているのです。
Q.彼らの目的は何なのです
Re:質問形式でお送りします (スコア:3, すばらしい洞察)
このQAは表面しか見ていません。BUFSIZEを定義していることが、バッファーオーバーフローに直結するわけではありません。
問題はBUFSIZEを限界チェックをしていなことです。限界チェックをしないのなら、#defineする必要もないはずです。
BUFSIZEという形式だけを見て、その目的まで覚えなかった、学習者のミスです。
Re:質問形式でお送りします (スコア:3, おもしろおかしい)
A.サイズをチェックするのは、みんな気がついている思います。問題はその後です
Q.scanfを使うなとか fgets(buf,BUFSIZE,fp)ですか
A.それほど簡単な問題ではありません。bufに収まらなかった時の処理が必要です。
Q.それはどんなものがありますか
A.
1.切り捨てる
2.さらに大きなバッフアーを確保する
3.ループで順次処理する
1の切り捨てるのは乱暴なようですが、背に腹は代えられません。
2の方法はmallocを使って確保したバッフアーならreallocできます。
3の方法はプログラムがかなり複雑になります。本質ではない部分に多くの力を注がねばなりません。
Q.1はかっこ悪いし2は使えないし3は大変です。ほかに方法はありませんか
A.気づかなかったふりをして、チェックしないという方法をとる人もいます。
Q.最低ですね
A.世渡り上手と言ってください
Re:質問形式でお送りします (スコア:0)
ネタにマジレスするのは、礼儀です。
Q.ではどうしたらいいんでしょう?
A.パフォーマンスが落ちるからという理由で、たまたま知っているルーチンで処理をおこなうのがいけないのです。じっくり読み込んでいけば、バッファーオ
Re:質問形式でお送りします (スコア:0)
A.たとえば最初の例だとbuf[2][BUFSIZE]というようにバッフアーを二つとります。
そして、データを奇数バッフアー、偶数バッフアーの交互に読み取ります。
Q.なぜそんな面倒なことをするのですが
A.BUFSIZEで切断されたデーターの前後をみたいからです。たとえば2バイト文字コードのとか。分断されたキーワードとかです。圧縮されたデーターなどでは11bitとかの半端なビット長がまたがっていることもあります。
Q.文字列処理ばりばりのコンパイラならいざしらず、滅多にないようなデーターに対して、おおがかりすぎませんか。
A.そ
Re:質問形式でお送りします (スコア:0)
>A.なら、BUFSIZEを超えたデーターは捨てましょう。たいしたものではないんでしょう。
こういういいかげんな対応がバッファオーバーフローの元だという事に、たいがいで気付きましょう。
バッファから溢れた部分を切り捨てる場合でも、内部の処理によっては不正なコードの実行を許す温床と成り得ます。
Re:質問形式でお送りします (スコア:1, 参考になる)
たとえば組み込み機器で考えると、携帯PDA端末なんかであれば以下のような攻撃が予想されます
1.ping of deathのような場合
巨大なパケットを意図して送ってきてますから返事を返さなくていいです。
2.mp3プレイヤーなどで曲名に異様に長い曲名が入っている場合。
十分な長さが確保できていれば、曲名が途中で切れていても文句は出ないでしょう。
3.WEBブラウザーでhttpヘッダーがとんでもなく長い場合
捨てたデーターの中に大事なものがあるかもしれません。
プログラムを中断して「このページは表示できません」というエラーを出すべきでしょう。
必死にがんばって何が何でも処理することがよいこととは限らないです。
要は「たとえ死んでも悪の手先にはならない。」ということでは。
Re:質問形式でお送りします(溢れたら捨ててしまいまし (スコア:0)
・・・切れなかったらどうしよう・・・
↓切られる前のタイトル
Re:質問形式でお送りします(溢れたら捨ててしまいましょうよ。どうせたいした物じゃないんだし
明示的に「溢れたら捨てる」のはいい加減でも何でもないですよ。
Re:質問形式でお送りします (スコア:0)
「バッファが溢れる」という事象が確認できるのは、実際にデータを取って来てたり、データをコピーするというかなり下位の部分でしょ。
だけど、その対応はもっと上位の部分でたとえばセッション丸ごと捨てるとか、
Re:質問形式でお送りします (スコア:0)
Re: 質問形式でお送りします(溢れたら捨ててしまいま (スコア:0)
失敗したようですね。
って言うかもうバグ治った?
Slashcodeはサブジェクトが長すぎる場合、「溢れたら捨てる」という方法を無思慮に行っているの
本日のつぼ (スコア:0)
# とACに対するマイナスモデが無効な例を出してみる
Re:質問形式でお送りします (スコア:1)
(´д`;)
Re:質問形式でお送りします (スコア:0)
え?そんな人にCode書かせていいの?
Re:質問形式でお送りします (スコア:1)
まあでも入門書とかもあまり良いのがないような気がするな。
# バッファ長を考慮しない gets() や sprintf() がある
# というのも問題といえば問題かな?
(´д`;)
Re:質問形式でお送りします (スコア:0)
素直にポインタだけにしておけば自分で管理しなきゃならんって気がつくだろうに、あんな配列なんてBASICだのCOBOLだのから流れてきたやつはみんなしくじるよ。
Re:質問形式でお送りします (スコア:1)
#次はギガ単位でmallocしてNULL検査しない奴が増えそう。。。
wild wild computing
Re:質問形式でお送りします (スコア:0)
世の中のホールの半分くらいは、無知が原因なのではなくて
うっかりミスが原因でしょう。
自動的に strict な境界チェックするようなライブラリを
用意しない限り、この手の穴は防げません。
Re:質問形式でお送りします (スコア:0)
Re:質問形式でお送りします (スコア:0)
それはとらえ方が違うんじゃないか?
char buf[1024]
と
#define BUFSIZE 1024
char buf[BUFSIZE]
では大きく違うぞ。
前者は仕様変更があった場合に穴になりやすかろう。
(まさか違いがわからんとか言わないだろうな)
気安く動的確保すんな(喝 (スコア:1)
もともとメモリが少ない上に仮想メモリが存在しないんで、
ちょっとしたフラグメンテーションがすぐ動作不安定につながる。
こんな環境では、ヒープをスタック気味に使っていけるような
設計にせなあかん。
確保したメモリをいつでも再配置できるような設計にしてもいい
けど、こんなバイオレンスな設計が必要なほどデンジャラスな
仕事はハナから手をつけずに蹴り返すが吉。
大抵のゲームはリアルタイム性が要求されますからねぇ。
しかも、マルチプロセスの上にバックグラウンドでDMAが飛び交って
いるような最近の環境でそれやらかすのは自殺行為。
# ACなのでAC
Re:質問形式でお送りします (スコア:0)
不勉強なもので知らないが,Pascal系(またはALGOL系,または
Wirth系)の処理系は自動チェックのオプションがついている
ものが多い. これは言語仕様で規定されているのでは無い
Re:質問形式でお送りします (スコア:1)
BASIC とか。(Subject out of range エラーだったっけ?)