본문으로 건너뛰기
피드

axios NPM 해킹됨 — 메인테이너 계정 탈취로 RAT 드롭퍼 심긴 악성 버전 배포

security 약 10분
vote
0
댓글
북마크

주간 다운로드 3억 회 이상인 axios의 메인테이너 계정이 탈취되어 악성 버전(1.14.1, 0.30.4)이 npm에 퍼블리시됨. 가짜 의존성의 postinstall 훅으로 macOS/Windows/Linux 크로스 플랫폼 RAT를 설치하고 흔적을 자가 삭제하는, npm top-10 패키지 대상 사상 최정교 공급망 공격.

  • 1

    [email protected]과 0.30.4가 탈취된 메인테이너 계정으로 퍼블리시됨 — GitHub Actions OIDC를 우회한 수동 배포

  • 2

    악성 코드는 axios 자체가 아닌 가짜 의존성(plain-crypto-js)의 postinstall 훅에 숨겨짐

  • 3

    macOS/Windows/Linux 3개 OS별 RAT 페이로드가 사전 빌드되어 npm install 후 2초 만에 C2 연결

  • 4

    실행 후 자가 삭제하여 포렌식 회피 — node_modules에 plain-crypto-js 디렉토리 존재 자체가 감염 증거

  • 5

    대응: 안전 버전으로 다운그레이드 + 크리덴셜 전량 로테이션 + 시스템 재구축

  • 2026년 3월 30일, npm 주간 다운로드 3억 회 이상인 axios가 해킹당함[email protected][email protected]가 악성 버전으로 퍼블리시됨
    • axios 핵심 메인테이너(jasonsaayman)의 npm 크리덴셜이 탈취되어 수동으로 퍼블리시된 거임
    • 공격자는 메인테이너 계정의 이메일을 ProtonMail([email protected])로 변경하고, GitHub Actions CI/CD를 우회해서 npm CLI로 직접 올림
    • 정상 릴리스는 전부 GitHub Actions OIDC Trusted Publisher로 퍼블리시되는데, 1.14.1은 OIDC 바인딩도 gitHead도 없음 — GitHub 레포에 대응하는 커밋이나 태그 자체가 존재하지 않음

⚠️주의

> [email protected] 또는 [email protected]를 설치했다면 시스템이 이미 침해된 것으로 간주해야 함. 단순 패키지 삭제가 아니라 시스템 전체 재구축 + 크리덴셜 전량 로테이션이 필요함.

공격 메커니즘

  • axios 소스 코드 자체에는 악성 코드가 단 한 줄도 없음 — 트릭은 가짜 의존성 주입

    • [email protected]이라는 패키지를 dependencies에 추가했는데, axios 코드 어디에서도 import하지 않음
    • 이 패키지의 유일한 목적은 postinstall 스크립트(node setup.js)를 실행하는 것
    • npm install [email protected] 하면 npm이 자동으로 plain-crypto-js를 설치하고 postinstall 훅이 발동됨
  • 공격은 치밀하게 사전 준비됨 — 우발적이 아님

    • 악성 의존성(plain-crypto-js)이 axios 릴리스보다 18시간 먼저 npm에 올라감 — "신규 패키지" 알람을 피하려는 의도
    • macOS, Windows, Linux 3개 OS별 페이로드가 사전 빌드됨
    • 1.x와 0.x 두 브랜치 모두 39분 안에 동시 공격
    • StepSecurity는 "npm top-10 패키지 대상 공급망 공격 중 가장 정교한 수준"이라고 평가

