Axios 공급망 내부의 보안 침해 - 하나의 RAT가 모든 것을 지배합니다.

Elastic Security Labs, 통합된 크로스 플랫폼 RAT를 제공하는 axios npm 패키지의 공급망 침해 사례 분석

Inside the Axios supply chain compromise - one RAT to rule them all

Elastic Security Labs는 Axios 공급망 침해에 대한 초기 분류 및 탐지 규칙을 발표했습니다. RAT 및 페이로드에 대한 자세한 분석입니다.

서문

Elastic Security Labs는 매주 약 100 백만 건의 다운로드가 발생하는 JavaScript 에코시스템에서 가장 많이 의존하는 패키지 중 하나인 axios npm 패키지의 공급망 침해 사례를 확인했습니다. 공격자는 관리자 계정을 손상시키고 악성 설치 후크를 통해 크로스 플랫폼 원격 액세스 트로이 목마를 macOS, Windows 및 Linux 시스템에 전달하는 백도어 버전을 게시했습니다.

핵심 사항

  • 손상된 npm 관리자 계정(jasonsaayman)은 널리 사용되는 Axios HTTP 클라이언트의 두 가지 악성 버전, 즉 1.14.1(최신 태그)과 0.30.4(레거시 태그)를 게시하는 데 사용되었으며, 이는 기본 npm 설치 axios가 백도어된 패키지로 해결됨을 의미합니다.
  • 악성 자바스크립트는 macOS, Windows 및 Linux용 플랫폼별 2단계 임플란트를 배포합니다.
  • 세 가지 2단계 페이로드는 모두 동일한 C2 프로토콜, 명령 세트, 비콘 케이던스, 스푸핑된 사용자 에이전트 등 동일한 RAT를 구현한 것으로, PowerShell(Windows), C++(macOS), Python(Linux)으로 작성되었습니다.
  • 드로퍼는 자신을 삭제하고 패키지.json을 깨끗한 사본으로 교체하여 포렌식 방지 정리를 수행하여 설치 후 트리거의 증거를 다음에서 지웁니다. node_modules

서문

3월에 30, 2026, Elastic Security Labs는 자동화된 공급망 모니터링을 통해 axios npm 패키지를 대상으로 하는 공급망 침해를 탐지했습니다. 공격자는 프로젝트의 주요 관리자 중 한 명인 jasonsaayman의 npm 계정을 장악하고 39분 동안 두 개의 백도어 버전을 게시했습니다.

axios 패키지는 자바스크립트 생태계에서 가장 널리 사용되는 HTTP 클라이언트 라이브러리 중 하나입니다. 발견 당시 최신 및 레거시 배포 태그는 모두 손상된 버전을 가리키고 있었으며, 대부분의 신규 설치는 백도어 릴리스를 가져온 것으로 확인되었습니다.

악성 버전은 설치 후 후크가 sfrclak[.]com:8000에서 플랫폼별 2단계 RAT 임플란트를 조용히 다운로드하고 실행하는 특수 제작된 패키지인 plain-crypto-js라는 하나의 새로운 종속성을 도입했습니다.

이 캠페인이 폭발 반경을 넘어 주목할 만한 점은 2단계 툴링입니다. 공격자는 동일한 RAT의 세 가지 병렬 구현(Windows, macOS 및 Linux용 각각 하나씩)을 배포했으며, 모두 동일한 C2 프로토콜, 명령 구조 및 비콘 동작을 공유했습니다. 이것은 서로 다른 세 가지 도구가 아니라 플랫폼 네이티브 구현이 포함된 단일 크로스 플랫폼 임플란트 프레임워크입니다.

