スタックとヒープの両方でのバッファオーバーフロー攻撃について学習しようとしています。ただし、バッファーのアドレスを判別できる場合について混乱しています。
古典的な"Smashing the Stack for Fun and Profit"は、配置されたシェルコードに確実にジャンプするために、スタックベースのバッファオーバーフロー攻撃でかなりのNOP
スレッドを使用する必要があると述べていますバッファ。これは、プログラムの実行ごとにバッファが最終的に異なるメモリ位置に配置されるためと思われます。ただし、NOP
スレッドを使用する機会を増やすことでバッファーのアドレスを推測できるため、完全にランダムではありません。
対照的に、プログラムに渡される環境変数は毎回同じアドレスに配置されるため、攻撃者がシェルコードを環境変数に配置し、その環境変数の場所に正確にジャンプできる、より簡単なローカル攻撃が可能になります。
これがヒープベースのバッファー(たとえば、malloc
によって割り当てられたバッファー)でどのように機能するか、およびその他の状況についてはまだ不明です。したがって:
問題の一部は、プログラムの初期化時のメモリレイアウトの外観と、しばらく実行した後のメモリレイアウトの外観に関係し、バッファをオーバーフローさせることができます。また、「私のマシンで動作する」問題にも対処する必要があります。
したがって、初期化時には、すべての環境変数が同じ場所に読み込まれます。これは、これが妥当な修正済みの初期プロセスであるためです。バッファのオーバーフローに関しては、常に毎回同時にバッファをトリガーしているとは限らない。たとえば、アプリケーションがネットワークパケットを受信する場合、まったく同じパケットを常に送信することは非常に困難です。その結果、オーバーフローが発生するまでに、メモリレイアウトが完全に同じにならない場合があります。したがって、どこかに「着陸」するNOPそりの必要性。
「私のマシンで動作する」問題は、実際には、エクスプロイトを他の人々のマシンで動作させたいということであり、それらはあなたのマシンとまったく同じように設定されることはほとんどありません。ライブラリのバージョン、ハードウェア構成が異なる可能性があります。これらはすべて、ターゲットのオーバーフローアドレスがユーザーのアドレスと同じになる可能性が低いことを意味します。
これらの問題により、メモリレイアウトが常に同じであることを確認するのが難しくなる可能性があるため、代わりに、可能性のある値の範囲で作業するため、NOPスレッドが必要になります。
プログラム内の決定論
既知のデータに対するすべての確定的操作は確定的結果を生成しますが、メモリレイアウトはカーネル開発者以外の誰にとっても確定的であると考えられることを意図していません。レイアウトは数学的な意味で確定的ですが 1、ソフトウェア業界の急速に変化し多様化する性質により、システム構造に関するアプリケーションの見方が効果的に確率論的になります。
ポータブルセキュリティ機能
移植可能なコードも信頼性の高いコードも、提供されている標準化されたプログラミングモデル以外のメモリに関する前提に基づいてはなりません。スタック、動的に割り当てられた、または静的なメモリヘッダーが変更され、コンパイラーが同期して変更されるため、標準に準拠したプログラムが問題なく実行されますが、OSの特別な知識を悪用するプログラムは、排除するつもりよりも多くのセキュリティリスクを引き起こします。 。
プログラムは、カーネル構造の一貫性に長期間依存することはできません。 CPUアーキテクチャ、その命令セット、実行モデル、スタック処理、およびmallocとfreeの内部構造はいつでも変更できます。これがPOSIXおよびその他の標準の理由です。標準化されたシステムコールを通じて提供されるファサードのみが、(通常)予測可能な動作を示すと信頼できます。
環境変数の悪用を回避する
必要に応じて、環境変数を反復処理し、必要な値をコピーしてから、それぞれが占める正確な範囲にゼロを書き込むことができます。しかし、それは最善の戦略ではありません。
一般的に有用なシステムとソースの実践
多くのセキュリティチームが使用しているぶら下がっている果物は、意味のあるユーザーソフトウェアの組み合わせを除いて、すべてのユーザーからのすべての実行可能ソフトウェアの実行をブロックすることです。許可されたものは潜在的なセキュリティホールについて分析され、適切なパッチが適用されてそれらが最小限に抑えられます。
バッファオーバーフローとアンダーフローに対する適切なエクスプロイト固有の保護は、Cなどの言語での注意深いバッファインデックス検証、またはこれらのエクスプロイト可能なメモリモデル操作を防ぐように設計されたオブジェクトの適切な使用です。
エントロピー注入方法
アドレススペースレイアウトのランダム化(ASLR)は、攻撃に対する耐性を強化するオペレーティングシステムの機能です。 ASLRをプログラムに追加しません。モデルを提供する各OSには、実行可能な命令バイトがCPUにロードされるところからプロセス検査を介してヒントをあまり提供することなく、特定のプログラムを実行できるメカニズムがあります。
位置独立実行可能ファイル(PIE)は、実行可能ファイル内のすべてのアドレスが相対的であるか、または(命令のグループ内で)あたかもそうであるかのように動作することを保証することにより、ランダム化をサポートするメカニズムです。
特定のターゲットオペレーティングシステムで、メモリモデルの配置にエントロピーを追加する方法を検討する必要があります。コード、使用するコンパイルフラグまたはリンクフラグ、および必要なランダム化を実行するコンテナー実行に関連する制約がある場合があります。速度とリソースへの影響がある可能性があるため、実行可能なリスクレベルを特定し、選択する必要がある場合があります。
それらはどのように機能しますか?メモリロケーションの決定にエントロピーを導入すると、攻撃者がCPU命令がメモリのどこにあるかを推測することが難しくなるため、マルチタスクシナリオでは、ジャンプソースと目的の宛先を別のタイムスライスからリアルタイムで決定することがより困難になります。
累積セキュリティ強度の階層化戦略
これらはセキュリティを保証するものではなく、ガードであることに注意してください。世界クラスのシステム管理、プログラム内での注意深いメモリアクセス、および着信データの優れた衛生管理の従来の組み合わせほど効果的な費用効果の高い戦略はほとんどありません。このリストに最近追加されたのは、これらの効果的な戦略にレイヤーを追加して、攻撃に対するシステムの回復力を高めることです。
[1]メモリレイアウトは、OSがマウスの動き、オーディオ入力、またはその他のトランスデューサーから実際のエントロピーを取得し、ランダムに(擬似ランダムではなく)メモリを配置する場合を除き、確定的です。