セキュアプログラミング
セキュアプログラミングとは、開発の段階で脆弱性を作りこまないようにすることです。
例えば、SQLインジェクションや、クロスサイトスクリプティング等の脆弱性は、
開発段階で意識することで減らすことが出来ます。
どの様にすれば、セキュアなプログラムが書けるのか?
答えを急ぎたくなるかもしれませんが、簡単に解決できるような問題ではなく、
開発チームでレビューを行ったり、個人が地道に学習していくしかありません。
様々攻撃やその防御法、プログラミングに置いてミスしやすいロジック等々書ききれないほどありますが、
今回はその中からバッファオーバーフローについて紹介いたします。
バッファオーバーフロー
バッファオーバーフロー攻撃というのがあります。
これは、メモリー上に用意したバッファに対して、その許容範囲を超えるような情報を与え、
悪意のあるプログラムを動かしたりする攻撃です。
この問題の解決手段としては、バッファを扱う時は、必ず範囲チェックを行う、
言語レベルでチェックしてくれる言語で開発を行う等があります。
ここで気を付けて欲しいのは、言語レベルでチェックできる場合でも、
開発者はどのように情報を扱っているか常に把握しておくことをお勧めいたします。
高級言語は、範囲チェックを自動で行えることが多いですが、
全ての高級言語がそうであるとは限らず、開発環境が変わった時に、思わぬバグを引き起こす時が有ります。
他にも、高速化などの理由でチェックの無効化を行う場合なども注意が必要です。
オーバーフロー
バッファオーバーフローに似ている言葉に、オーバーフローという言葉があります。
オーバーフローとは、処理系で扱える数値の範囲を超えたときに、桁が溢れることで演算結果が正しくない状態を意味します。
例として、8ビットで演算を行った場合「255 + 1」の結果は「256」とならずに「0」になります。
バッファオーバーフローは明らかに想定外の動作ですが、オーバーフローはバグというより、
演算結果の状況を意味しており、発生するごとに正しく処理する必要があります。
現在のPCに搭載されてCPUは、32ビット(最大約43億)以上で演算できるので単純なオーバーフローに遭遇することは減りました。
それでも、状況により発生するので注意してください。
32ビット以上だからオーバーフローはしないはずという思い込みもしない方がいいです。
ちなみに、似た言葉でアンダーフローという言葉もありますが、これは浮動小数点演算結果の指数部が
小さくなりすぎて、正しい数値表現が出来なくなることを言います。
8ビット演算で、「0 – 1」が「255」になることではありません。これは、(負の)オーバーフローです。
おわりに
最後に、オーバーフローが原因の面白い話をしたいと思います。
30年ぐらい昔ですが、Civilization(シヴィライゼーション)という、地球を舞台とした戦略シミュレーションゲームが有りました。
ゲーム中のインドの指導者にはガンジーが存在していて、実在のイメージにあわせて攻撃性が最低値に設定されています。
ここまではいいのですが、とある条件でさらに攻撃性がさがり・・・結果オーバーフローして、攻撃性が最大になることがあります。
こうなるとガンジーが突然核攻撃を仕掛けてくるというバグがありました。
これはこれで面白いということで、続編では核ガンジーとして仕様になっています。
この場合はゲームでよかった例ですが、実際のシステムではそうも言ってられません。
単純が故に発生するという側面もあるかもしれませんが、皆さんは気を付けてください。
- 当ページの人物画像はNIGAOE MAKERで作成しました。