Elastic Security Labs는 3월 31일에 axios 리포지토리 ( 2026 01:50 오전(UTC )에 공개를 조율하고 관리자와 npm 레지스트리가 손상된 버전에 대해 조치를 취할 수 있도록 했습니다.

커뮤니티가 소셜 미디어에 이 침해 사실을 신고하자, Elastic Security Labs는 방어자들이 실시간으로 대응할 수 있도록 초기 조사 결과를 공개적으로 공유했습니다.

이 게시물에서는 npm 수준의 공급망 침해부터 난독화된 드롭퍼, 크로스 플랫폼 RAT의 아키텍처와 세 가지 변종 간의 의미 있는 차이점까지 전체 공격 사슬을 다룹니다.

캠페인 개요

npm 레지스트리 메타데이터에서 손상된 것이 분명합니다. 관리자 이메일은 이전의 모든 합법적인 릴리스에 있던 jasonsaayman@gmail[.]com 에서 악성 버전에서는 ifstap@proton[.]me 으로 변경되었습니다. 게시 방법도 변경되었습니다:

버전게시자Method출처
axios@1.14.0 (합법적)jasonsaayman@gmail[.]comGitHub 액션 OIDCSLSA 출처 증명
axios@1.14.1 (손상됨)ifstap@proton[.]me직접 CLI 게시없음
axios@0.30.4 (손상됨)ifstap@proton[.]me직접 CLI 게시없음

SLSA 출처를 사용하는 신뢰할 수 있는 OIDC 게시자 흐름에서 변경된 이메일을 사용한 직접 CLI 게시로 전환하는 것은 무단 액세스를 나타내는 분명한 지표입니다.

타임라인

  • 2026-02-18 17:19 UTC - axios@0.30.3 에 의해 합법적으로 게시됨 jasonsaayman@gmail[.]com
  • 2026-03-27 19:01 UTC - axios@1.14.0 GitHub Actions OIDC를 통해 합법적으로 게시됨
  • 2026-03-30 05:57 UTC - plain-crypto-js@4.2.0 게시자 nrwise (nrwise@proton.me) - 레지스트리 기록을 구축하는 클린 미끼
  • 2026-03-30 23:59 UTC - plain-crypto-js@4.2.1 게시자 nrwise - postinstall 백도어가 있는 악성 버전
  • 2026-03-31 00:21 UTC - axios@1.14.1 침해된 계정에 의해 게시됨 - 태그됨 latest
  • 2026-03-31 01:00 UTC - axios@0.30.4 침해된 계정에 의해 게시됨 - 태그됨 legacy

영향을 받는 패키지

  • axios@1.14.1 - 악성, 발견 시 latest 태그 지정
  • axios@0.30.4 - 악성, 발견 시 legacy 태그 지정
  • plain-crypto-js@4.2.0 - 클린 디코이, 레지스트리 기록을 구축하기 위해 게시됨
  • plain-crypto-js@4.2.1 - 악성 페이로드 전달 수단(postinstall 백도어)

안전 버전: axios@1.14.0 (SLSA 출처가 있는 마지막 합법적인 1.x 릴리스) 및 axios@0.30.3 (마지막 합법적인 0.30.x 릴리스).

공격자는 최신 채널과 레거시 채널에 모두 태그를 지정하여 현재 또는 레거시 axios API를 사용하는 프로젝트에서 폭발 반경을 최대화했습니다.

코드 분석

1단계: 일반-크립토-js 드롭퍼

전체 전달 체인은 npm의 설치 후 수명 주기 후크에 달려 있습니다. 손상된 axios 버전을 설치하면 plain-crypto-js@^4.2.1 을 종속성으로 가져와 선언합니다:

"scripts": {
  "postinstall": "node setup.js"
}

이렇게 하면 npm을 설치하는 동안 setup.js가 자동으로 실행되므로 사용자 상호 작용이 필요하지 않습니다.

setup.js 파일은 2계층 인코딩 체계를 사용하여 동작을 숨깁니다:

  • 레이어 1: 문자열 반전 후 Base64 디코딩
  • 레이어 2: 위치 종속 인덱스(7 * i² % 10)와 함께 OrDeR_7077 키를 사용하는 XOR 암호입니다.

모든 중요한 문자열, 모듈 이름, URL, 셸 명령은 인코딩된 배열 stq[]에 저장되고 런타임에 디코딩됩니다. 디코딩된 내용을 통해 운영 인프라를 확인할 수 있습니다:

플랫폼별 전송

문자열 테이블을 디코딩한 후, 드로퍼는 os.platform()을 검사하고 세 가지 전달 루틴 중 하나로 분기합니다. 각각은 http://sfrclak[.]com:8000/6202033으로 플랫폼별 본문(packages.npm.org/product0)과 함께 HTTP POST를 보냅니다. (macOS), packages.npm.org/product1 (Windows), packages.npm.org/product2 (Linux) - C2가 단일 엔드포인트에서 올바른 페이로드를 제공할 수 있도록 합니다. packages.npm.org/ 접두사는 아웃바운드 트래픽이 네트워크 로그에 정상 npm 레지스트리 통신으로 표시되도록 의도적으로 시도하는 것입니다:

Platform배달 방법2단계 위치변장
macOS오사스크립트를 통한 AppleScript는 컬을 사용하여 바이너리를 다운로드합니다./Library/Caches/com.apple.act.mondApple 시스템 데몬
WindowsVBScript 다운로드 .ps1 curl을 통해 이름이 변경된 PowerShell(%PROGRAMDATA%\wt.exe)을 통해 실행합니다.%TEMP%\6202033.ps1 (일시적)Windows 터미널
Linux직접 컬 다운로드 및 파이썬3 실행/tmp/ld.py없음

포렌식 방지

드롭퍼는 두 가지 정리 작업을 수행합니다:

  1. 자동 삭제: setup.js는 fs.unlink(__파일명)를 통해 스스로 제거됩니다.
  2. 패키지 매니페스트 스왑: package.md라는 이름의 클린 파일(설치 후 후크가 없는 정상 버전 4.2.0 구성 포함)이 package.json으로 이름이 변경됩니다, 악성 버전 덮어쓰기

사고 발생 후 node_modules/plain-crypto-js/package.json을 검사한 결과 사후 설치 트리거의 흔적이 발견되지 않았습니다. 악성 setup.js가 사라졌습니다. 잠금 파일과 npm 감사 로그만 증거를 유지합니다.

2단계: 크로스 플랫폼 RAT

세 가지 2단계 페이로드: Windows용 PowerShell, macOS용 컴파일된 C++, Linux용 Python은 서로 다른 세 가지 도구가 아닙니다. 이들은 동일한 RAT 사양의 세 가지 구현으로, 동일한 C2 프로토콜, 명령 집합, 메시지 형식 및 작동 동작을 공유합니다. 일관성은 단일 개발자 또는 긴밀하게 조율된 팀이 공유 디자인 문서에서 작업하고 있음을 강력하게 나타냅니다.

공유 아키텍처

다음 속성은 세 가지 변형 모두에서 동일합니다:

  • C2 전송: HTTP POST
  • 본문 인코딩: Base64로 인코딩된 JSON
  • 사용자 에이전트: mozilla/4.0 (compatible; msie 8.0; windows nt 5.1; trident/4.0)
  • 비콘 간격: 60 초
  • 세션 UID: 16자의 임의 영숫자 문자열, 실행 시마다 생성됩니다.
  • 아웃바운드 메시지 유형: FirstInfo, BaseInfo, CmdResult
  • 인바운드 명령 유형 kill, peinject, runscript, rundir
  • 응답 명령 유형 rsp_kill, rsp_peinject, rsp_runscript, rsp_rundir

스푸핑된 IE8/Windows XP 사용자 에이전트 문자열은 특히 주목할 만하며, 세 플랫폼 모두에서 시대착오적이며, macOS 또는 Linux 호스트에 존재하면 강력한 탐지 지표가 됩니다.

초기화 및 정찰

시작 시 각 변형:

  1. 모든 후속 C2 메시지에 포함되는 세션 UID - 16 임의의 영숫자 문자를 생성합니다.
  2. OS 및 아키텍처 감지 - 플랫폼별 식별자(예: windows_x64, macOS, linux_x64)를 보고합니다.
  3. 초기 관심 디렉터리 (사용자 프로필, 문서, 데스크톱, 구성 디렉터리)를 열거합니다.
  4. UID, OS 식별자 및 디렉터리 스냅샷이 포함된 FirstInfo 비콘을 보냅니다.

초기화 후 임플란트가 메인 루프로 들어갑니다. 첫 번째 BaseInfo 하트비트에는 포괄적인 시스템 프로필이 포함되어 있습니다. 기본 API는 다르지만 모든 플랫폼에서 동일한 범주의 데이터가 수집됩니다:

수집된 데이터Windows 소스macOS 소스Linux 소스
호스트 이름%컴퓨터 이름% 환경 변수게트호스트이름()/proc/sys/커널/호스트명
사용자 이름%사용자 이름% 환경 변수getuid() + getpwuid()os.getlogin()
OS 버전WMI / 레지스트리sysctlbyname("kern.osproductversion")platform.system() + platform.release()
시간대시스템 표준 시간대localtime_r()datetime.timezone
부팅 시간시스템 가동 시간sysctl("kern.boottime")/proc/uptime
설치 날짜레지스트리 / WMIstat("/") 또는 sysctlvar/log/installer 또는 /var/log/dpkg.log의 ctime
하드웨어 모델WMIsysctlbyname("hw.model")/sys/class/dmi/id/product_name
CPU 유형WMIsysctlbyname()platform.machine()
Process list전체 PID, 세션, 이름, 경로팝엔("ps") (최대 1000개)전체 /proc 열거형(PID, PPID, 사용자, cmdline)

후속 심장 박동은 임플란트가 살아있음을 확인하는 타임스탬프만 포함하는 경량입니다.

명령 디스패치

C2 응답은 JSON으로 구문 분석되며, 유형 필드에 따라 작업이 결정됩니다. 세 가지 변형 모두 동일한 네 가지 명령을 구현합니다:

kill - 자동 종료. rsp_kill 확인을 전송하고 종료합니다. Windows 변종의 지속성 메커니즘(레지스트리 키 + 배치 파일)은 명시적으로 정리하지 않는 한 킬 명령 후에도 지속되지만, macOS 및 Linux 변종은 자체적인 지속성이 없습니다.

실행 스크립트 - 스크립트/명령 실행. 운영자의 기본 상호작용 명령입니다. 스크립트 필드(실행할 코드)와 파라미터 필드(인수)를 받습니다. 스크립트가 비어 있으면 Param이 명령으로 직접 실행됩니다. 실행 메커니즘은 플랫폼 네이티브입니다:

Platform실행 메커니즘
WindowsNoProfile -ep 바이패스를 사용하는 PowerShell
macOSusr/bin/osascript를 통한 AppleScript
Linux하위 프로세스를 통한 셸 실행(셸=true) 또는 파이썬3 -c를 통한 파이썬

peinject - 바이너리 페이로드 전달. Windows 중심의 네이밍("PE inject")이지만, 세 플랫폼 모두 바이너리 페이로드를 드롭하고 실행하는 방법으로 이를 구현합니다:

PlatformImplementation
WindowsSystem.Reflection.Assembly]::Load()를 통한 리플렉티브 .NET 어셈블리 로드
macOSBase64는 바이너리를 디코딩 및 드롭하고 운영자가 제공한 매개변수로 실행합니다.
LinuxBase64-바이너리를 /tmp/로 디코딩합니다.<무작위 6자 문자열> (숨겨진 파일), subprocess.Popen()을 통해 실행됩니다.

