DLL Injection: 가장 오래되고 가장 많이 쓰이는 프로세스 인젝션 기법 | T1055.001
Andariel이 한국 ERP 업데이트 서버를 침해해 explorer.exe에 DLL을 인젝션했다. 4단계 API 호출 구조와 Sysmon 탐지 포인트.
Andariel이 한국 ERP 업데이트 서버를 침해해 explorer.exe에 DLL을 인젝션했다. 4단계 API 호출 구조와 Sysmon 탐지 포인트.
MITRE ATT&CK: T1055.001 (Dynamic-link Library Injection) | 전술: Defense Evasion, Privilege Escalation | 플랫폼: Windows
DLL Injection은 프로세스 인젝션(T1055)의 12개 하위 기법 중 가장 오래되고 가장 널리 사용되는 방법이다. 원리는 단순하다. 실행 중인 다른 프로세스의 메모리 공간에 DLL 파일을 강제로 로드시킨다. 공격자의 코드가 svchost.exe나 explorer.exe 같은 정상 프로세스 안에서 실행되므로, EDR 로그에는 신뢰할 수 있는 프로세스의 정상 활동으로 기록된다.
공격자가 이 기법을 선택하는 이유는 두 가지다. 첫째, 별도의 악성 프로세스를 생성하지 않아 프로세스 목록에서 눈에 띄지 않는다. 둘째, 대상 프로세스의 보안 토큰과 네트워크 권한을 그대로 상속받는다.
DLL Injection의 핵심은 Windows API 4개를 순서대로 호출하는 것이다.
OpenProcess. 대상 프로세스의 핸들을 획득한다. PROCESS_ALL_ACCESS 권한이 필요하며, 보호된 프로세스에 접근하려면 SeDebugPrivilege를 활성화해야 한다.
VirtualAllocEx. 대상 프로세스의 가상 주소 공간에 메모리를 할당한다. DLL 경로 문자열을 기록할 공간이다.
WriteProcessMemory. 할당된 메모리에 악성 DLL의 전체 경로를 기록한다.
CreateRemoteThread. 대상 프로세스에서 새 스레드를 생성하고, LoadLibrary 함수를 호출해 기록된 경로의 DLL을 로드한다. 이 순간 DLL의 DllMain이 실행되며 공격자의 코드가 대상 프로세스 안에서 동작한다.
클래식 DLL Injection은 디스크에 DLL 파일이 존재해야 한다. 리플렉티브 DLL Injection은 이 제약을 제거한다.
2008년 Stephen Fewer가 발표한 이 기법은 DLL 자체에 ReflectiveLoader 함수를 내장한다. 이 함수가 Windows 로더를 대신해 메모리 안에서 직접 DLL을 로드한다. PEB를 파싱해 kernel32.dll의 주소를 찾고, VirtualAlloc으로 메모리를 할당하고, PE 헤더와 임포트 테이블을 처리한 뒤 DllMain을 호출한다.
디스크에 파일이 생성되지 않으므로 파일 기반 스캐너를 우회한다. Windows 모듈 데이터베이스에도 등록되지 않아 외부에서 조회할 수 없다. 프로세스를 종료하면 메모리에서 사라지기 때문에, 메모리 포렌식 없이는 흔적을 확보하기 어렵다. Cobalt Strike는 4.x 버전부터 이 기법을 기본 지원한다.
2024년 5월, Lazarus의 하위 그룹 Andariel이 한국 ERP 솔루션의 업데이트 서버를 침해했다. AhnLab ASEC가 분석한 공격 체인은 다음과 같다.
변조된 ERP 업데이트 프로그램(ClientUpdater.exe)이 Regsvr32.exe로 악성 DLL을 실행한다. Xctdoor 악성코드는 explorer.exe에 자신을 인젝션하고, C2 서버(195.50.242[.]110:8080)와 통신한다. 인젝션된 DLL 경로는 Microsoft Edge 패키지 폴더로 위장돼 있었다.
한국 방산·제조업이 표적이었다.
Kimsuky는 악성 첨부파일로 초기 접근한 뒤, PowerShell과 VBScript로 Dropbox를 경유해 추가 페이로드를 다운로드했다. 악성 DLL 경로를 explorer.exe의 가상 주소 공간에 기록하고, CreateRemoteThread로 원격 스레드를 생성해 DLL을 로드했다. 최종 페이로드는 TruRat이었다.
| 그룹 | 초기 접근 | 인젝션 방식 |
|---|---|---|
| Andariel | ERP 업데이트 서버 침해 | explorer.exe에 Xctdoor 인젝션 |
| Kimsuky | 스피어피싱 첨부파일 | explorer.exe에 DLL 인젝션 (CreateRemoteThread) |
| Lazarus | 가짜 채용 PDF | 정상 EXE로 DLL 사이드로딩 + 리플렉티브 로딩 |
2025년 3월, ESET은 Lazarus가 유럽 방산·항공우주 기업을 대상으로 Operation DreamJob을 재개한 것을 확인했다. 가짜 채용 PDF로 초기 접근한 뒤, 정상 Microsoft 실행 파일(wksprt.exe)이 악성 DLL(webservices.dll)을 사이드로딩하도록 설계했다. 로드된 DLL은 리플렉티브 기법으로 ScoringMathTea RAT을 메모리에 직접 로드했다.
DLL Injection은 반드시 크로스 프로세스 메모리 조작을 수행한다. 이 과정에서 피할 수 없는 흔적이 남는다.
Sysmon Event ID 8 (CreateRemoteThread). 원격 프로세스에 스레드를 생성하는 행위를 기록한다. 정상적인 소프트웨어가 원격 스레드를 생성하는 경우는 드물다.
Sysmon Event ID 10 (ProcessAccess). PROCESS_VM_WRITE 또는 PROCESS_ALL_ACCESS 권한으로 다른 프로세스에 접근하는 행위를 포착한다.
MITRE 공식 탐지 전략 (DET0389). VirtualAllocEx → WriteProcessMemory → CreateRemoteThread 순서의 API 호출 상관 분석으로 DLL Injection을 탐지한다.
Mavinject Inject DLL Into Running Process (심각도: high)
detection:
selection:
CommandLine|contains: /INJECTRUNNING
filter:
ParentImage: C:\Windows\System32\AppVClient.exe
condition: selection and not filter
mavinject.exe는 App-V 패키지 관리용 Windows 정식 도구다. /INJECTRUNNING 플래그로 실행 중인 프로세스에 DLL을 인젝션할 수 있다. App-V 환경이 아닌 곳에서 이 명령이 실행되면 악성 사용을 의심해야 한다.
Sigma 룰은 참고용 탐지 로직이며, 환경별 로그 소스 매핑과 오탐 필터링이 필요하다.
Process Injection via mavinject.exe
$mypid = (Start-Process notepad -PassThru).id
mavinject $mypid /INJECTRUNNING "C:\AtomicRedTeam\atomics\T1055.001\src\x64\T1055.001.dll"
Stop-Process -processname notepad
notepad를 실행하고 DLL을 인젝션하는 테스트다. 탐지 룰 검증에 활용할 수 있다.
격리된 테스트 환경에서만 실행해야 한다.