악성코드 분석 2026-04-22
TA416은 중국과 연계된 위협행위자로 2012년에 처음 식별되어 미국·유럽·아시아 전역의 정부, 외교기관, 비정부기구(NGO), 싱크탱크, 종교 기관, 연구 기관 등을 주요 표적으로 삼아왔다. 그러다 2023년 중반부터 2025년 중반까지 유럽에 대한 활동을 멈추고 동남아시아, 대만, 몽골을 대상으로 활동하였으나 2025년 중반 이후부터는 EU 및 NATO 외교 공관과 연계된 인원을 표적으로 삼는 등 유럽을 대상으로 활동을 재개하였다.
TA416에서 사용한 배포 체인 중 하나는 악성코드 배포 캠페인으로, 유럽 특정 국가 내무부 및 동남아시아 외무부 소속으로 추정되는 침해 계정일부를 발신자로 활용하였으며, Microsoft Azure Blob Storage, 악성 도메인, Google Drive, 침해된 SharePoint 인스턴스에 호스팅된 악성 아카이브 링크를 피싱 이메일을 통해 전달했다.
<그림 1> 악성 아카이브 링크가 포함된 피싱 메일
또 다른 배포 체인으로는 *웹 버그 캠페인으로, 인도주의를 고려한 주제, 인터뷰 요청, 협업 제안 등 외교 관계자의 관심을 유도하기 쉬운 주제를 미끼로 사용하여 메일을 발송했다. 각 메일에는 수신자별 식별 코드가 포함된 URL 또는 이미지 파일명이 삽입되어, 공격자가 특정 표적의 이메일 열람 및 클릭 여부를 식별할 수 있도록 설계되었다.
*웹 버그 : 이메일에 삽입된 비가시적 객체로, 수신자가 이메일을 열람함과 동시에 원격 서버에 자동으로 접속하게 만들어 IP 주소, 사용자 에이전트, 접근 시간 등의 정보를 공격자에게 노출시키는 기법
2025년 말부터 2026년 초에 걸쳐 TA416은 다양한 기술적 배포 체인을 순환 적용하였으나, 최종 목표는 단 하나로 일관되었다. 바로 *DLL 사이드 로딩 트라이어드(Sideloading Triad) 방식을 통한 커스텀 PlugX 백도어의 메모리 로드이다.
<그림 2> 25년 9월부터 26년 3월까지의 TA416 감염 프로세스 (출처 : proofpoint)
*DLL 사이드 로딩 트라이어드 : 서명된 정상 프로그램이 실행될 때 사이드 로딩으로 실행되는 DLL이 동일 폴더에 있는 세번째 파일에 저장된 최종 페이로드를 실행하는 기법
<그림 3> DLL 사이드 로딩 트라이어드
공격자는 Microsoft 로그인 흐름을 위장한 가짜 Cloudflare Turnstile 랜딩 페이지를 제작하여 ZIP 아카이브로 리다이렉트 시킨다. 해당 아카이브에는 LNK 파일이 포함되었으며, 이를 통해 서명된 실행 파일, 악성 DLL, 암호화된 페이로드로 구성된 사이드로딩 패키지가 드롭되어 최종적으로 PlugX가 메모리에 인젝션되는 구조다.
<그림 4>는 초기 버전으로 체크박스를 클릭했을 때 브라우저에서 토큰을 반환하는데, 공격자는 해당 토큰이 봇인지(보안회사의 크롤러 등), 사람인지 확인하지 않고 악성 아카이브 파일을 다운로드 할 수 있는 사이트로 리다이렉트 시킨다.
<그림 5>는 후기 버전으로, 가짜 Trunstile 페이지에서 발급받은 토큰을 URL 파라미터에 달아서 C2서버로 전송한다. 요청을 전달받은 C2서버는 토큰을 통해 사람인지, 봇인지 판별한 뒤, 진짜 사용자라면 악성 ZIP 파일을 다운로드 받을 수 있도록 한다.
<그림 4> TA416이 사용한 가짜 Cloudflare Turnstile 랜딩 페이지
<그림 5> 가짜 Cloudflare Turnstile 랜딩 페이지에 사용된 리다이렉트 로직
가짜
Cloudflare
Turnstile를
통해서 다운로드 받아진 ZIP
파일
내부에는 하나의 LNK
파일이
존재하며,
LNK 파일은 실행 시 내장된 PowerShell
명령어를
실행해 최초의 ZIP
파일(다운로드
받은 파일)을
검색한 다음,
하드코딩된
오프셋을 사용하여 ZIP파일에서
MSI
또는
TAR
파일을
추출하고,
TAR 파일
내에 포함된 MSI
또는
EXE
파일을
실행한다.
<그림
6>은
최초로 다운로드 된 압축파일로 LNK
파일
하나로 구성된 것을 알 수 있다.
압축파일
내부의 LNK파일은
사용자의 실행을 유도하기 위해 PDF로
위장하였다.
<그림 6> 최초 다운로드 된 압축파일
<그림 7> PDF로 위장한 LNK 파일
<그림 8>은 LNK 파일의 명령어로, PowerShell 명령어를 사용하여 원본 압축파일의 데이터를 0x311 ~ 0x103510 만큼 추출해서 ”kysvoxszct.ta” 이름으로 %TEMP% 경로에 저장한 뒤 해당 데이터 압축을 푼다. 압축파일 내부의 폴더는 cnmpaui.exe(서명된 정상 exe 파일), cnmpaui.dll(DLL 사이드로딩을 위한 악성 DLL), cnmplog.dat(암호화 된 PlugX) 이렇게 3가지 파일로 구성된다.
<그림 8> LNK 파일 내부 명령어
<그림 9> 최초 다운로드 받은 ZIP 파일에서 추출된 압축파일
LNK
파일은
최초 ZIP
파일에서
TAR
데이터를
추출하고
압축을
해제한 뒤,
TAR 내의
cnmpaui.exe
파일을
실행시킨다.
cnmpaui.exe는
서명된 정상파일로,
실행
시 cnmpaui.dll(DLL
사이드
로딩을 통해 실행되는 악성 DLL)을
로드한다.
<그림 10> cnmpaui.exe – DLL 사이드 로딩
cnmpaui.dll이
사이드 로딩을 통해 실행되면 TAR에
같이 포함돼있던 cnmplog.dat
(암호화
된 PlugX)를
복호화한
뒤 실행시킨다.
PlugX
는
RC4로
암호화 되어 있으며,
복호화
시 사용되는 KEY는
다음과 같다.
-
KEY :
HMHIdidbzfTrfcIt
<그림 11> cnmpaui.dll - dat 파일 복호화
<그림 12> 복호화 된 PlugX
PlugX는 지속성 유지 및 C2서버에 연결하여 명령어를 받아서 실행하는 백도어로, 분석을 방해하기 위해 API 해싱(함수 이름 숨기기), 정크코드, 제어 흐름 평탄화(코드의 실행 순서 뒤섞기)의 기법을 사용하였다.
PlugX가 실행되면 최초 PDF로 위장한 LNK파일을 위한 위장용 PDF를 생성한 뒤 실행한다.
<그림 13> PDF 데이터
<그림 14> 자동 실행 된 PDF
이후 악성코드는 다음 경로에 자가복제를 수행하고, 지속성을 위해 레지스트리에 자동실행 등록한다. 복제되는 경로는 총 4가지가 있으며 자동실행 등록 시 더미값을 추가해서 등록한다.
[복제 경로]
- %PROGRAMDATA\SamsungDriver
- %PROGRAMDATA\Intelnet
- %APPDATA%\Roaming\VirtualFile\
- %APPDATA%\Roaming\SecurityScan
<그림 15> 레지스트리 자동실행 등록
이후 명령어 수행을 위해 C2서버와 통신을 수행한다. <그림 17>을 보면 C2 도메인의 cseconline[.]org의 IP를 알아내기 위해 DNS 질의를 반복적으로 수행하고 있다. 현재 해당 악성 도메인은 글로벌 보안 조치(Takedown)에 의해 로컬호스트(127.0.0.1)로 싱크홀링 처리되어 있다. 이로 인해 실제 C2 서버와의 연결은 원천 차단된 상태지만, 네트워크 패킷 상에서는 악성코드가 지속적으로 C2 통신을 시도하는 행위를 확인할 수 있다.
<그림 16> C2서버 연결을 위한 문자열
<그림 17> 지속적 통신 시도
<그림 18>은 PlugX 변종에서 나온 또 다른 C2서버와의 통신 패킷으로 네트워크 기반 탐지를 회피하기 위해 커스텀 HTTP 헤더를 삭제했으며, 쿠키 헤더에 인증 암호를 넣어 쿠키로 위장했다. 또한 URL 경로를 무작위로 생성하여 보안 장비 단에서 URL 기반 차단 룰을 생성할 수 없게한다.
<그림 18> PlugX 변종의 통신 패킷
C2서버와 연결을 성공한다면 HTTP GET 요청을 전송하여 통신을 시작한다. 클라이언트는 감염된 PC의 정보를 담은 SYSINFO 구조체를 생성해 RC4로 암호화한 뒤 C2서버로 전송한다.
| 구조체 | 설명 |
|---|---|
| is64bit | 64비트 운영체제인지 확인 |
| dwMajorVersion | os 메이저 버전 |
| dwMinorVersion | os 마이너 버전 |
| dwBuildNumber | os 빌드 버전 |
| wServicePackMajor | 서비스 팩 메이저 버전 |
| wServicePackMinor | 서비스 팩 마이너 버전 |
| wSuiteMask | 제품군 마스크 |
| user_name | 사용자 이름 |
| computer_name | 컴퓨터 이름 |
| id | 피해자 식별자 |
| ip_address | 피해자 IP 주소 |
[표 1] SYSINFO 구조체
피해자 정보를 전달받은 C2서버는 명령어와 매개변수를 포함하는 데이터를(RC4로 암호화 됨) 응답으로 보낸다.
| 명령어 | 설명 |
|---|---|
| 0x00000002 | SYSINFO 구조체 전송 |
| 0x00001005 | 악성코드 제거 |
| 0x00001007 | 재연결 시간 조정 |
| 0x00003004 | 새로운 페이로드 SET(EXE, DLL, DAT) 다운로드 및 실행 |
| 0x00007002 | 리버스 쉘 사용 |
[표 2] 명령어 목록
TA416의
PlugX
백도어는
Canon
IJ Printer Assistant Tool 등
실제 벤더의 디지털 서명이 유효한 정상 실행 파일을 악용하여, 운영체제와 보안 솔루션이 이를 신뢰 가능한 프로세스로 인식하도록
설계되었다.
특히
Cloudflare
Turnstile 인증
페이지를 정교하게 모방한 랜딩 페이지를 통해 표적이 자발적으로 악성 아카이브를 내려받도록 유도함으로써,
사용자의
보안 인식마저 공격 표면으로 활용하는 사회공학적 기법의 정교함을 보여준다.
TA416은
DLL
사이드
로딩 트라이어드
구조를 통해 악성 행위를 정상 프로세스 내부에 완전히 은닉하고, RC4 암호화된
PlugX
페이로드를
PDF
위장
파일로 위장하여 사용자의 의심을 분산시킨다.
또한
PlugX는
실행 후 SamsungDriver·Intelnet
등
정상 소프트웨어를 연상시키는 경로에 자가복제하고 레지스트리에 더미값과 함께 자동실행을 등록하여, 포렌식 분석과 수동 탐지를 동시에 방해하는 이중 지속성 구조를 취한다.
이번
TA416의
사례는
"디지털
서명된 정상 프로그램에 대한 암묵적 신뢰"가
가장 치명적인 공격 표면이 될 수 있다는 것을 보여준다. 따라서 보안 정책은 파일의 서명 유효성이나 정상 프로세스 여부가
아닌,
실행
시점의 실제 행위와 메모리 내 코드 흐름을 기준으로 판단하는 방향으로 고도화되어야 한다.