バッファオーバーフローとは
外部からの入力の際、想定しない量の入力により、プログラムが用意したメモリ領域からデータが溢れて格納されてしまい、大事なデータの領域が上書きされてしまう脆弱性。
脆弱性の原理
外部からの入力値を格納する際、本来プログラムが用意していたメモリ領域から溢れて格納することが主な原因である。
また、書き換えを受けた変数、その後の動作によっては更に被害が拡がる。
以下のを同時に満たすと条件を同時に満たすと攻撃が成功する。
- プログラムの内部に侵入用の機械語コードを送り込むことができる。
- 領域溢れによってジャンプ先のアドレスを書き換えることができる。
- ジャンプアドレス先へプログラムの制御を移すことができる。
- 侵入用コードを実行することができる。
脆弱性が悪用された際の影響
- プログラムの異常終了
- 外部から任意の機械コードの実行
サーバの場合、サービスの提供の中止につながる。
攻撃の内容や攻撃の対象によってはコンピュータの制御まで奪われかねない、大きな危険をはらむ脆弱性である。
検査方法
画面から入力できるパラメータ、クエリストリングから送信されるパラメータに大量の文字列を入力し、異常終了が発生しないか確認する。
対策方法
C言語やC++を用いている場合、データ長を認識する関数を利用し、入力値を格納することができる。
また、バッファを動的に確保することで領域溢れを防ぐことも対策になる。
万が一書き換えが発生した場合に、プロセッサが異常なプログラムを実行しないように、書き換えを検出して実行しないようにする、書き換えが発生してもアドレスのランダム処理をはさみ実行できないようにすることも対策となる。
深刻な攻撃により乗っ取られることを防ぐことにつながる。