2012年9月24日月曜日
バッファオーバーフローと対策
コンピュータセキュリティ、プログラミング、バッファオーバーフロー、またはバッファオーバーランでは、プロセスが固定長のバッファの境界を越えてデータを格納しようとする異常な状態です。その結果、余分なデータは、隣接するメモリ位置を上書きすることです。上書きされたデータは、他のバッファが、変数やプログラムのフローデータを含むことができ、不安定なプログラムの動作は、メモリアクセス例外、プログラムの終了(クラッシュ)が発生する可能性があり、誤った結果または故意にシステムのセキュリティを悪意のあるユーザーAが可能違反に起因する場合は特に。
なぜBOF?
彼らはメモリの任意部分のデータにアクセスしたり、上書きから保護するビルトインと配列(バッファ内蔵タイプ)に書き込まれたデータがあることを確認していない何を提供していないので、プログラミング言語は、CおよびC + +の最も一般的に、バッファオーバーフローに関連付けられているその配列の境界内にある。
境界チェックが不十分なためにバッファに書き込まれたデータは、メモリ内のデータの破損に値が割り当てられたバッファに隣接して対処したときにバッファオーバーフローが発生します。別のバッファから文字の文字列をコピーするときに最も一般的にこれが発生します。
バッファオーバーフローは、特に悪意のあるコードを実行するか、プログラムが意図しない方法で動作させるために設計された入力によってトリガされることがあります。このように、バッファオーバーフローは、多くのソフトウェアの脆弱性の原因となり、多くの攻撃の基礎を形成します。プログラマは、コンパイラまたはランタイムによってチェックし、十分な境界は、バッファオーバーフローを防ぐことができます。
バッファオーバーフローの種類:
一般的な形式でバッファオーバーフローの2つのタイプは、基本的に存在する
Oスタックベースのバッファオーバーフロー
oのヒープベースのバッファオーバーフロー
ベースのバッファオーバーフローのスタック:
通常、固定長のバッファ、プログラムが意図したデータ構造体の外部プログラムの呼び出しスタック上のメモリアドレスに書き込みを行う際に、ソフトウェアでは、スタックバッファオーバーフローが発生します。実際に、そのバッファのためにそこに割り当てられていたよりも、プログラムがスタック上にあるバッファにデータを書き込むときにスタックバッファオーバーフローのバグが引き起こされます。これはほとんどの場合、スタック上の隣接するデータの破損の結果は、オーバーフローが誤ってトリガされた場合には、多くの場合、プログラムがクラッシュしたり正しく動作するようになります。オーバーフローのこのタイプは、バッファオーバーフローと呼ばれるプログラミングのバグより一般的なクラスの一部です。影響を受けるプログラムは、特別な権限で実行、またはアントラステッド·ネットワークのホスト(例えばWebサーバ)からデータを受け入れされている場合、バグが潜在的なセキュリティの脆弱性です。スタックバッファが国連の信頼されているユーザーから供給されたデータで満たされている場合は、そのユーザーが実行中のプログラムに実行可能コードを注入し、プロセスの制御を取るような方法で、スタックが破損する可能性があります。これは、コンピュータへの不正アクセスを得るために黒い帽子のために古く、より信頼性の高い方法の一つである。
ヒープベースのバッファオーバーフロー:
ヒープオーバーフローは、ヒープのデータ領域で発生するバッファオーバーフローの一種です。ヒープ上のメモリは動的に実行時にアプリケーションによって割り当てられ、通常、プログラムデータが含まれています。
搾取:
スタックベースの開発:
技術的に傾斜し、悪意のあるユーザーが次のいずれかの方法でプログラムを操作するためにスタックベースのバッファオーバーフローを悪用する可能性があります。
攻撃者が恩恵を受ける可能性のあるプログラムの動作を変更するためにスタック上のメモリにバッファ近くにあるローカル変数を上書きすることによってO。
スタックフレームにリターンアドレスを上書きすることによってO。攻撃者によって指定された関数の復帰後、実行は通常、リターンアドレスでバッファいっぱいにユーザー入力を再開します。
その後に実行される関数ポインタ、または例外ハンドラを上書きすることによってO。
"トランポリン"と呼ばれる方法では、アドレスのユーザーが入力したデータが不明であるが、場所がレジスタに格納されている場合、リターン·アドレスは、実行にジャンプするようになりますオペコードのアドレスで上書きすることができますユーザーがデータを供給しています。場所は、レジスタR、Rジャンプ、コールRまたは類似した命令のオペコードが格納されている場所へのジャンプに格納されている場合、ユーザーは供給されたデータの実行を引き起こします。適切なオペコード、またはメモリ内のバイトの位置は、DLLまたは実行可能ファイル自体に記載されています。しかし、オペコードのアドレスは、通常、任意のヌル文字を含めることはできません、これらのオペコードの場所は、アプリケーションとオペレーティングシステムのバージョン間で異なる可能性があります。唯一のWindowsオペレーティングシステムで見つかったものが表示されているもののMetasploitのプロジェクトは、適切なオペコードのそのようなデータベースです。
ヒープベースの開発:
ヒープのデータ領域で発生するバッファオーバーフローは、ヒープオーバーフローと呼ばれ、スタックベースのオーバーフローのものと異なる方法で悪用可能です。ヒープ上のメモリは動的に実行時にアプリケーションによって割り当てられ、通常、プログラムデータが含まれています。搾取は、アプリケーションがそのようなリンクリストへのポインタなどの内部構造を上書きさせるために特定の方法でこのデータを破壊することによって行われる。標準的なヒープオーバーフローの手法は、動的メモリ割り当てリンケージ(mallocなどのメタデータなど)が上書きされ、プログラムの関数ポインタを上書きするために結果のポインタ交換を使用しています。
対策:
様々な手法は、様々なトレードオフで、バッファオーバーフローを検出または防止するために使用されています。バッファオーバーフローを回避または防止するための最も信頼性の高い方法は、言語レベルでの自動保護を使用することです。保護この種のは、しかし、レガシーコードに適用され、しばしば技術的、ビジネス、または文化的な制約が弱い言語用の呼び出しはできません。以下は、バッファオーバーフローを避けるために、選択肢やメソッドです。
1。 Javaのような硬化のプログラミング言語の選択は、純
2。安全なライブラリの使用
3。実行可能な領域の保護
4。アドレス空間レイアウトのランダム化
5。ディープパケットインスペクション
6。パラメータのサニタイズ...
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