要約
バッファオーバーフロー攻撃は、プログラムが割り当てられたメモリ領域を超えてデータを書き込むことで発生します。これにより、ハッカーが不正なコードを注入してシステムを乗っ取るための脆弱性が生まれます。攻撃にはスタックベースとヒープベースのものがあり、C/C++やアセンブリなどの言語で記述された、古く複雑なプログラムで最もよく見られます。こうした攻撃から防御するには、レガシーシステムのモダナイゼーション、セキュリティパッチの迅速な適用、より安全なプログラミング言語の使用、実行可能領域の保護の有効化が必要です。
バッファオーバーフロー攻撃の仕組み
バッファーオーバーフローが発生すると、プログラムはバッファー外のメモリー領域にデータを書き込みます。そのステップによってデータが破損したり、プログラムがクラッシュしたりする可能性があります。
ハッカーはそれを知っており、時には一見無害なバッファーを利用してデバイスを乗っ取ることがあります。
つまり、バッファは、プログラムのメモリが不足してクラッシュを回避したい場合に、非常に役立つものです。そのバッファ内にデータを保存して、プログラムの動作を継続できます。プログラムがバッファ内で確保できる量よりも多くのメモリを必要とする場合、バッファオーバーフロー攻撃に対して脆弱になります。
バッファオーバーフロー攻撃は、1998年のMorris Wormから2015年のStagefrightに至るまで、最も悪名高いハッキング事例のいくつかを引き起こしました。
それらがどのように機能するかを説明し、それらから身を守る方法を理解していただけるようにします。
バッファオーバーフローとは?
ほとんどすべてのコンピューターにバッファーがあります。この専用スペースは、データを保持または転送できるため、複数回のクラッシュを経験することなく作業を継続できます。しかし、最高のバッファーであっても限界があります。そして、それを超えると、オーバーフローが始まります。
バッファーオーバーフローは、次のようになります。
| タイプ | 原因 | 効果 |
|---|---|---|
| 偶発的 | 1つのプログラム内で処理を詰め込みすぎると、プログラムに割り当てられた容量を超えてしまいます。 | プログラムの動作が不安定になったり、場合によっては完全に停止したりすることがあります。 |
| 意図的 | プログラムで処理できないほど大きなデータが送信されます。 そのデータセットには、有効なバージョンを置き換えることができるコードが含まれています。 | 新しいコードを実行すると、プログラムが予期しない動作をすることがあります。 |
ハッカーが、お客様のプログラムを完全に理解し、その動作方法を変更するプログラムを作成することは難しいと思われるかもしれません。しかし残念ながら、これらの攻撃は比較的よく見られます。
バッファオーバーフロー攻撃にはどのような種類がありますか?
すべてのプログラムにはバッファが含まれていますが、攻撃者は2つの方法のいずれかに従って、それを乗っ取り、攻撃を開始できます。
バッファーオーバーフロー攻撃は次のようになります。
| 攻撃の種類 | 方式 | 成果 |
|---|---|---|
| スタックベース | 攻撃者がプログラムにデータを送信すると、そのデータは小さすぎるスタックバッファーに格納されます。ハッカーは「プッシュ」機能を選択し、スタックの最上部に新しい項目を保存する可能性があります。あるいは、ハッカーが「pop」関数を選択して、一番上のアイテムを削除し、置き換えることも可能です。 | つまり、ハッカーが正式に悪意のあるコードを挿入して制御を乗っ取ったということです。 |
| ヒープベース | ハッカーがヒープ内のデータを破損させます。 | そのコード変更により、システムは重要なデータを強制的に上書きします。 |
ユーザーとして、これらの変更が発生していることに気付かない場合があります。しかし、進行を止めなければ、プログラムが引っかかったり、停止したりすることがあります。いずれはクラッシュする可能性があります。
バッファーオーバーフローは、オペレーティングシステムなどの重要なプログラムを標的にすることが多いため、ハッキングによりデバイスを制御できなくなる可能性があります。
プログラムがバッファオーバーフローに対して脆弱になる原因は何ですか?
攻撃を防止することは、攻撃から回復するよりも簡単です。ありがたいことに、会社を安全に保つためにできることはたくさんあります。
まず、開発中に使用するコードを検証することから始めます。バッファーオーバーフロー攻撃を受けやすいプログラミング言語は次のとおりです。
- アセンブリ
- C/C++
- Fortran
これらの言語には組み込みの保護機能がなく、オーバーフローのルーチンチェックを許可していません。
どのようなコード特性によってプログラムが標的になるのでしょうか?
次に、コードを確認します。プログラムが次のような状態にある場合、ハッカーは攻撃を仕掛けやすくなります:
- 複雑。プログラムの動作を予測するのが難しいと感じますか?
- 外部プログラム内のアクションを制御するために、サードパーティまたは外部データが必要ですか?データプロパティは外部から制御されていますか?
- 古いレガシーコンポーネントを使用してプログラムを構築しましたか?
ほとんどすべての企業が、すべての従業員が毎日使用する古いカスタムビルドのプログラムを持っています。このシステムはあなたのために作られたものなので、置き換えるのをためらうかもしれません。しかし、明らかに、レガシーシステムには、軽減または排除することが困難なリスクが伴います。
バッファオーバーフロー攻撃を防ぐにはどうすればよいですか?
ハッカーは長年にわたりバッファーを利用してきましたが、彼らの活動に新たな機会が生まれつつあります。例えば、専門家はコネクテッドデバイス(冷蔵庫やドアベルなどのIoT(モノのインターネット)要素を含む)がこうした攻撃に対して脆弱である可能性があると述べています。
バッファオーバーフロー攻撃を防ぐには、どのような対策を講じればよいですか?
以下の常識的な手順に従って、会社を保護してください。
- 新しいオペレーティングシステムを使用する。サポートシステムが期限切れになったレガシープログラムは破棄してください。新しいコードには、より多くの保護機能が備わっています。
- 言葉遣いに気を付けましょう。Common Business-Oriented Language(COBOL)、Python、Javaで記述されたプログラムは、他のプログラムよりも安全性が高いと考えられます。
- スペースを追加。一部のプログラムでは、実行可能スペース保護が可能です。有効にすると、ハッカーはオーバーフロー攻撃によって挿入されたコードを実行できません。
- 開発者を活用する。システム管理者は、開発者がバグレポートを無視すると不満を言うことがよくあります。粘り強く取り組んでください。バッファオーバーフローにつながる問題を見つけたら、誰かが修正するまで声を上げ続けてください。
- パッチを適用してください。開発者はバッファオーバーフローの問題を発見すると、コードを修正して対応します。例えば2021年2月には、Sudoの開発者がまさにこのようなパッチをリリースし、その使用を推奨しました。
コードの監視、動作の分析、および頻繁なテストはすべて良い方法です。しかし、会社を安全に保つためには、さらに多くのことを行う必要があります。
Oktaと連携して、最も重要なリソースを強力な認証システムで保護してください。詳細はこちら 当社がお客様のような組織をどのように支援できるかをご覧ください。
よくある質問(FAQ)
バッファオーバーフロー攻撃とは?
バッファオーバーフロー攻撃は、プログラムが割り当てられたメモリバッファに保持できる量を超えるデータを受信したときに発生します。過剰なデータが隣接するメモリーにスピルオーバーし、既存のデータを破損させたり、プログラムをクラッシュさせたり、攻撃者による悪意のあるコードの挿入と実行を許したりする可能性があります。
スタックベースとヒープベースのバッファオーバーフローの違いは何ですか?
スタックベースの攻撃では、攻撃者はサイズが不十分なスタックバッファーに格納されたプログラムにデータを送信し、「push」または「pop」関数を使用して悪意のあるコードを挿入します。ヒープベースの攻撃では、攻撃者はヒープメモリ領域内のデータを破損させ、システムに重要なデータを強制的に上書きさせます。
バッファオーバーフロー攻撃に対して最も脆弱なプログラミング言語は何ですか?
アセンブリ、C/C++、Fortranなどの言語は、組み込みのオーバーフロー保護機能がなく、日常的なオーバーフローチェックをサポートしていないため、特に脆弱です。COBOL、Python、Javaなどの言語は、一般的に、より安全な代替手段と見なされています。
バッファオーバーフローのリスクが最も高いのは、どのような種類のプログラムですか?
複雑で予測が困難なプログラム、外部データやサードパーティのデータに依存するプログラム、レガシーコンポーネントを使用して構築されたプログラムが、最も影響を受けやすくなります。組織が刷新をためらう旧式のカスタムビルドシステムは、一般的なリスク源となっています。
組織がバッファオーバーフロー攻撃から自らを保護するには、どうすればよいでしょうか?
最新のオペレーティングシステムへのアップグレード、より安全なプログラミング言語の使用、実行可能領域の保護の有効化、セキュリティパッチの迅速な適用、特定された脆弱性に関するシステム管理者と開発者間のオープンなコミュニケーションの維持などが、主要な防御策として挙げられます。
接続されたデバイスはバッファオーバーフロー攻撃に対して脆弱ですか?
はい。専門家は、冷蔵庫やドアベルなどのIoT(モノのインターネット)要素を含むコネクテッドデバイスがバッファオーバーフロー攻撃に対して脆弱であり、従来のコンピューターやサーバーを越えて潜在的な攻撃対象領域を拡大させる可能性があると述べています。
参考文献
バッファオーバーフロー攻撃。包括的なセキュリティ:実践的なアプローチ
バッファオーバーフロー。OWASP。
バッファオーバーフロー攻撃。サンタクララ大学。
バッファオーバーフローとは?ハッカーによる脆弱性の悪用手口。 (2020年1月、CSO)
Kernel Space:Linux開発者はバグ報告を無視しているのか?(2007年9月)。Networkworld.
Sudoのヒープベースのバッファオーバーフローの脆弱性。(2021年2月、サイバーセキュリティ・社会基盤安全保障庁。