크로스 플랫폼 RAT 드롭퍼

  • setup.js는 2중 난독화(XOR 암호 + base64)로 정적 분석을 회피하도록 설계됨

    • 민감한 문자열(모듈명, C2 URL, 셸 명령)이 stq[] 배열에 인코딩되어 저장
    • XOR 키 "OrDeR_7077"에서 알파벳은 NaN → 비트 연산 시 0이 되고, 숫자 7,0,7,7만 유효한 키로 작동
    • C2 서버 URL: http://sfrclak.com:8000/6202033
  • macOS: AppleScript로 드롭 → /Library/Caches/com.apple.act.mond에 RAT 바이너리 저장

    • 경로가 Apple 시스템 캐시 디렉토리를 흉내 내고, 파일명은 "Activity Monitor Daemon"처럼 위장
    • 실행 후 AppleScript 파일 자체는 삭제됨
  • Windows: VBScript → PowerShell 3단계 체인

    • PowerShell 바이너리를 %PROGRAMDATA%\wt.exe(Windows Terminal로 위장)에 복사
    • -ExecutionPolicy Bypass -WindowStyle Hidden으로 실행 후 자가 삭제
  • Linux: curl로 Python RAT(/tmp/ld.py)를 다운로드하고 nohup으로 백그라운드 실행

  • 3개 OS 모두 C2에 POST할 때 packages.npm.org/product{0,1,2}를 body로 보냄

    • 네트워크 로그에서 npm 레지스트리 통신처럼 보이게 하려는 위장 전술

자가 파괴 — 포렌식 회피

  • 드롭퍼 실행 후 흔적을 완벽하게 지움
    • setup.js 자체를 fs.unlink로 삭제
    • 악성 package.json(postinstall 포함)을 삭제하고, 미리 준비해둔 깨끗한 package.mdpackage.json으로 교체
    • 감염 후 node_modules/plain-crypto-js/package.json을 열어봐도 완전히 정상으로 보임
    • 하지만 node_modules/plain-crypto-js/ 디렉토리 자체가 존재하면 감염된 거임 — 정상 axios 버전에는 이 패키지가 없음

런타임 검증 — 실제 실행 확인

  • StepSecurity가 Harden-Runner를 장착한 GitHub Actions 러너에서 실제 설치해봄
    • npm install 시작 후 2초 만에 C2 서버로 첫 번째 아웃바운드 연결 발생
    • 36초 후 다른 워크플로 스텝에서 두 번째 C2 콜백 발생 — nohup으로 분리된 프로세스가 독립적으로 살아있었다는 뜻
    • 프로세스 트리: npm → sh → node → sh → curl/nohup — 4단계 프로세스 간접 참조로 원래 npm install과의 연결고리를 끊음
    • nohup 프로세스의 ppid가 1(init) — 의도적으로 프로세스 트리에서 고아로 만들어 프로세스 어트리뷰션을 회피

영향 확인 및 대응

  • 내 프로젝트가 영향 받았는지 확인하는 방법:

    • npm list axios | grep -E "1\.14\.1|0\.30\.4" 실행
    • node_modules/plain-crypto-js 디렉토리 존재 여부 확인
    • macOS: /Library/Caches/com.apple.act.mond / Linux: /tmp/ld.py / Windows: %PROGRAMDATA%\wt.exe 확인
  • 대응 조치:

    • [email protected](1.x) 또는 [email protected](0.x)으로 다운그레이드 + overrides/resolutions로 고정
    • RAT 아티팩트 발견 시 인플레이스 클린업 시도 금지 — 시스템 전체를 known-good 상태에서 재구축
    • npm 토큰, AWS 키, SSH 키, 클라우드 크리덴셜, CI/CD 시크릿, .env 값 전량 로테이션
    • CI/CD에서 npm ci --ignore-scripts를 상시 정책으로 적용하여 postinstall 훅 차단

💡

> C2 트래픽 차단도 해두는 게 좋음. iptables -A OUTPUT -d 142.11.206.73 -j DROP 또는 /etc/hosts0.0.0.0 sfrclak.com 추가.


기술 맥락

  • 이번 공격이 특히 무서운 이유는 npm의 "postinstall 훅" 구조 때문이에요. npm은 패키지를 설치할 때 의존성의 postinstall 스크립트를 자동으로 실행하거든요. 대부분의 프로젝트에서 이걸 끄지 않는 이유는, native addon 빌드(node-gyp 같은) 등 정상적인 용도가 많아서예요. 그런데 이게 공격 벡터로 쓰이면 npm install 한 번으로 임의 코드 실행이 가능해지는 거죠.

  • OIDC Trusted Publisher라는 메커니즘이 왜 중요한지 이번 사건이 잘 보여줘요. 정상 릴리스는 GitHub Actions 워크플로에 암호학적으로 바인딩되어 있어서, 누군가 npm 토큰을 탈취해도 이 메커니즘 없이 퍼블리시하면 레지스트리 메타데이터에 차이가 남아요. 이번 1.14.1이 딱 그 케이스였고, 이게 탐지의 결정적 단서가 된 거예요.

  • "phantom dependency" 패턴도 주목할 부분이에요. package.json에는 있지만 코드 어디에서도 import하지 않는 의존성이 있다면, 이건 postinstall 훅만 트리거하려는 목적일 확률이 높아요. 보안 도구들이 이런 패턴을 탐지 규칙에 추가하면 향후 유사 공격을 조기에 잡을 수 있겠죠.

  • nohup으로 프로세스를 PID 1에 고아로 만드는 기법은, 컨테이너나 CI/CD 환경에서 프로세스 어트리뷰션을 무력화하려는 의도예요. 대부분의 모니터링 도구가 부모-자식 프로세스 트리를 추적하는데, 이걸 끊어버리면 "어떤 스텝에서 이 프로세스가 시작됐는지"를 알 수 없게 되거든요.

