数日前、FireEyeに脆弱性が見つかりました。この問題に関しては、IE(最新の11でも)の)すべてのバージョンに影響を及ぼします Microsoftの公式声明 。
FireEyeは、詳細を説明する ブログの技術記事 を作成しました。
このエクスプロイトは、これまで知られていなかった解放後使用の脆弱性を利用し、有名なFlashのエクスプロイト手法を使用して任意のメモリアクセスを実現し、WindowsのASLRおよびDEP保護を回避します。
そして搾取。要点は理解できたと思いますが、もっと簡単に説明して頂ければ幸いです。私はopenSslのハートブリードの脆弱性に関する説明を読んで本当に楽しんでおり、誰かが同じように説明できることを願っています。
質問者やここにいるすべての人がどのレベルの技術的能力を身につけているのか、私にはまったくわからないので、一番下から始めて、できる限り簡単な言語で作業してみてください。コンピュータサイエンスの修士号を取得している場合や、ROPの伝説などを持っている場合は、気分を害さないでください...
問題のエクスプロイトを理解するには、基本的なレベルでも、コンピューターの計算方法をある程度理解する必要があります。つまり、「ストアドプログラム制御」マシンの基本を理解する必要があります。それをある程度理解したら、一般的なバッファオーバーフロー攻撃について説明します。次に、バッファオーバーフローを理解すると、これらの両方のことを理解できたので、これらの高度な手法のいくつかを利用した比較的高度な例ではなく、特定の例を見て、実際にそれらを詳細に理解したいと思います。
一番下から始めて、コンピューターの計算方法またはプロセッサーの処理方法について簡単に説明しましょう...コンピューターにはCPUがあり、CPUにはさまざまなレジスターがあり、そこに直接数学演算を実行できます。コンピューターには、プログラムが読み込まれて実行されるメモリもあります。命令ポインタと呼ばれる特別なレジスタがあり、現在の実行中のプログラムの命令が配置されているメモリ内の場所をポイントするのが、CPUが命令をフェッチして実行できるようにする役割です。これは、ジャンプ、分岐、または戻りなどに到達するまで、1つずつ命令を実行します。次に、メモリ内の別の場所を指すように命令ポインタを変更し、実行を継続します。この命令ポインタは非常に重要です。それをハイジャックできる場合は、メモリ内の他の場所に置いたものをコンピュータで実行できる可能性があります。 「Got EIP?」というTシャツを見たことがありますか。それがここで話していることです。 EIPを制御できれば、機械を制御できます。
ここで、この「マシンレベル」から少し「上」に移動します。最近のほとんどのプログラミング言語には、このサブルーチン呼び出しの概念があります。これにより、命令ポインタが関数のコードが配置されているメモリの新しい領域にジャンプします。関数は完了するまで実行され、その後、制御はメインプログラムに戻り、命令ポインターがメイン関数内で実行が中断された場所に戻されます。それを少し単純化するために、このプログラムを実行し、関数呼び出しに到達するまで実行します。関数呼び出しは、メモリ内の別の場所に実行を移動します。その後、復帰するまで新しい場所で実行されます。その時点で、メイン関数に戻る必要があります。マシンがその初期値、初期命令ポインタの値を覚えていることは明らかです。それ以外の場合は、ここに戻ることがわかりません。これはリターンポインタと呼ばれます。したがって、戻りポインタには呼び出し元の関数のアドレスが含まれ、スタックと呼ばれる(メモリ内の)データ構造に格納されます。スタックはLIFO=の方法で動作します。後入れ先出し、つまり「スタック」と呼ばれる理由です。最後のものは最初のものです。通常、スタックには、関数呼び出し。スタックは、覚えておく必要のあるちょっとした投稿のようなものだと考えてください。関数呼び出しが行われると、スタックに最初にプッシュされるのは、関数呼び出しの引数です。次に、スタック上のメインプログラムの命令ポインターの値(戻りポインター)をプッシュします。次に、関数自体が呼び出され、関数自体のローカル変数用にスタック上のスペースを割り当てます。関数は、次のことを行うまで、その時点で、これらのローカル変数がスタックから(ポップ)され、その後、リターンポインターがポップオフされ、もう一度、それが命令ポインターとして設定され、メインプログラムの実行に戻ります。これは文字通り、目の前のコンピューターで毎秒数百万回発生しています。
ここで、バッファオーバーフローのバグについて説明します。コードエラーと呼ばれるバグのクラスでバッファオーバーフローが発生します。バッファオーバーフローは何十年も前から知られていましたが、Phrack誌の第49号に掲載された「Smashing the Stack for Fun and Profit」と呼ばれる独創的な論文が1996年に登場するまで主流にはなりませんでした。今日でも読む価値があります。バッファオーバーフローにより、攻撃者はターゲットマシンにデータを送信し、いくつかのコードを実行することができます。つまり、ボックスでroot/adminを取得します。一部はローカルで動作し、他はネットワーク全体で動作します。基本的な考え方は、ユーザー入力を受け入れるが、移動する前にデータのサイズを適切にチェックしないプログラムです。これは、入力フィールドの適切な境界チェックがないことについてです。非常に大きなものを小さな箱に押し込むことを考えてください。単純さと簡潔さの両方を目的として、いくつかの脆弱なCコードの実際の例には触れません。後者のコードはおそらくすでに非公開になっています。
数時間後にもう一度確認してください。今すぐ行かなければなりません。戻ります。問題となっている特定のエクスプロイトについてお話します。このサイトのこの非典型的または通常の動作であれば、私はここに新しいです。ほんの数回しかありませんでした。
私は簡単にしようとします。ブラウザのエクスプロイトはクライアント側の脆弱性であり、ブラウザのサンドボックス環境とOSをバイパスしてマシンで昇格された特権を取得するために使用される可能性があります。
解放後使用の脆弱性:UAFは、ほとんどすべての一般的なブラウザーに頻繁に現れる典型的なブラウザーの脆弱性です。この脆弱性では、攻撃者は最初にJavaScriptオブジェクトを作成し、次にそれを削除します。オブジェクトが削除または解放されると、スクリプトは同じオブジェクトへのアクセスを再試行します。これにより、ブラウザ内のメモリが破損します。現在、ポインタを制御するためにメモリの場所を正確に特定するために、攻撃者は ヒープスプレー または リターンオリエンテッドプログラミング(ROP) などのメモリスプレーテクニックを使用しています。オペレーティングシステムの種類に基づいて、攻撃者はさまざまな手法を適用してメモリにジャンクデータを散布し、悪用に成功した後にペイロードを起動します。
私は簡単にしようとしました。お役に立てば幸いです。