주간 다운로드 1억 회 이상인 자바스크립트 핵심 라이브러리 Axios의 npm 패키지가 공급망 공격에 노출됐다. 공격자는 메인테이너 계정을 탈취해 39분 만에 두 개의 악성 버전을 배포했으며, 윈도우·맥OS·리눅스를 동시에 감염시키는 크로스 플랫폼 원격접속 트로이목마(RAT)를 심었다. 구글 위협 인텔리전스 그룹은 이번 공격을 북한 연계 위협 행위자 UNC1069로 귀속했다.
3시간의 위험, 1억 다운로드 생태계가 흔들렸다
2026년 3월 31일 새벽, 자바스크립트 생태계에서 가장 널리 사용되는 HTTP 클라이언트 라이브러리 Axios가 공급망 공격의 표적이 됐다. 공격자는 Axios의 주요 메인테이너인 jasonsaayman의 npm 계정을 탈취한 뒤, 불과 39분 사이에 두 개의 악성 버전—axios@1.14.1(latest 태그)과 axios@0.30.4(legacy 태그)—을 배포했다. Axios는 주간 다운로드 수가 1억 회를 넘는 패키지로, 프론트엔드 프레임워크부터 백엔드 서비스, 엔터프라이즈 애플리케이션까지 광범위하게 사용된다. 이번 공격은 3월 31일 00시 21분(UTC)부터 03시 29분(UTC)까지 약 3시간 동안 지속됐으며, 보안 스캐너 소켓(Socket)이 약 6분 만에 이상 징후를 탐지하면서 빠르게 대응이 시작됐다.
18시간 전부터 준비된 정교한 위장 작전
이번 공격이 특히 주목받는 이유는 그 정교함에 있다. 공격자는 본격적인 공격에 앞서 3월 30일 05시 57분(UTC)에 plain-crypto-js@4.2.0이라는 ‘정상 위장’ 패키지를 먼저 npm에 등록했다. 이 버전 자체에는 악성 코드가 없었지만, npm 레지스트리에 정상적인 배포 이력을 확보하기 위한 사전 포석이었다. 약 18시간 뒤인 3월 30일 23시 59분(UTC), 동일 패키지의 4.2.1 버전에 악성 코드를 삽입해 등록했다. 이후 Axios의 package.json에 이 패키지를 런타임 의존성으로 주입하는 방식으로 공격을 실행했다.
| 항목 | 세부 내용 |
|---|---|
| 공격 대상 | Axios npm 패키지 (주간 1억+ 다운로드) |
| 악성 버전 | axios@1.14.1 (latest), axios@0.30.4 (legacy) |
| 안전 버전 | axios@1.14.0, axios@0.30.3 |
| 악성 의존성 | plain-crypto-js@4.2.1 |
| 공격 지속 시간 | 약 3시간 (00:21~03:29 UTC) |
| C2 서버 | sfrclak[.]com:8000 (IP: 142.11.206.73) |
| 공격 귀속 | UNC1069 (북한 연계, 구글 위협 인텔리전스 그룹 분석) |
이중 난독화와 자기 삭제: RAT 드로퍼의 기술적 실체
악성 패키지 plain-crypto-js@4.2.1의 핵심은 setup.js라는 postinstall 스크립트다. 이 스크립트는 이중 난독화 기법을 사용했다. 첫 번째 레이어는 역순 Base64 인코딩과 패딩 문자 치환, 두 번째 레이어는 OrDeR_7077이라는 키와 상수 333을 사용한 XOR 암호화다. 스크립트는 os.platform()으로 운영체제를 식별한 뒤, C2 서버 sfrclak[.]com:8000에서 플랫폼별 2단계 페이로드를 다운로드하고 실행한다. 실행 후에는 fs.unlink()로 자기 자신을 삭제하고, package.json을 사전에 준비된 정상 파일로 교체해 포렌식 흔적을 지우는 반(反)포렌식 기법까지 적용했다.
하나의 RAT, 세 가지 운영체제를 동시에 공략
이번 공격에서 배포된 RAT는 단순히 세 가지 다른 악성 도구가 아니라, 동일한 C2 프로토콜·명령 체계·비콘 동작을 공유하는 ‘하나의 크로스 플랫폼 임플란트 프레임워크’라는 점이 핵심이다. 일래스틱 시큐리티 랩스(Elastic Security Labs)는 이를 “one RAT to rule them all(하나의 RAT로 모두를 지배하다)”이라고 표현했다. 모든 플랫폼에서 RAT는 16자리 랜덤 영숫자 세션 ID를 생성하고, 호스트명·사용자명·실행 중인 프로세스 등 시스템 지문을 수집한 뒤, 60초 간격으로 C2 서버에 비콘을 전송한다. 특이한 점은 모든 플랫폼에서 인터넷 익스플로러 8/윈도우 XP 시절의 사용자 에이전트 문자열(mozilla/4.0 (compatible; msie 8.0; windows nt 5.1; trident/4.0))을 사용한다는 것으로, 오히려 이것이 강력한 탐지 지표가 된다.
맥OS에서는 C++ 바이너리를 /Library/Caches/com.apple.act.mond에 드롭해 애플 시스템 데몬으로 위장하며, 게이트키퍼(Gatekeeper) 우회를 위해 애드혹 코드 서명을 수행한다. peinject 명령으로 추가 바이너리를 주입하고, runscript로 셸 명령이나 애플스크립트를 실행하며, rundir로 /Applications와 ~/Library 디렉터리를 탐색한다. 윈도우에서는 VBScript 다운로더가 파워셸 바이너리를 %PROGRAMDATA%wt.exe로 복사해 윈도우 터미널로 위장하고, 레지스트리 Run 키에 등록해 지속성을 확보한다. 리눅스에서는 파이썬 RAT를 /tmp/ld.py로 다운로드한 뒤, nohup python3로 고아 프로세스(orphaned process)로 실행한다.
북한 해커 그룹 UNC1069의 소행
구글 위협 인텔리전스 그룹(Google Threat Intelligence Group)은 이번 공격을 북한 연계 위협 행위자 UNC1069로 귀속했다. 맨디언트(Mandiant)가 추적하는 C++ 백도어 ‘WAVESHAPER’와 맥OS 변종 간의 코드 유사성이 핵심 근거다. UNC1069는 암호화폐 거래소, 핀테크 기업, 개발자 생태계를 표적으로 삼아온 그룹으로 알려져 있으며, npm과 같은 오픈소스 패키지 레지스트리를 공급망 공격의 진입점으로 활용하는 전략을 지속적으로 구사하고 있다. 이번 사건은 2018년 이벤트스트림(event-stream) 사건, 2021년 ua-parser-js 사건에 이은 npm 생태계 대형 공급망 공격의 연장선에 있지만, 국가 수준의 행위자가 관여한 점에서 위협 수위가 한 단계 높아졌다는 평가다.
개발자가 지금 당장 해야 할 일
영향을 받았는지 확인하려면 프로젝트의 lockfile에서 axios@1.14.1 또는 axios@0.30.4가 포함되어 있는지, 그리고 node_modules에 plain-crypto-js가 존재하는지 점검해야 한다. 스닉(Snyk)은 이번 취약점에 대해 SNYK-JS-AXIOS-15850650, SNYK-JS-PLAINCRYPTOJS-15850652 어드바이저리를 발행했다. 만약 해당 버전을 설치한 이력이 있다면, 단순 업데이트로는 부족하다. 시스템 격리 후 모든 자격 증명—API 키, SSH 키, 클라우드 인증 정보, npm·깃허브 토큰—을 즉시 교체해야 하며, C2 서버(sfrclak[.]com / 142.11.206.73:8000)로의 아웃바운드 연결 로그를 확인하고, 깨끗한 스냅샷에서 환경을 재구축하는 것이 권장된다. 향후 재발 방지를 위해 CI/CD 파이프라인에서 npm ci --ignore-scripts를 사용하고, lockfile을 커밋하며, 보안 도구에서 plain-crypto-js를 차단 목록에 추가하는 것이 필요하다.
한국 개발자 생태계에 던지는 경고
이번 사건은 한국 개발자 생태계에도 직접적인 영향을 미칠 수 있다. Axios는 국내 웹 서비스와 모바일 앱 백엔드에서 가장 많이 사용되는 HTTP 클라이언트 중 하나이며, 특히 리액트(React)와 뷰(Vue.js) 기반 프론트엔드 프로젝트에서 사실상 표준처럼 쓰이고 있다. 3월 31일 새벽 시간대(한국 시간 오전 9시~오후 12시)는 국내 개발자들의 업무 시간과 겹치기 때문에, CI/CD 파이프라인의 자동 빌드 과정에서 악성 버전이 설치됐을 가능성을 반드시 점검해야 한다. 오픈소스 공급망 보안이 더 이상 먼 나라 이야기가 아니라, 매일 npm install을 실행하는 모든 개발 팀의 현실적인 위협이라는 점을 이번 사건이 다시 한번 확인시켜 주고 있다.
© 2026 TechMore. All rights reserved. 무단 전재 및 재배포 금지.
기사 제보
제보하실 내용이 있으시면 techmore.main@gmail.com으로 연락주세요.


