結局のところ、Windows Portable Executable形式でウイルス、マルウェア、ワーム、コードインジェクションがどのようにそしてなぜ成功するかを理解しようとしています。 PE構造のドキュメント Part 1 および Part 2 を調べていました。
それはPE実行可能ファイルで何ですか、ヘッダー、コードインジェクションを発生させるセクションですか?なぜそれらは実行可能なコードの変更と注入に対して脆弱なのですか?言い換えれば、ウイルスやマルウェアはどのようにしてそれ自体または他の悪意のあるコードをPEファイルまたはメモリプロセスに挿入するのでしょうか。
ポータブル実行可能(PE)ファイルは、EXEファイル、DLL、スクリーンセーバー、ドライバーなど、さまざまな種類のオブジェクトを記述できます。すべてのPEファイルには一連のヘッダーがあり、その後に一連のセクションがあります。
ヘッダーとテーブルは、実行可能ファイルのタイプ、それがサポートする機能、それが呼び出すAPIなどを記述します。これらのセクションは、PEローダーにファイルデータをメモリにマップする方法を伝えます。
3つのメインヘッダーと2つのメインテーブルがあります。
OSがPEファイルをロードすると、セクションテーブルで指定されたアドレス、サイズ、およびフラグを使用して、セクションごとに仮想メモリのブロックを作成し、ファイルからこれらのメモリセクションにデータをコピーします。コードとデータの2つの特別なセクションがあります。コードおよびデータセクションは、PEヘッダーのBaseOfCode
およびBaseOfData
フィールドで識別され、それぞれCS
およびDS
セグメントレジスタに割り当てられます。次に、eip
レジスター(または64ビットではrip
)が、PEヘッダーのAddressOfEntryPoint
フィールドで指定された値に設定され、プログラムが開始します。
PE形式は、変更に対して耐性があるように設計されていません。ファイルレベルでコードインジェクションを行うベクトルは多数あります。
AddressOfEntryPoint
を変更して新しいセクションを指すようにします。これでコードを実行して、元のエントリポイント(OEP)に戻ることができます。 EPはコードセクションの外側を指しているため、AVがこれを検出するのは簡単です。ご覧のように、攻撃者がPEファイルへの書き込みアクセス権を持っている場合、攻撃者はコードを簡単に挿入できます。これに対する最良の保護は、デジタル署名であり、PEファイルのセキュリティディレクトリ内で管理されます。デジタル署名は基本的に、信頼できるプロバイダー、または信頼できる認証局のプロバイダーによって署名された証明書です。この証明書はPEファイルに埋め込まれ、データと正確に一致します。 PEファイルを変更するか、署名を変更すると、PEローダーはファイルを拒否します。もちろん、ファイルから署名を取り除くだけで、証明書なしで実行することもできます。これは、すべての実行可能ファイルに署名することを要求するフラグを設定できるローカルポリシーによって防止できます。
残念ながら、これがコードを注入する唯一の方法ではありません。別の方法は、実行時にメモリをプロセスに注入し、そのプロセス内でリモートスレッドを開始することです。これはWindowsでは比較的簡単です。
PROCESS_VM_WRITE
、PROCESS_VM_OPERATION
、およびPROCESS_CREATE_THREAD
特権を使用して、ターゲットプロセスでOpenProcess
を呼び出します。VirtualAllocEx
を呼び出して、リモートプロセスに実行可能メモリのブロックを割り当てます。WriteProcessMemory
を使用して、そのメモリにコードを書き込みます。CreateRemoteThread
を呼び出して、割り当てられたメモリのベースをスレッドエントリポイントとして使用し、プロセスで新しいスレッドを開始します。これにより、ターゲットプロセスのコンテキストでコードが実行されます。ただし、これはステップ1が成功した場合にのみ可能であり、これは悪意のあるプロセスが他のプロセスにアクセスできることに依存しています。特権の低いユーザーは、特権の高い(管理者など)ユーザーのプロセスに対してこのようなハンドルを開くことはできません。ただし、悪意のあるプロセスが高い特権で実行されている場合、すべての賭けは無効になります。
悪意のあるアプリケーションがプロセスと実行可能ファイルへの書き込みアクセスで実行されると、これらの攻撃からユーザーを保護するためにできることはほとんどありません。