Windows 구현에서는 파일 드롭 없이 인메모리 실행이 이루어지지만 AMSI를 비활성화하지 않으면 어셈블리 로드에 플래그를 지정합니다. macOS 및 Linux 버전은 디스크에 바이너리를 작성하고 직접 실행하는 더 간단한 접근 방식을 취합니다.

rundir - 디렉터리 열거. 경로를 수락하고 자세한 파일 목록(이름, 크기, 유형, 생성/수정 타임스탬프, 디렉터리의 하위 개수)을 반환합니다. 운영자가 파일 시스템을 대화형으로 탐색할 수 있습니다.

기능 요약

기능Windows(PowerShell)macOS(C++)Linux(Python)
지속성 유지레지스트리 실행 키 + 숨겨진 .bat없음없음
스크립트 실행PowerShell오사스크립트를 통한 애플스크립트셸 또는 파이썬 인라인
이진 주입리플렉티브 .NET 로드 주입을 cmd.exe에 적용하기이진 드롭 + 실행tmp/로 바이너리 드롭 + 실행
포렌식 방지숨겨진 창, 임시 파일 정리숨겨진 임시 .scpt숨겨진 /tmp/.XXXXXX 파일

어트리뷰션

plain-crypto-js 포스트 인스톨 후크가 제공하는 macOS Mach-O 바이너리는 Mandiant가 추적한 C++ 백도어이자 북한과 연계된 위협 클러스터인 UNC1069에 기인하는 WAVESHAPER와 상당히 겹치는 것으로 나타났습니다.

