第5回 バッファオーバーフロー攻撃
略してBOF。...って一般的なんかの。
3文字略語はあまり好きでない水神です。
この本は図解で説明してますが、水神は文章しか書けないので文章で書いときます。
古き良き時代。
C言語(C++はまだない。)がまだ一般的だった頃。
バグはプログラマの責任であった。
バッファオーバーフローなんて起こすプログラム書く方が悪い。
というか、そんなやつプログラマなんて名乗る資格ない。
そんな雰囲気すらあった時代。
それまでのマシン語(アセンブラ)に比べて極めて書きやすいので、
高級言語(死語)と言われたくらい。
で、何が言いたいかというと、アセンブラの精神をひきずっとるのです。
C言語は。(C++も。)
なので、メモリアクセスし放題。
自爆も容易です。
C言語はメモリ領域を明示的に確保することが可能です。
例えば100バイト。
データ用のメモリもプログラム用のメモリも同じものを使ってます。
では、この確保した領域を超えるデータを入れたらどうなるか。
例えば200バイト。
100バイトははみ出ます。C言語は気にしません。プログラマが悪いのですから。
で、はみ出した分が、運悪くプログラム領域まで食い込むと、プログラムが破壊されます。
通常はそこで、core(メモリダンプ)吐いてとまります。(unix系。)
windowsはどうなんかの。メモリリークしそうだけど。
まあ、止まるだけならよいのです。まだましです。
プログラム領域までデータで上書きできるということは、
データにプログラム埋め込んでおけば、別なプログラムに置き換えることが可能です。
そのプログラムは当然ハッキングに都合のよい、プログラム。
で、めでたく置き換わったら、ハッキングし放題。
これがバッファオーバーフローです。
C++もメモリいじり放題なので、同じ問題があります。
多少Cよりはましんなっているようですが、それもプログラマ次第でしょう。
ちなみにJavaはプログラマからメモリいじり権限を奪った言語なので、起こりにくいです。
それでもまだCやC++は使われています。
古いプログラムがまだ現役というのもありますが、Javaやインタプリタ系の言語(perl,php等々)
に比べて格段に自由度が高く、なんと言っても速いのです。実行速度が。
というわけで、まだまだこの問題はなくならない。
さて、バッファオーバーフロー対策は。というと。
この本(翔泳社)にはいろいろ書いてありますが、IDSで検知とか。
なんと言っても、パッチ当てです。
バグ取り(パッチ当て)が確実かつ唯一の対応方法。
ファイアウォールだとか、IDSだとか、そんなんやるくらいなら、サービス止めとくのだ。
バグのないソフトに乗り換えるのだ。
メールサーバもsendmailではなく、qmailに変えればそれだけで安全性は高まる。
...というのは言い過ぎか?比喩としては分かってもらえると思うのだが。
しかし、この試験どこまで実務に添ってるんだろう。
ちと不安になってきた。
理論だけで設問と解答作られたら、実務者は落とされるな。きっと。
略してBOF。...って一般的なんかの。
3文字略語はあまり好きでない水神です。
この本は図解で説明してますが、水神は文章しか書けないので文章で書いときます。
古き良き時代。
C言語(C++はまだない。)がまだ一般的だった頃。
バグはプログラマの責任であった。
バッファオーバーフローなんて起こすプログラム書く方が悪い。
というか、そんなやつプログラマなんて名乗る資格ない。
そんな雰囲気すらあった時代。
それまでのマシン語(アセンブラ)に比べて極めて書きやすいので、
高級言語(死語)と言われたくらい。
で、何が言いたいかというと、アセンブラの精神をひきずっとるのです。
C言語は。(C++も。)
なので、メモリアクセスし放題。
自爆も容易です。
C言語はメモリ領域を明示的に確保することが可能です。
例えば100バイト。
データ用のメモリもプログラム用のメモリも同じものを使ってます。
では、この確保した領域を超えるデータを入れたらどうなるか。
例えば200バイト。
100バイトははみ出ます。C言語は気にしません。プログラマが悪いのですから。
で、はみ出した分が、運悪くプログラム領域まで食い込むと、プログラムが破壊されます。
通常はそこで、core(メモリダンプ)吐いてとまります。(unix系。)
windowsはどうなんかの。メモリリークしそうだけど。
まあ、止まるだけならよいのです。まだましです。
プログラム領域までデータで上書きできるということは、
データにプログラム埋め込んでおけば、別なプログラムに置き換えることが可能です。
そのプログラムは当然ハッキングに都合のよい、プログラム。
で、めでたく置き換わったら、ハッキングし放題。
これがバッファオーバーフローです。
C++もメモリいじり放題なので、同じ問題があります。
多少Cよりはましんなっているようですが、それもプログラマ次第でしょう。
ちなみにJavaはプログラマからメモリいじり権限を奪った言語なので、起こりにくいです。
それでもまだCやC++は使われています。
古いプログラムがまだ現役というのもありますが、Javaやインタプリタ系の言語(perl,php等々)
に比べて格段に自由度が高く、なんと言っても速いのです。実行速度が。
というわけで、まだまだこの問題はなくならない。
さて、バッファオーバーフロー対策は。というと。
この本(翔泳社)にはいろいろ書いてありますが、IDSで検知とか。
なんと言っても、パッチ当てです。
バグ取り(パッチ当て)が確実かつ唯一の対応方法。
ファイアウォールだとか、IDSだとか、そんなんやるくらいなら、サービス止めとくのだ。
バグのないソフトに乗り換えるのだ。
メールサーバもsendmailではなく、qmailに変えればそれだけで安全性は高まる。
...というのは言い過ぎか?比喩としては分かってもらえると思うのだが。
しかし、この試験どこまで実務に添ってるんだろう。
ちと不安になってきた。
理論だけで設問と解答作られたら、実務者は落とされるな。きっと。