MalwareTechは12月25日(米国時間)、「An Introduction to Bypassing User Mode EDR Hooks」において、マルウェアがユーザーモードのエンドポイント検出応答(EDR: Endpoint Detection and Response)をバイパスする手法について解説した。
EDRがマルウェアを検出する仕組み
EDRは未知のマルウェアを検出するため、APIフックと呼ばれる技術を利用することがある。APIフックとは、システムが提供するAPI(Application Programming Interface)の処理を差し替える技術で、APIが呼び出されると即座に別の処理に移動し、処理を完了してから元のAPI処理に戻る技術のこと。
EDRはAPIフックを使用してマルウェアの不正な要求を検出する処理をシステムのAPIに挿入し、悪意のある処理を検出して未知のマルウェアの活動を妨害する。
従来のEDRでは、Windowsの「System Service Descriptor Table(SSDT)」と呼ばれるカーネル内部に存在するAPI関数のアドレステーブルを差し替えるAPIフックが使用されていた。Microsoftは2005年、カーネルパッチ保護(別名:PatchGuard)と呼ばれるカーネル保護機能を導入し、SSDTの変更を禁止した。
これを受けて、EDRはユーザーモードで動作する「ntdll.dll」内部に存在するAPI関数の呼び出し処理の先頭部分を書き換える方式に変更。アプリケーションがAPIを呼び出すと、ntdll.dllからエンドポイント検出応答のセキュリティチェック処理に移動し、チェックを完了してから元のAPI関数の呼び出し処理に戻る仕組みとなった。
マルウェアがEDRを回避する仕組み
このようなマルウェアを検出する仕組みに対し、マルウェアもさまざまな回避策を開発している。それらのうち、最も簡単なものは、ユーザーモードとしてメモリ空間に読み込まれるntdll.dllを元に戻す方法だという。マルウェアはVirtualProtect()を使用してメモリへの書き込みを可能にしてからエンドポイント検出応答が書き換えたntdll.dllの処理を元に戻す。これだけで検出を回避できる。
EDRもこのような回避策は想定しており、定期的にntdll.dllの変更を検証する対策がなされている。この定期的な検証はカーネルモードの処理で行われるため、マルウェアがこれを回避することは困難とされる。このほか、システムコール番号を計算して直接呼び出す方法や、滅多に変更されないシステムコール番号をハードコーディングして呼び出す方法も紹介されている。