バッファオーバーフロー攻撃とは?
バッファオーバーフローとは英語に直すとbuffer overflow、つまりバッファがあふれてしまうといった意味です。それでは「バッファがあふれる」とはどのような状態なのでしょうか。まずはバッファの意味から理解し、攻撃に対する知識を深めていきましょう。
そもそもバッファとは
まず「バッファ」とは何でしょうか。バッファとは一言でいうと「コンピュータ上のプログラムが持つ領域」のことです。
プログラムがもつ領域はは実行命令が格納されているコード領域、プログラムの戻り先などプログラム実行のための一時的な情報が格納されているスタック領域、計算や操作のためのデータを格納するヒープ領域の3つにわかれます。このうち、スタックとヒープを合わせた領域をバッファと言います。
上限を超えた入力データで起きるバッファオーバーフロー攻撃
バッファオーバーフロー攻撃とは、本来上限として想定される長さを超えたデータがバッファに入力され、確保していた領域からあふれてしまうことを指します。
例えば、ヒープ領域上に計算や操作に必要な領域を確保するために、プログラム上で「10バイトの文字列領域」を指定するとします。(例:C言語なら「char s[10];」)。この指定された領域でC言語やC++などのプログラミング言語で書かれたプログラムを利用すると、実は確保された領域以上のデータを入力できてしまうことがあります。
具体的には、10バイトの領域に15バイトのデータを入力できてしまういうことです。またこの指定を超えた15バイトのデータは圧縮され10バイトの領域に詰め込まれるのではなく、余分な5バイトが後ろにあふれてしまいます。このデータのあふれが、エラーにならずに処理されてしまうことをオーバーフローと呼びます。
このようにバッファオーバーフロー攻撃とは、攻撃者がバッファ領域において上限を超えた長いデータを入力するにより、確保された領域からデータをあふれてさせることを指します。
バッファオーバーフロー攻撃が脆弱性となる理由とは
これまでバッファオーバーフロー攻撃の意味や仕組みについて確認してきました。それではなぜバッファオーバーフロー攻撃がシステムの脆弱性になるのでしょうか。その原因はスタック領域の仕組みにあります。それでは、ここからはスタック領域の仕組みと起こりうる脆弱性についてみていきましょう。
プログラムの戻り先が格納されるスタック領域
スタック領域には「プログラムの戻り先」が格納されています。具体的にはプログラムは、OSから順次呼び出されるようになっており、終了したら呼び出し元に戻ることになります。戻り先は呼び出し元のプログラムが指定し、呼び出されたプログラムは初期処理として指定された戻り先をスタック領域コピーします。このような一連の処理がスタック領域の仕組みとなります。
スタック領域の戻り先を書き換えられることで起きる
さてバッファオーバーフロー攻撃がプログラムの脆弱性になる理由は、データがあふれても格納されてしまうという性質を悪用され、スタック領域内のプログラムの戻り先を書き換えることができるからです。例えば侵入に成功したウィルスソフトやマルウェアを戻り先に指定されると、そのプログラムが終了すると同時にそれらの悪意あるソフトが起動されることになってしまいます。
その結果、システムが誤作動を起こしたりコンピューターが乗っ取られてしまったり、攻撃者が乗っ取たコンピューターを踏み台にまた別のシステムを攻撃するなど被害は多岐にわたります。
バッファオーバーフローによるサイバー攻撃は2種類
バッファオーバーフローによるサイバー攻撃は主に2種類あります。
Dos攻撃・DDos攻撃の踏み台となるケース
1つは、主にパソコンに侵入したマルウェアを呼び出すことで、DoS(サービス妨害)攻撃やDDoS(分散DoS)攻撃の踏み台にされることです。DoS攻撃などを受けた企業はもちろん被害者ですが、踏み台にされたパソコンが企業や個人事業主のものであれば、踏み台にされた側の社会的信用の失墜にもつながります。
また以下の記事ではDos攻撃について詳しく解説しています。踏み台とされた後、どのような攻撃が行われるのか知りたい方は参考にしてください。
悪意あるプログラムで管理者権限を盗むケース
もう1つは、悪意のあるプログラムがサーバに侵入し、管理者権限で動作しているプログラムから呼び出されるようにすることで、管理者権限を乗っ取り、管理者にしかアクセスできない情報を盗んだり、破壊したりすることです。特に2000年に続発した中央省庁のWebサイト改ざん事件は、この手口によるものだと公表されています。
対策はプログラムの開発者側と利用者側で異なる
バッファオーバフロー攻撃の対策は、プログラムの開発者側(ソフトウェア開発会社やシステムの社内開発をしている会社など)とプログラムの利用者側で異なります。それぞれ確認していきましょう。
開発者側の対策とは
開発者側の対策は、バッファオーバーフローを発生させないようなプログラムを開発することです。
入力データの長さチェックをする、書き込み上限バイトや境界をチェックするようなライブラリ関数を利用する(市販のライブラリもあります)、比較的安全と言われているJavaなどの言語に置き換える、などの方法があります。
利用者側の対策とは
利用者側での対策としては、バッファオーバーフローを引き起こす可能性のあるプログラムを検知するのは困難なので、防御対策が主体になります。具体的にはウィルス対策ソフトを常に最新状態にする、アプリケーションの修正プログラムが配布されたらできるだけ速やかに適用するなどが代表的な対策です。
しかし、これだけではゼロデイ攻撃と呼ばれるような、セキュリティホールの発見から修正プログラムが配布されるまでの隙間を狙った攻撃には対応できません。つまり社内のシステムを守るには、普段から不正アクセスやセキュリティ攻撃をされていないかを監視する必要があるということです。幸い不正アクセスやセキュリティ攻撃を監視するツールは数多く出ていますので、状況に合わせて利用されることをおすすめします。。
これだけではないサイバー攻撃の脅威
今回はサイバー攻撃の中でバッファオーバーフロー攻撃を中心に解説しました。この攻撃だけでも大きな脅威ですが、サイバー攻撃はまだまだ、多種多様な攻撃方法で攻撃を仕掛けてきます。具体的には「水飲み場攻撃」「ランサムウェア(身代金ウィルス)」「DNSキャッシュポイズニング」などです。
特に「ランサムウェア」は最も凶悪なサイバー攻撃の一つです。以下の記事で詳しく解説していますのでぜひ参考にしてください。
サイバー攻撃対策には多層防御
サイバー攻撃には様々な種類の攻撃があり、いずれも企業に損害を与える危険なものばかりです。
それらか、自社の重要なデータ・システムを守るためには「多層防御」を構築しておくことをおすすめすます。
「多層防御」とは、様々なセキュリティ対策ソフトを導入することで、「WAF」や「IPS・IDS」「UTM」などいくつものセキュリティの層を作り、弱点を補い合わせることでより強力なセキュリティを築きます。
特にUTMは、様々なセキュリティソフトウェアを一括で導入・管理する事ができるので、多層防御を構築する際はまずUTMを導入し、それを補う形でWAFやIPS・IDSを導入すると良いでしょう。
サイバー攻撃対策を徹底しよう
サイバー攻撃、特にランサムウェアは感染してしまうと非常に厄介な攻撃です。事前対策を徹底して行っておく必要があるでしょう。
また、最新のセキュリティソフトの中には侵入された場合でもそれをはじくことができるソフトもあります。
ぜひ以下の記事を参考に、最新のセキュリティソフト導入をご検討ください。