昨日の記事が、アクセス数は普通だったけど、アクセスIP数が多かったので、今日もLinuxの話題(Linuxというカテゴリまで作ったぞ!)。
Linuxのバグフィックスに、結構、「バッファーオーバーフロー」っていう言葉が良く出てきませんか?このバッファーオーバーフロー、原因の多くは、
Cなど、メモリ領域を自分で確保する必要があるプログラムにおいて、
char fname[256]; // ファイル名を受け取るところ
int i,c;
for(i=0; c != EOF ; i ++)
{
c = getchar(); // コンソールからファイル名を受け取る
fname[i] = c;
}
fname[i] = 0;
みたいな
(って、いくらなんでも、ここまで、お馬鹿なプログラムはないよ!)
予想以上のデータが入ってきてしまったときに起きるのが普通。
で、ここで問題なのは、Linuxは、ソースが公開されているっていうこと。
バッファーオーバーフローが起きた場合、その部分を修正して、公開されるわけだ。
ということは、ソースコードを入手して
(公開されているからダウンロードして,
rpm -bp する)
そうすると、どこにバグがあったかが、わかる
(最終的にあてたパッチを調べてもいいし、直前のものとのdiffをとってもいい)
そうすると、どこにバグがあったかが分かる。
っていうことはだよ、
普通の業務開発なら、ここで横並びチェックをやっていて、同じようなバグは、修正してるよねえ。。。
でも、でも、でも、Linuxって、コミュニティが開発してるわけよ!
コミュニティの間で、横並びチェックができるのかあ???(^^;)
ってことはあ。。。。
他のハッカーの人は、違うコミュニティで、同じようなバグがでてないか?
って、すぐに調べられるよね
だって、ハッカー君は、
・他のコミュニティが作ったもののソースをrpm -bpして、
・そのソースで、似たようなバグ
(バッファーオーバーフローの場合、似たようなところでバグを起こす)が
あるかどうか、ソースをgrepしてみることができる。
似たような、ソースがあったら、どーする??このハッカー君は!
でも、ある可能性は、否定できないわけよ。その理由は後で書くけど。
さらに、これ以外の話でも、ハッカー君有利なことがある。
ソースが公開されているので、
デバッグ情報つきになるようにMakefileを書き換えて、
rpm -bbして、
gdbで動かせば、
バグで落ちたとき、どのモジュールで落ちたかわかるわけ。
つまり、バグとその理由を発見しやすいわけね。
コミュニティが修正する場合は、
・この理由を見つけた後に、
・修正して、
・みんなに配らないといけないけど、
ハッカー君の場合は、そこから悪さできる方法を知っていたら、あとは、もう、すぐ、悪さできちゃうわけよ。どー考えても、ハッカー君のほうが、悪さしやすいわけよね。
この勝負、ハッカー君のほうが、有利なわけよ。
じゃあ、こういうことをやらせないようにすればいいわけ。
その方法としては、
・バッファーオーバーフローにさせない
・バッファーオーバーフローになったら、
シグナルをあげて、
シグナルが上がったら、
適切な処理を行うとか、
とにかく、Segmentation Faultでいきなり死なないようにする
とかが、考えられる。でも、どちらもいまの、コミュニティに頼るCVSによる開発方法では、限度があるのよ。
っていうのは、バッファーオーバーフローになるのの多くは、勝手にプログラマが領域を切っちゃうことが多いため。
例えば char fname[256]とか、char URLname[1024]とか、最大と思う領域を勝手にきめていれてしまうため。
なぜ、そんなことが起きるか?というと、
一般の業務開発では、こういう固定値は、管理する人がいて、
その人がAccessとかExcelで管理して、
CやJavaのソースコードをそこから自動生成して、
みんなに配布する
っていうルートができてますよね。
でも、Linuxの場合、
URLのパスの最大値って、そもそも、あるのかどうかわからないし、
仮にあったとしたら、どのヘッダーファイルに入っているかしってる??
ファイルの長さの最大値、MAXFILELENが、Linuxでどのヘッダーファイルに定義されてるか?
「MAXFILELEN Linux ヘッダーファイル」でぐぐってみても、見つかんないってでてくるのよ。
わかんない=めんどくさい、
自分で勝手にきっちゃえー!ってなる。
でも、そうすると、その文字以上、ハッカー君が入力しちゃうと、Segmantation Fault!
(バッファーオーバーフロー)
でも、かりにバッファーオーバーフローになったとしても、エラー処理がしっかりしていて、カーネルから、そういうシグナルで「落ちる」という信号をひろったら、処理を終了して、きれいに抜けるような処理がかかれていればOKだけど、
Linuxにおける標準的なエラー信号の拾い方、ひろった後の処理の仕方
って、だれが決めるの(どこのコミュニティの人がきめるわけ?)
そして、決まったことが守られてるって、だれが確認するの?
ふつうの開発なら、アーキテクチャを考える人がやるけど、
Linuxの場合、???
つまり、Linuxの場合
・コミュニティ内での開発情報は、メーリングリストなどで盛んに流れるが
・コミュニティを超えて、開発情報、バグ情報、コーディングスタイルの情報が流れない?
・コミュニティを超えて、それらの情報を管理、監査、勧告する団体がはっきりしない?
→ないのかも?あっても、仕事してないのかも?
・それらの管理をディストリビューターにやれといわれてもねえ??
っていう感じだと思う。
なんで、そこにハッカー君がつけこんで、あるコミュニティが作成したソフトのバグが、他のコミュニティのソフトで起きないか?などと、横並びチェックをされた日にゃー、ハッカー君有利!になると思う。