そもそもバッファとは
バッファの元々の意味は「緩衝」です。バッファオーバーフローのバッファとは「バッファメモリ」のことを指し、一時的にデータを保管しておく領域のことです。
プログラムがもつ領域は実行命令が格納されているコード領域、プログラムの戻り先などプログラム実行のための一時的な情報が格納されているスタック領域、計算や操作のためのデータを格納するヒープ領域の3つにわかれます。このうち、スタックとヒープを合わせた領域をバッファと言います。
バッファオーバーフローとは
CやC++などで作成されたプログラムにおいて、バッファの許容量を超えてデータが入力されることでメモリ領域が溢れてしまうバグのことです。
バッファオーバーフローによる攻撃を受けると、実行中のプログラムが強制停止させられたり、悪意のあるコードが実行されDoS攻撃の踏み台にされたり、管理者権限が乗っ取られたりといった被害を受ける可能性があります。
■ Dos攻撃との違い
大量にデータを送りつける攻撃として、DoS攻撃があります。
それぞれの違いを簡単にいうと、「バッファオーバーフロー」はコンピューターの内部への攻撃に利用され「DoS」は外部から過剰に負荷を与える攻撃です。
「バッファオーバーフロー」は前述の通りソフトウェアの脆弱性を突く攻撃のことで、コンピューターが確保しているメモリ領域を越えたデータが送られ、このデータに悪意のあるコードが含まれることにより、プログラムの誤動作などを起こす攻撃です。
それに対して「DoS」は、外部のサーバなどに負荷をかけるために大量のデータを送る攻撃手法です。
バッファオーバーフローによる被害例
- 2000年中央省庁のホームページ改ざん
科学技術庁のホームページの改ざんやデーターの削除などに始まり、合計で24省庁のホームページが改ざんされました。これは、バッファーオーバーフローによる管理権限の乗っ取りが原因となって発生したみたいです。 - 2015年1月にFacebookのサービス停止
対策
■ 開発者側の対策:
- バッファオーバーフローを発生させる可能性のある関数の使用は気をつける(C言語のscanf関数など)
- バッファのサイズをチェックする関数を使用する(C言語のstrncpyなど)
- ソースコード記述時には常にデータの長さを意識する
- 対策されたランタイムライブラリを使用する
- 目視およびソースコード検索ツールによる脆弱性のチェック
- 領域あふれの問題を検出するデバッグを念入りに行う
などの対策が必要なようです。
現在のWebアプリケーションのほとんどは、PHPやJavaなどの直接メモリを操作できない言語が使われており、バッファオーバーフローの脆弱性の影響を受ける可能性は低いと言われています。
■ 利用者側の対策:
- OSやアプリケーションは常にアップデートして最新の状態に保つ
- 修正パッチは速やかに適用する
- ネットワーク監視機能などを備えたセキュリティソフトの導入
などが有効なようです!
さいごに
普段CやC++をさわることはないのですが、メモリ領域を直接操作する際には気をつけなきゃと思いました!