npm 생태계의 postinstall 훅이 또다시 공격 벡터로 활용된 사례. OIDC Trusted Publisher 메커니즘의 부재가 탐지 단서가 되었다는 점에서, 모든 npm 패키지 퍼블리시에 OIDC 바인딩을 강제하는 것이 근본 해결책이 될 수 있음.

댓글

댓글

댓글을 불러오는 중...

security

엘에이 경찰, 사생활 침해 논란 끝에 플록 번호판 감시 계약 종료

엘에이 경찰이 번호판 인식 카메라 업체 플록 세이프티와의 3년 계약을 연장하지 않기로 했어. 시민권, 프라이버시, 데이터 보관과 공유 문제를 해결하지 못했다는 게 핵심 이유야. 플록은 미국 전역에 최소 8만 대 카메라망을 깔아 경찰과 연방기관이 차량을 추적할 수 있게 해왔고, 오탐·보안 사고·이민 단속 악용 의혹까지 겹치며 압박이 커졌어.

security

크로미움 148부터 Math.tanh 한 번으로 운영체제 지문이 새는 문제

크로미움 148 이후 V8이 Math.tanh 계산을 자체 구현 대신 운영체제의 수학 라이브러리에 맡기면서, 같은 입력값도 리눅스·맥·윈도우에서 마지막 비트가 달라지는 지문 신호가 생겼다. 이 차이는 User-Agent로 맥이라고 주장하면서 리눅스 수학 결과를 내는 식의 위장을 바로 들키게 만든다. CSS 삼각함수와 웹 오디오까지 보면 브라우저 수학 경로가 꽤 복잡하게 갈라지고, 제대로 흉내 내려면 실제 운영체제 라이브러리의 비트 단위 동작까지 맞춰야 한다.

security

출입통제도 클라우드 구독제로 간다…제로트러스트·AI 분석이 승부처

기업 출입보안이 사업장별 서버를 두는 방식에서 클라우드 기반 서비스형 출입통제(ACaaS)로 옮겨가고 있다. 시장은 2026년 17억8000만 달러에서 2030년 31억9000만 달러로 커질 전망이고, 제로트러스트·모바일 인증·AI 출입 분석·스마트빌딩 통합이 핵심 경쟁 포인트로 꼽힌다.

security

AWS·구글 클라우드, 양자컴퓨터 대비해 암호 체계 갈아엎는 중

AWS와 구글 클라우드가 양자컴퓨터 시대를 대비해 기존 공개키 암호와 양자내성암호를 함께 쓰는 하이브리드 전환을 시작했다. 핵심 배경은 지금 훔친 암호문을 나중에 양자컴퓨터로 푸는 ‘선수집·후해독’ 공격이고, 국내도 통신·금융·국방 등 5개 분야에 45억원을 투입해 실증에 들어간다.

security

보안 점검 맡긴 AI 에이전트가 악성코드를 직접 실행할 수 있다는 경고

AI 보안 에이전트가 저장소를 검사하다가 README 같은 문서에 숨은 프롬프트 인젝션에 속아 악성 바이너리를 실행할 수 있다는 연구가 나왔다. 클로드 코드와 코덱스의 자동 모드처럼 승인 없이 명령을 수행하는 구성에서 문제가 재현됐고, 여러 모델과 공급업체를 가로질러 같은 패턴이 통했다는 점이 핵심이다.