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

バッファオーバーフローは、コンピュータのプログラムがメモリ上の準備された領域(バッファ)を超えてデータを書き込んでしまい、隣接するメモリ領域を上書きしてしまう現象のことです。

これにより、プログラムの異常終了や意図しない動作が引き起こされるだけでなく、悪意のある第三者によってコンピュータの制御を奪われる深刻なセキュリティ脆弱性の原因となります。

バッファオーバーフローのメカニズム

コンピュータのメモリ管理において、データは種類ごとに特定の領域に格納されます。バッファオーバーフローが発生すると、本来書き込まれるべき範囲を逸脱し、その先に保存されている重要な管理情報や他のプログラムのデータを破壊します。

特に「スタック領域」と呼ばれるメモリ部分で発生するものはスタックベース・バッファオーバーフローと呼ばれ、関数の戻り先アドレスを書き換えることで、攻撃者が用意した不正なコードを実行させる攻撃に悪用されます。

発生原因とプログラミング言語の影響

この脆弱性は、主にメモリ管理を開発者が直接行う必要があるプログラミング言語(C言語やC++など)で顕著に見られます。

  • 境界チェックの欠如: 入力データのサイズが、確保したメモリサイズに収まるかどうかを確認せずにコピー処理を行う関数(例:C言語のstrcpyやgetsなど)を使用することが主な原因です。
  • 入力値の信頼性: 外部からの入力値を検証せずに処理に利用することで、設計時の想定を超えた巨大なデータが送り込まれる隙を与えてしまいます。

セキュリティ上のリスク

バッファオーバーフローが悪用された場合、以下のような極めて重大な被害が発生する可能性があります。

  1. 任意コードの実行: 攻撃者が送り込んだプログラムを、最高権限で実行される恐れがあります。
  2. 権限昇格: 一般ユーザー権限のプログラムを悪用し、管理者権限を奪取されることがあります。
  3. サービス拒否(DoS): プログラムがクラッシュし、システム全体が停止することで、正規の利用者がサービスを利用できなくなります。

防御手法と対策

現代のシステムでは、ハードウェア、OS、コンパイラの各層で複数の対策が講じられています。

1. ソフトウェア側の対策

  • 境界チェックを行う安全な関数の使用(例:strncpyやfgetsへの置き換え)。
  • 入力値のバリデーション(サイズチェック)の徹底。

2. OS・ハードウェアによる対策

  • ASLR(アドレス空間配置のランダム化): プログラムが使用するメモリ配置を毎回ランダムにすることで、攻撃者が特定のメモリアドレスを狙い撃ちすることを困難にします。
  • DEP / NXビット: メモリのデータ領域を実行不可能に設定し、送り込まれたコードが実行されるのを防ぎます。
  • スタックカナリア: スタックの戻り先アドレスの手前に特殊な値(カナリア)を配置し、その値が書き換えられていないかをチェックすることでオーバーフローを検知します。

統計的なリスク評価

セキュリティの脆弱性評価指標であるCVSS(共通脆弱性評価システム)において、バッファオーバーフローはしばしば高いスコアを記録します。

脆弱性の深刻度を $S$ 、悪用可能性の指標を $E$ 、影響度の指標を $I$ としたとき、簡略化された評価モデルは以下の概念で表されます。

S = f(E, I)

バッファオーバーフローは、遠隔地からネットワーク越しに実行可能である場合が多く、悪用可能性 $E$ と影響度 $I$ の双方が最大値に達しやすいため、迅速な修正パッチの適用や対策が求められます。

関連用語

DDoS攻撃 セキュリティ用語集 | APPSWINGBY
セキュリティテスト | 今更聞けないIT用語集
クラウドソリューション

お問い合わせ

システム開発・アプリ開発に関するご相談がございましたら、APPSWINGBYまでお気軽にご連絡ください。

APPSWINGBYの

ソリューション

APPSWINGBYのセキュリティサービスについて、詳しくは以下のメニューからお進みください。

システム開発

既存事業のDXによる新規開発、既存業務システムの引継ぎ・機能追加、表計算ソフトによる管理からの卒業等々、様々なWebシステムの開発を行っています。

iOS/Androidアプリ開発

既存事業のDXによるアプリの新規開発から既存アプリの改修・機能追加まで様々なアプリ開発における様々な課題・問題を解決しています。


リファクタリング

他のベンダーが開発したウェブサービスやアプリの不具合改修やソースコードの最適化、また、クラウド移行によってランニングコストが大幅にあがってしまったシステムのリアーキテクチャなどの行っています。