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