こんにちは。シングルサインオン『jugaa』を開発している
クラウド軍師運営チームです。

バッファオーバーフローとは、コンピュータの脆弱性の一種、またはそれを悪用したサイバー攻撃のことです。
この攻撃は、対象のコンピュータだけでなく、他のコンピュータにも被害を広げる恐れがあるもの。これを防ぐには、その手口を知り、適切な対策を取ることが大切です。

そこで今回は、この攻撃の手口や対策について、わかりやすく解説していきます。

バッファオーバーフローとは

バッファとは、コンピュータの一時的なデータ記憶領域のことです。そして、バッファオーバーフローとは、攻撃者がバッファの許容量をオーバーするほどの大量のデータや悪意のあるコードを対象のコンピュータに送りつけ、そのバッファをオーバーフローさせること、または、その脆弱性を狙ってコンピュータへ攻撃を行うことを指します。

この攻撃は、コンピュータの乗っ取りやプログラムの強制停止などといった被害をもたらします。場合によっては、攻撃を受けたコンピュータが他のコンピュータへの攻撃の踏み台にされることもあります。
データのオーバーフローでコンピュータが正常に動かない隙をついて攻撃を広げていくのが、その手口です。

「DoS攻撃」と「バッファオーバーフロー」の違い

この攻撃と混同されやすいサイバー攻撃の種類に、DoS攻撃というものがあります。

DoS攻撃とは

DoS攻撃とは、悪意のある第三者が特定のサーバに対し大量のリクエストを送る攻撃のこと。許容量を超えたデータ受信によりサーバを停止させ、サービスを停止に追い込みます。

1台のパソコンから行う攻撃はDoS攻撃、複数のパソコンから行う攻撃はDDoS攻撃と呼ばれます。

2つの攻撃の違い

Dos攻撃とバッファオーバーフロー攻撃の違いは、攻撃の対象にあります。

  • DoS攻撃→外部サーバを狙う
  • バッファオーバーフロー攻撃→コンピュータの内部を狙う

DoS攻撃はコンピュータの外部から負荷をかけ、バッファオーバーフロー攻撃は内部に攻撃を仕掛けます。どちらもコンピュータやサーバに許容量を超えたデータを送りつけるという点では共通していますが、そのターゲットは異なります。

バッファオーバーフローが発生する背景・原因

この攻撃が発生する背景・原因としては、次のことが考えられます。

【背景】バッファがいたるところに活用されている
【原因】悪意のあるユーザーがいる

データの一時的な記憶領域であるバッファは、さまざまな目的で活用されています。例えば、通信データ処理やファイルの入力・出力など。
バッファを使わなければバッファオーバーフローというバグは発生しませんが、日常的なコンピータの利用でバッファを使用しないことは不可能です。そのため、バッファオーバーフローを完全に避けることは極めて困難であり、これが攻撃が発生する背景となっています。

また、このバグは、悪意のあるユーザーによって引き起こされることがほとんどです。攻撃者はバッファの脆弱性を狙い、大量のデータを送りつけることでバッファオーバーフローを意図的に引き起こし、そこからさらに攻撃を行って被害を広げます。

つまり、コンピュータの利用に欠かせないバッファに脆弱性があること、そしてそれを悪用するユーザーがいることによって、バッファオーバーフローによる攻撃は発生するのです。

バッファオーバーフローの攻撃方法

この攻撃方法には、攻撃のターゲット領域によって複数の種類があります。その代表的なものが、次の3つです。

  • スタック領域への攻撃
  • ヒープ領域への攻撃
  • 静的領域への攻撃

それぞれどのような手口なのか、詳しくご説明します。

スタック領域への攻撃

関数を実行する際に、リターンアドレスやローカル変数などを下から積み重ねてスタック形で格納するメモリ領域のことを、「スタック領域」と呼びます。
バッファオーバーフローには、このスタック領域をターゲットとしたものがあり、その場合攻撃者はリターンアドレスを書き換えることで、マルウェアをはじめとした悪意あるコードを実行しようとします。

ヒープ領域への攻撃

ソフトウェアが自由に確保・解放を繰り返すことができる柔軟性の高いメモリ領域のことを、「ヒープ領域」と呼びます。
バッファオーバーフローによるヒープ領域を狙った攻撃では、攻撃者はこの領域に許容量以上の
データを送り込み、ヒープメモリの破壊や実行しているプログラムの強制停止などといった被害を発生させます。

静的領域への攻撃

「静的領域」とは、プログラムの開始から終了まで保持し続ける必要のある静的なデータが保存されるメモリ領域のこと。グローバル変数や定数などは、ここに格納されます。

この領域を狙った攻撃の場合、攻撃者はジャンプアドレス(次に実行するコードの位置を示すもの)を書き換え、悪意のあるコードを実行しようとします。

バッファオーバーフローの被害事例

ここからは、実際に起こった攻撃の被害事例を2つご紹介します。

【事例①】中央官庁Webページ集中改ざん事件

2000年に、科学技術庁のWebサイトが改ざんされるという事件が発生しました。攻撃者は、バッファオーバーフローによって中央官庁の管理権限を乗っ取り、改ざんを実行したと見られています。
また、この被害は科学技術庁に留まらず、他省庁にも及びました。

この事件で被害が大きくなった原因は、セキュリティ対策が十分でなかったことにあります。中央官庁では、セキュリティパッチの適用などが、きちんと行われていなかったようです。

この事件の影響もあり、翌月には内閣官房に「情報セキュリティ対策推進室」が設置されることになりました。

【事例②】ハッカー集団によるFacebookへの攻撃

2015年に、SNSであるFacebookのサービスが強制停止となりました。その原因は、ハッカー集団によるDoS攻撃と、それによって発生したバッファオーバーフローにあると見られています。

サービス停止時間は30分超程度でしたが、これによりFacebook側は大きな額の損害を被ることになったようです。

バッファオーバーフローの対策方法

被害を他のコンピュータに広げてしまう恐れもあるこの攻撃を、開発者やユーザーはどのように防げば良いのでしょうか。
ここでは、バッファオーバーフローの対策方法を、開発者側で取るべき方法とユーザー側で取るべき方法に分けてご紹介します。

開発者側の対策

開発者側の対策として重要なのは、バッファオーバーフローが起こらないようなプログラムを作成することです。具体的には、安全性の高いJava言語を用いたり、書き込みの上限や境界をチェックするライブラリ関数を用いたり、また入力するデータの長さをチェックしたりする方法が考えられます。

ユーザー側の対策

ユーザー側で行うべきなのが、厳重なセキュリティ対策です。
パソコンには必ずウイルス対策ソフトを導入・更新し、修正プログラムのインストールも早急に行うようにしましょう。これにより、攻撃を受けた際のマルウェアの実行を防いだり、狙われやすいプログラムの脆弱性を補完したりすることが可能になります。

また、より強固に攻撃を防ぐには、日常的に攻撃の有無を監視する必要があります。監視ツールの導入も、対策としては有効でしょう。

まとめ

バッファオーバーフローは、サイバー攻撃の一種です。しかし、サイバー攻撃の手口はこれ一つではありません。攻撃者はあらゆる手段で脆弱性を突き、攻撃を行おうとしています。

これを防ぐためには、コンピュータやそのデータ、ネットワークを多層防御しておくことが大切です。複数のセキュリティ対策を導入し、各対策の弱点を補いながらセキュリティを強化していくことで、被害のリスクは軽減されるでしょう。

重要な情報資産を守るためにも、セキュリティ対策は多層で取り入れるようにしてください。