ITをちょっと知っている人は「バッファオーバーフロー」という言葉自体を聞いたことがあると思います。そして、あまり良い意味での言葉で無いこともご存知かと思います。
知らない人でもオーバーフローなので、「何かが溢れちゃうんだろうなー」ってイメージが湧くと思います。
では、「バッファオーバーフロー攻撃」とは何かと言うと、「バッファが溢れて、それを使った攻撃」となりますが、それだと何のこっちゃ、ということになります。。。
そこで、今回はこのセキュリティの攻撃の一つである「バッファオーバーフロー攻撃」を解説します!
バッファオーバーフローとは?
先ずはバッファオーバーフロー(buffer overflow:BOF)の説明からです。
凄く簡単に言うと、「プログラムのバグによって引き起こされる状態のこと」です。
つまり、コンピュータの通常状態では発生してはいけない事象のことです。
バッファと呼ばれるメモリ上の領域よりも大きいサイズのデータをこのバッファに書き込もうとすると、データがバッファからはみ出てしまい、別のメモリの領域に漏れた分が上書きされます。
これにより元々のメモリにあったデータが破壊されてしまいます。
このメモリが破壊できることを利用し、意図的に悪意あるデータを書き込むことでコンピュータの動作を乗っ取ってしまえることができるので、この仕組みを使った攻撃が「バッファオーバーフロー攻撃」なのです。
では、続いでこのバッファオーバーフロー攻撃の詳細を説明します。
バッファオーバーフロー攻撃(BOF攻撃)とは?
この攻撃手法は昔からある有名な攻撃で、上記の説明にあるようにOSやアプリケーションの入力データの処理に関するバグを突いて、コンピュータのメモリに不正なデータを書き込み、システムへの侵入や管理者権限の取得を試みる攻撃手法です。
この攻撃にはメモリのスタック領域(下から順番にデータを積み上げていく方法)で行う場合「スタックBOF」、ヒープ領域(任意の場所にデータを格納)で行う場合「ヒープBOF」と呼びます。
次に実際の攻撃手法に関して説明します。
BOF攻撃の仕組み
BOF攻撃の詳細な動きは、記事の最後に掲載した参考サイトや他のサイトをご参照頂ければと思いますので、ここではBOF攻撃をシンプルなイメージで説明します。
スタックBOF攻撃の流れは次の通りになります。
①プログラムのメインルーチンからサブルーチン(関数)が呼び出され、その中で使用する「変数」の格納領域がスタックに確保されます。ここまでは通常のプログラムの流れです。
②スタックに確保された「変数」の領域にそもそも確保されていたデータサイズよりも大きなデータを入力します。この時、データサイズのチェックが行われていないことが問題となります!
これにより、スタック内の①で書き込んだデータである「戻り先アドレス」や「変数」などのデータが悪意あるデータに上書きされてしまいます。
③サブルーチンの処理はそのまま終わろうとしますが、そもそもスタック内に書き込まれていた正常な「戻り先アドレス」が上書きされてしまっているので、メインルーチンに戻ることが出来なくなってしまいます...これは大変です!
④では、どこに戻るかというと、上書きされたデータの中の元々の戻り先アドレスがあった位置に「悪意ある戻り先アドレス」があり、そこが示しているアドレスには「悪意あるコード」が埋め込まれています。
⑤プログラムが通常処理をする中で、「悪意ある戻り先アドレス ⇒ 悪意あるコード ⇒ OSを乗っ取るシェル」みたいな流れが通常に流れてしまい。これで攻撃が成立してしまします...
文字だと分かりにくいので、図にもしてみました。
スタックBOF攻撃と詳細は特徴は以下サイトも参考になります。
BOF攻撃の対策はどうする?
BOF攻撃の対策ですが、次の二つの面から対策を打つ必要があります。
①OSやソフトウェアのバージョンアップ、パッチ適用を最新に保つ!
OSやソフトウェアに起因する脆弱性を防ぐためには、やはり常に最新の状態にしておくことが大事です。また、脆弱性診断を行うことで、攻撃による被害を未然に防ぐこともできますね!
②プログラムコードのチェックを行う!
ソフトウェア開発者目線での対策のことです。
BOF攻撃を検知する仕組みやBOF防止機能を追加したライブラリを使用するなど、常に攻撃を意識したプログラムを作成していくことで、事故を防ぐことができますね!
まとめ
今回は脆弱性を付いた攻撃の一つであるバッファオーバーフロー攻撃に関して解説しました。
古くからある脆弱性攻撃ではありますが、未だに使われる攻撃手法のようですので、セキュリティパッチやコードチェックをしっかり行っておくことでしっかり対策をしていく必要がありますね!
因みにBOF攻撃は「バッファオーバーラン攻撃」とも呼ばれるようですね。
以上です!
参考URL)