COMMENTS (0)
댓글은 익명으로 작성되며, 삭제 비밀번호를 설정하면 본인만 삭제할 수 있습니다. 비밀번호를 설정하지 않은 댓글은 누구나 삭제할 수 있습니다.
Windows ETW(Event Tracing for Windows)의 Provider-Session-Consumer 아키텍처와 커널 내부 구조체를 분석하고, Lazarus FudModule 등 APT 그룹의 3계층 ETW 무력화 기법과 Sigma Rule 기반 탐지 방법을 설명한다.
댓글은 익명으로 작성되며, 삭제 비밀번호를 설정하면 본인만 삭제할 수 있습니다. 비밀번호를 설정하지 않은 댓글은 누구나 삭제할 수 있습니다.
2024년 2월, Lazarus 그룹의 FudModule 루트킷은 Windows 커널에서 ETW 프로바이더 95개를 선택적으로 비활성화했다. Windows Defender, Sysmon, CrowdStrike 등 주요 보안 제품이 공통으로 의존하는 텔레메트리 인프라를 정조준한 것이다.
보안 솔루션은 실행 중이었다. 그러나 이벤트를 수신하지 못했다.
ETW(Event Tracing for Windows)는 Windows에 내장된 커널 수준 이벤트 추적 시스템이다. 프로세스 생성, DLL 로드, 레지스트리 변경, 네트워크 연결까지 OS 전반의 동작을 실시간으로 수집한다.
보안 제품이 위협을 탐지하려면 "무슨 일이 일어나고 있는지" 알아야 한다. 프로세스가 생성됐는지, 어떤 DLL이 로드됐는지. 이 정보를 제공하는 커널 인프라가 ETW다.
ETW 이전에는 SSDT(System Service Descriptor Table) 후킹이 표준이었다. 각 보안 제품이 커널 함수를 직접 가로챘다. 문제는 두 제품이 같은 함수를 후킹하면 블루스크린이 발생한다는 점이었다.
Microsoft는 Windows Vista부터 PatchGuard로 SSDT 후킹을 차단했다. 대신 ETW를 공식 텔레메트리 채널로 지정했다. 결과적으로 현재 Windows 보안 생태계 전체가 ETW에 의존한다.
| 보안 제품 | ETW 활용 방식 |
|---|---|
| Windows Defender for Endpoint | 약 111개 ETW 프로바이더 구독 |
| Sysmon | DNS 이벤트를 ETW에서 수집, 나머지는 커널 콜백 후 ETW로 출력 |
| CrowdStrike Falcon | ETW-TI 프로바이더로 프로세스 인젝션 탐지 |
| Elastic Endpoint | ETW 커널 콜스택으로 직접 시스콜 우회 탐지 |
ETW를 끄면 보안 제품의 시야가 사라진다.
ETW는 세 가지 구성요소로 동작한다.
프로바이더(Provider) 는 이벤트를 생성하는 주체다. 커널 드라이버, 사용자 프로세스, Windows 구성요소가 EventRegister()로 등록하고 EventWrite()로 이벤트를 기록한다.
Windows 10 기준 1,000개 이상의 프로바이더가 등록되어 있다.
세션(Session) 은 프로바이더와 컨슈머를 연결하는 커널 객체다. 컨트롤러가 StartTrace()로 세션을 생성하고, EnableTraceEx2()로 프로바이더를 연결한다.
Microsoft 공식 문서는 이 연결의 제약을 명시한다.
A manifest-based provider or TraceLogging provider can be enabled by up to eight trace sessions simultaneously; however, a classic provider can be enabled by only one trace session at a time.
8개 세션 제한은 방어자에게 중요하다. 보안 제품이 이미 8개 슬롯을 점유하면 9번째 구독은 실패한다.
컨슈머(Consumer) 는 이벤트를 수신하는 주체다. OpenTrace()와 ProcessTrace()로 세션에서 이벤트를 읽는다.
Windows Event Log는 ETW의 컨슈머 중 하나다. ETW가 이벤트를 수집하면, EventLog 서비스가 이를 소비하여 .evtx 파일에 기록한다. 둘은 계층이 다르다.
| 구분 | ETW | Event Log |
|---|---|---|
| 계층 | 커널 수집 인프라 | ETW의 컨슈머 |
| 저장 | 메모리 버퍼 또는 ETL 파일 | .evtx 파일 |
| 실시간성 | 밀리초 단위 | EventLog 서비스 처리 후 기록 |
Security Event Log는 Microsoft-Windows-Security-Auditing 프로바이더가 생성한다. 이 프로바이더는 커널에서 직접 방출하지 않고 lsass.exe를 경유한다.
Elastic Security Labs는 이 설계의 보안 한계를 지적했다. lsass 내부에서 데이터가 변조될 수 있기 때문이다.
1단계: 프로바이더 등록
프로세스가 EventRegister()를 호출하면 NTDLL이 NtTraceControl 시스콜로 커널에 등록을 요청한다. 커널은 ETW_REG_ENTRY 구조체를 생성하고 프로바이더 GUID를 ETW_GUID_ENTRY에 연결한다.
NTDLL은 사용자 공간에도 활성화 상태를 캐싱한다. 덕분에 매번 커널로 전환하지 않고 "이 이벤트를 기록해야 하는가"를 판단할 수 있다.
2단계: 이벤트 기록
EventWrite() 호출 시, 먼저 캐시된 활성화 상태를 확인한다. 비활성이면 즉시 반환한다. 활성이면 NtTraceEvent 시스콜로 커널에 진입한다.
커널에서는 EtwpLogKernelEvent → EtwpReserveTraceBuffer 경로를 탄다. 대상 세션의 WMI_LOGGER_CONTEXT 버퍼 풀에서 공간을 확보하고 이벤트를 기록한다.
3단계: 버퍼 플러시
각 세션은 CPU별로 고정 크기 버퍼를 할당한다. 최소 4KB, 최대 16MB다. CPU별 버퍼를 사용하는 이유는 락 경합을 제거하기 위해서다.
버퍼가 가득 차거나 FlushTimer(최소 1초)가 만료되면 플러시가 발생한다. 로거 스레드가 ETL 파일에 기록하거나 실시간 컨슈머에게 전달한다. MaximumBuffers 초과 시 새 이벤트는 버려지고 EventsLost 카운터에 기록된다.
커널 모드 프로바이더는 EtwWrite()로 직접 커널 버퍼에 기록한다. 사용자 공간을 경유하지 않으므로 유저모드 패칭으로는 차단할 수 없다.
ETW의 보안을 이해하려면 커널 내부 구조체 3개를 알아야 한다. 각 구조체는 공격자가 노리는 명확한 공격 표면을 가진다.
ETW_SILODRIVERSTATE 는 ETW 전역 상태를 관리한다.
EtwpActiveSystemLoggers는 활성 시스템 로거를 나타내는 비트마스크다. 이 값이 0이 되면 EtwpLogKernelEvent가 반복문을 건너뛴다. 어떤 커널 이벤트도 컨슈머에 도달하지 못한다.
EtwpGuidHashTable은 64개 버킷의 해시 테이블이다. 등록된 모든 프로바이더의 ETW_GUID_ENTRY를 관리한다.
ETW_GUID_ENTRY 는 프로바이더 GUID당 하나씩 존재한다. ProviderEnableInfo.IsEnabled가 0이면 해당 프로바이더는 이벤트를 생성하지 않는다.
WMI_LOGGER_CONTEXT 는 세션별 커널 객체다. SecurityTrace 플래그(비트 14)가 설정된 세션은 Antimalware-PPL 프로세스만 관리할 수 있다. Windows Defender의 DefenderApiLogger와 DefenderAuditLogger가 이 보호를 받는다.
보안상 가장 중요한 프로바이더는 Microsoft-Windows-Threat-Intelligence(ETW-TI)다. 커널 함수에 직접 계측이 삽입되어 있다.
| 커널 함수 | 탐지 대상 |
|---|---|
| EtwTiLogAllocExecVm | 실행 권한 메모리 할당(셸코드) |
| EtwTiLogReadWriteVm | 원격 프로세스 메모리 쓰기(인젝션) |
| EtwTiLogMapExecView | 실행 권한 섹션 매핑(DLL 인젝션) |
| EtwTiLogInsertQueueUserApc | 원격 APC 인젝션 |
| EtwTiLogSetContextThread | 스레드 컨텍스트 변조 |
ETW-TI는 PPL(Protected Process Light) 프로세스만 구독할 수 있다. ELAM 드라이버로 서명된 보안 제품만 이 보호 수준을 획득한다. 일반 프로세스가 쿼리하면 ERROR_ACCESS_DENIED가 반환된다.
ETW-TI에도 우회 기법이 존재한다. RW→RX 패턴이다. 메모리를 PAGE_READWRITE로 먼저 할당하고 셸코드를 기록한다. 이후 VirtualProtect로 PAGE_EXECUTE_READ로 변경한다. EtwTiLogAllocExecVm은 할당 시점에 실행 권한이 있을 때만 발동하므로 초기 RW 할당은 기록되지 않는다.
AutoLogger는 부팅 시 사용자 로그온 이전에 자동 시작되는 ETW 세션이다. 레지스트리에 설정된다.
HKLM\SYSTEM\CurrentControlSet\Control\WMI\Autologger\{세션명}
EventLog-Application, EventLog-Security 같은 핵심 로그 세션이 모두 이 방식이다. 이 키를 삭제하거나 Enabled 값을 0으로 변경하면 재부팅 후 세션이 시작되지 않는다.
ETW 무력화 기법은 동작 계층에 따라 세 가지로 분류된다. 계층이 깊을수록 탐지가 어렵고 필요한 권한도 높아진다.
가장 널리 사용되는 기법이다. ntdll.dll에 로드된 EtwEventWrite 함수의 첫 바이트를 0xC3(RET)으로 덮어쓴다.
원본: mov r11, rsp → sub rsp, ... → call EtwpEventWriteFull
패칭: ret (0xC3) → 즉시 반환, 이벤트 기록 안 됨
공격 순서는 세 단계다.
GetProcAddress로 EtwEventWrite 주소를 찾는다VirtualProtect로 메모리 페이지를 쓰기 가능하게 변경한다0xC3으로 덮어쓴다이 기법은 해당 프로세스 내부에서만 유효하다. 커널 모드 프로바이더에는 영향이 없다. VirtualProtect 호출 자체가 ETW-TI에 기록될 수 있다.
Cobalt Strike 생태계에서는 BOF-patchit, injectEtwBypass 같은 Beacon Object File이 이 기법을 구현한다.
Brute Ratel C4는 다른 접근을 택했다. NtContinue를 통한 하드웨어 브레이크포인트 방식이다. 메모리를 패칭하지 않고 ETW를 우회한다. NtContinue는 EtwTiLogSetContextThread를 트리거하지 않기 때문이다.
JPCERT/CC가 2022년 분석한 APT10의 HUI Loader는 2015년부터 이 기법을 사용했다. Trend Micro가 2021년 보고한 APT41의 StealthVector와 StealthMutant는 2020년부터 ETW 비활성화를 탑재했다. Qilin 랜섬웨어의 Killer Ultra도 2024년 동일한 기법을 사용했다.
시스템 전체에 영향을 미치는 기법이다.
.NET ETW 비활성화: HKLM\SOFTWARE\Microsoft\.NETFramework\ETWEnabled 값을 0으로 설정한다. 이후 실행되는 모든 .NET 프로세스에서 CLR ETW 이벤트가 생성되지 않는다. 환경 변수 COMPlus_ETWEnabled=0도 동일한 효과를 낸다.
AutoLogger 프로바이더 제거: AutoLogger 레지스트리 키에서 프로바이더 GUID 항목을 삭제한다. 재부팅 후 해당 프로바이더가 로그 세션에서 분리된다.
Defender ETW 채널 비활성화: LockBit Black 랜섬웨어가 사용한 기법이다. Microsoft-Windows-Windows Defender/Operational 채널의 Enabled 값을 0으로 설정한다.
레지스트리 변경은 흔적을 남긴다. Sysmon Event ID 12/13이나 보안 이벤트 4657로 탐지할 수 있다.
가장 탐지가 어려운 기법이다. 커널 쓰기 권한이 필요하며 대부분 BYOVD(Bring Your Own Vulnerable Driver)로 획득한다.
기법 A — EtwpActiveSystemLoggers 제로화
EtwpActiveSystemLoggers 비트마스크를 0으로 쓴다. 모든 시스템 로거가 비활성화된다. EtwpLogKernelEvent가 반복문을 건너뛰어 커널 이벤트가 어떤 컨슈머에도 전달되지 않는다.
Lazarus의 FudModule은 ntoskrnl.exe의 .text 섹션을 스캔했다. EtwTraceKernelEvent 프롤로그의 옵코드 패턴을 찾아 mov ebx, cs:EtwpActiveSystemLoggers 명령어에서 변수 주소를 추출했다.
기법 B — ETW_GUID_ENTRY.IsEnabled 제로화
EtwpGuidHashTable의 64개 버킷을 순회하며 특정 프로바이더의 IsEnabled를 0으로 설정한다. 기법 A와 달리 선택적 비활성화가 가능하다.
FudModule은 하드코딩된 95개 프로바이더 GUID 목록을 가지고 있었다. Microsoft-Windows-Threat-Intelligence, Microsoft-Windows-Kernel-Audit-API-Calls 등 고위험 프로바이더만 끄고 나머지는 유지했다. 탐지 가능성을 줄이기 위해서다.
기법 C — WMI_LOGGER_CONTEXT 보안 플래그 제거
DefenderApiLogger와 DefenderAuditLogger 세션은 SecurityTrace 플래그로 보호된다. 이 플래그와 보안 디스크립터, 중지 불가 비트를 모두 제거하면 일반 권한으로 세션을 중지할 수 있다.
EDRSandblast가 이 기법을 자동화했다. BlackByte 랜섬웨어(2022년 10월)는 EDRSandblast의 코드를 그대로 복사했다. RTCore64.sys()와 함께 배포했으며 Sophos가 이를 확인했다.
| 공격자 | 계층 | 비활성화 범위 |
|---|---|---|
| APT10 HUI Loader | 유저모드 | 해당 프로세스 |
| APT41 StealthVector | 유저모드 | 해당 프로세스 |
| LockBit Black | 레지스트리 | Defender 채널 |
| BlackByte | 커널 | ETW-TI 프로바이더 |
| Lazarus FudModule | 커널 | 95개 프로바이더 |
2015년 APT10의 유저모드 패칭에서 2024년 Lazarus의 커널 구조체 변조까지. 공격의 계층은 점점 깊어지고 있다.
SigmaHQ에 ETW 변조 탐지 공식 룰 4개가 등록되어 있다.
ETW Trace Evasion Activity (ID: a238b5d0): logman update trace --p -ets, Remove-EtwTraceProvider 등 커맨드라인 패턴 탐지. T1562.006 매핑.
Disable of ETW Trace - PowerShell (ID: 115fdba9): Script Block Logging(Event ID 4104)에서 Remove-EtwTraceProvider와 Set-EtwTraceProvider 0x11 탐지.
ETW Session Tamper Via Logman.EXE (ID: cd1f961e): logman.exe stop/delete로 EventLog-*, SYSMON TRACE 세션을 중지하는 행위 탐지.
ETW Logging Disabled For rpcrt4.dll (ID: 90f342e1): RPC 런타임 ETW 비활성화 레지스트리 변경 탐지.
.NET ETW 비활성화를 탐지하는 핵심 쿼리다. COMPlus_ETWEnabled 환경변수 조작도 별도 룰이 존재한다.
| tstats count FROM datamodel=Endpoint.Registry
WHERE (Registry.registry_path="*\.NETFramework\ETWEnabled"
Registry.registry_value_data="0x00000000")
by Registry.dest Registry.user Registry.process_id
T1562.006에 대한 테스트 9개(Test #5~#13)가 등록되어 있다. 대표적으로 Test #5는 logman으로 PowerShell ETW 프로바이더를 제거한다.
logman update trace "EventLog-Application" --p "Microsoft-Windows-Powershell" -ets
나머지 테스트는 .NET ETWEnabled 레지스트리, Defender 채널 비활성화, COMPlus_ETWEnabled 환경변수를 커버한다.
유저모드 패칭(계층 1)은 레지스트리 흔적을 남기지 않는다. SigmaHQ에 전용 룰도 없다.
탐지하려면 두 가지 방법이 있다. ETW-TI의 EtwTiLogProtectExecVm 이벤트로 ntdll 영역의 메모리 보호 변경을 감시하거나, Sysmon Event ID 10의 CallTrace에서 UNKNOWN을 확인하는 것이다.
커널 구조체 변조(계층 3)는 더 어렵다. 커널 드라이버에서 EtwpActiveSystemLoggers 값과 ETW_GUID_ENTRY.IsEnabled 상태를 주기적으로 검증해야 한다.
ETW는 Windows 보안 텔레메트리의 단일 장애점이다. Provider → 커널 버퍼 → Consumer 파이프라인의 어느 지점이든 차단되면 보안 제품은 이벤트를 수신하지 못한다.
핵심 방어 원칙 3가지:
관련 글: Windows Event Logging 비활성화: APT 2개 그룹이 추적을 차단하는 원리
AI 활용 안내 이 글은 AI(Claude)의 도움을 받아 작성되었습니다. 인용된 통계와 사례는 참고 자료에 명시된 출처에 근거하며, 설명을 위한 일부 표현은 각색되었습니다.
면책 조항 본 글은 보안 인식 제고를 위한 교육 목적으로 작성되었습니다. 언급된 공격 기법을 실제로 시도하는 행위는 「정보통신망법」, 「형법」 등에 따라 처벌받을 수 있으며, 본 블로그는 이에 대한 법적 책임을 지지 않습니다.