サーバーやパソコンなどが攻撃を受けて突然停止したり、勝手に操られるセキュリティリスクの存在がレポートされることがあります。「バッファオーバーフロー攻撃」はその類で、プログラムの脆弱性が公表される頻度もやや高めです。
インターネット黎明期から存在する古典的な脅威ですが、バッファオーバーフロー攻撃について改めて確認し、今後のセキュリティ対策に活かしていきましょう。
バッファオーバーフロー攻撃とは
バッファオーバーフロー攻撃とは、コンピューター機器に「バッファオーバーフロー」という不具合を引き起こさせ乗っ取るものです。攻撃者はさらに乗っ取った機器をさまざまに悪用しようとします。たとえば、被害にあった機器を踏み台にして別のコンピューター機器に攻撃を仕掛ける等です。
もう少し詳しく説明すると、バッファオーバーフロー攻撃はコンピューター機器のメモリ、つまりハードウエアの誤作動を誘発するコードを書き込み、機器を意のままに操ろうとします。この攻撃が起こされる主な要因はソフトウエアの脆弱性です。
バッファとは
バッファオーバーフロー攻撃の「バッファ」は、コンピューターのメモリ領域にあります。コンピュータープログラムは円滑なデータ処理のため、メモリ内に一時的にデータを保管する領域(バッファ)を設けて、タイミングを見計らってデータを取り出して利用します。そもそもメモリのリソースは有限で、一定量のデータしか格納できません。バッファオーバーフロー攻撃は、このバッファ領域に想定外の長いコードを入力し、コンピューター機器の誤作動を誘発、乗っ取りを計るものです。
メモリ領域にはいくつか種類があり、「スタック領域」「ヒープ領域」「静的領域」などがあります。
バッファオーバーフロー攻撃とDoS攻撃の違い
想定外に大きなデータを送りつけて正常動作を阻害する攻撃には他にも「DoS攻撃」があります。バッファオーバーフロー攻撃とDoS攻撃の違いは、異常動作の発生元と異常が引き起こるデータ長(データ量)にあります。
バッファオーバーフロー攻撃では、メモリが抱えきれないデータ長のコードを紛れ込ませます。そもそも標的のメモリのバッファに大した容量はありません。しかし、非常に小さなデータであっても、コンピューター処理の重要な基盤たるメモリの処理を乗っ取られて、ひいてはプログラムの制御権を奪われる恐れがあるのです。
一方、DoS攻撃はバッファオーバーフローとは比較にならないほど高頻度かつ大量のデータを送りつけ、ネットワークインフラや、サーバーのシステムの処理能力を飽和させ、機能不全におちいらせるものです。
バッファオーバーフローの原因とは
バッファオーバーフローが起こる原因はプログラミング言語(低級言語)の脆弱性にあります。プログラムはまずメモリのバッファ領域の範囲を指定して、そこにデータを入れ込み、さまざまな処理に移ります。つまり、そのときに指定した範囲内のデータ長の入力を想定しています。
しかし、脆弱性があると、あらかじめ用意しておいたバッファ領域よりも大きなデータ長を書き込めてしまうことがあります。その場合、想定範囲をはるかに超えるデータ量をメモリに書き込もうとして、隣の領域にはみ出してまで書き込みを完了させます。これがバッファオーバーフローです。
バッファオーバーフローが起こると、「リターンアドレス」などの情報処理において重要な要素を上書きする致命的な動作を引き起こしかねません。その結果、プログラムの制御が乗っ取られることがあります。
バッファオーバーフロー攻撃の種類
バッファオーバーフロー攻撃には以下の3つのパターンがみられます。どれにも共通しているのは、攻撃者は脆弱性のあるプログラムを解析して攻撃を企てるという点です。解析手段となるリバースエンジニアリングのツールは多く出回っており、利用しているソフトに脆弱性が発生すると即リスクと化してしまいます。
3種類のバッファオーバーフロー攻撃のうち、メモリのスタック領域を狙った攻撃が一番難度が低いといわれています。
スタック領域を狙う攻撃
スタック領域とは、C言語やC++言語で記述された「プログラムの計算式」と、その演算後に実行すべきコードの場所を示す「リターンアドレス」の2つを格納するメモリ領域を指します。攻撃者はスタック領域のバッファ容量を超えるデータを入力し、任意のコードやリターンアドレスに書き変え、コンピューター機器を自由に操ろうともくろみます。
ヒープ領域を狙う攻撃
ヒープ領域とは、プログラムがいつでも自由に借りたり、返したりできるメモリ領域を指します。攻撃者はヒープ領域の空き箇所を管理する仕組みのアルゴリズムに目をつけ、過大なデータを入力して領域あふれを起こし、メモリに置いていたデータを破壊したり上書きして、プログラムを制御しようと計るものです。
静的領域を狙う攻撃
静的領域とはプログラムの開始から終了まで、ずっと占有されるメモリ領域を指します。データの移動は基本的に起こらないため、領域あふれを起こすことが可能なコードの近くに「ジャンプアドレス(次に実行するコードの場所)」が配置されている場合に狙われます。
バッファオーバーフロー攻撃の影響
バッファオーバーフロー攻撃を受けると、コンピューター機器の管理者権限を乗っ取られ、外部から自由に遠隔操作される状況におちいります。そうなれば、さまざまな被害を受けることが考えられます。
たとえばコンピューター機器内の重要データの窃取・改ざん、またマルウェアに感染させられることもあるでしょう。最悪の場合、意図せず他のコンピューターシステムの攻撃拠点として使われ、大きな被害を引き起こす元凶になってしまう可能性があります。
バッファオーバーフロー攻撃の事例
ここでは、かなり古い事案ですが、日本中に影響を与えたバッファオーバーフロー攻撃を紹介します。
2000年1月に中央官庁のWebサーバーがバッファオーバーフロー攻撃を受け、多くの省庁関連サイトが改ざんされる被害が報道されました。攻撃の手口は、Webページのアクセス時に大量のデータを送信することで、アクセス自体を「リモートシェル」という遠隔操作が可能なコード送信に置き換えるものでした。これは古いWebサーバーのバグを突いた攻撃で、当時の最新のWebサーバー導入で防止が可能だったといいます。
国はこの影響もあって、その年の2月末に各省庁の情報セキュリティ補助を目的に「情報セキュリティ対策推進室(現:内閣サイバーセキュリティセンター)」を設置しました。また、当時はインターネット接続のリスクや、ファイアウォールの有用性が盛んに喧伝され、民間企業にまで広く知れ渡ったといいます。
バッファオーバーフロー攻撃の対策
バッファオーバーフロー攻撃への根本的な対策は、バッファオーバーフローを発生させるコードをプログラムに生成させないことです。そのため、以下のような対策が有効となります。
- ソフトウエア開発において脆弱性のある構造を回避
- 既存プログラムのソースコードの脆弱性の検査・デバッグによる改修
- OS機能を利用した書き換えの検出と実行停止
- メモリのアドレス空間配置のランダム化をOSに設定
- CPU機能を活用し、メモリ領域の機械語データの実行防止をOSに設定
- OS・ソフトウエアの修正パッチの適用
- セキュリティソフトを常に最新にアップデート
要するに、利用するソフトウエアの脆弱性排除と、基本的なセキュリティ対策が重要になります。
まとめ
バッファオーバーフロー攻撃はサーバーやパソコンの乗っ取り・悪用を意図したものです。管理している機器や端末が被害にあったり、さらなる被害を引き起こす元とならないよう、日頃からしっかり対策するよう心がけましょう。