결론

이 캠페인은 공급망 공격 벡터로서 npm 에코시스템의 지속적인 매력을 보여줍니다. 공격자는 자바스크립트 생태계에서 가장 많이 의존하는 패키지 중 하나의 관리자 계정을 손상시킴으로써 수백만 개의 환경에 잠재적으로 도달할 수 있는 전달 메커니즘을 확보했습니다.

툴킷의 가장 신뢰할 수 있는 탐지 지표는 세 가지 플랫폼 버전 모두에서 동일하게 하드코딩된 IE8/Windows XP 사용자 에이전트 문자열이라는 가장 흥미로운 디자인 선택이기도 합니다. C2 서버 측 라우팅에 일관된 프로토콜 지문을 제공하지만, 모든 최신 네트워크에서 쉽게 감지할 수 있으며 macOS 및 Linux 호스트에서는 즉각적인 이상 징후가 됩니다.

Elastic Security Labs는 이 활동 클러스터를 계속 모니터링하고 추가 발견 사항이 있으면 이 포스팅을 업데이트할 예정입니다.

MITRE ATT&CK

Elastic은 MITRE ATT& CK 프레임워크를 사용하여 지능형 지속적 위협이 기업 네트워크에 대해 사용하는 일반적인 전술, 기술 및 절차를 문서화합니다.

전술

전술은 기술 또는 하위 기술의 이유를 나타냅니다. 이는 적의 전술적 목표, 즉 행동을 수행하는 이유입니다.

기술

기술은 공격자가 행동을 수행하여 전술적 목표를 달성하는 방법을 나타냅니다.

관찰

이 연구에서는 다음과 같은 관찰 가능성에 대해 논의했습니다.

관측 가능합니다.유형이름참조
617b67a8e1210e4fc87c92d1d1da45a2f311c08d26e89b12307cf583c900d101SHA-2566202033.ps1Windows 페이로드
92ff08773995ebc8d55ec4b8e1a225d0d1e51efa4ef88b8849d0071230c9645aSHA-256com.apple.act.mondMacOS 페이로드
fcb81618bb15edfdedfb638b4c08a2af9cac9ecfa551af135a8402bf980375cfSHA-256ld.pyLinux 페이로드
sfrclak[.]com도메인C2
142.11.206[.]73IPv4-addrC2

참고 자료

위의 조사에서 참조한 내용은 다음과 같습니다:

이 문서 공유하기