TL;DR
2026년 3월 31일, 공격자들은 주간 다운로드 수 8,300만 회를 기록하는 가장 인기 있는 JavaScript HTTP 클라이언트인 Axios의 주요 관리자 npm 계정을 침해했습니다. 그들은 개발자 컴퓨터에서 자격 증명, SSH 키 및 클라우드 토큰을 훔치는 크로스 플랫폼 RAT(원격 액세스 트로이 목마)를 포함하는 악성 버전(1.14.1 및 0.30.4)을 게시했습니다. 즉시 Axios 1.14.0으로 다운그레이드하고, 모든 비밀을 교체하며, 시스템에서 침해 지표를 스캔하십시오.
소개
Axios는 다른 어떤 JavaScript 라이브러리보다 많은 HTTP 요청을 처리합니다. 지난 5년 동안 API 클라이언트를 구축했거나, 엔드포인트를 테스트했거나, 프론트엔드를 백엔드에 연결했다면 아마도 Axios를 사용했을 것입니다.
2026년 3월 31일 00:21 UTC, 위협 행위자가 탈취된 관리자 계정을 통해 Axios 버전 1.14.1을 게시했습니다. 해당 패키지는 합법적인 릴리스와 동일하게 보였습니다. 차이점은 정교했습니다: 86개 파일 중 `package.json`만 변경되었습니다. 하지만 이 단일 파일은 `plain-crypto-js`라는 유령 종속성을 주입하여 `npm install`을 실행하는 모든 컴퓨터에 원격 액세스 트로이 목마를 배포했습니다.
악성 버전은 npm이 이를 제거하기 전까지 약 2~3시간 동안 활성 상태를 유지했습니다. 주간 8,300만 회 다운로드되는 패키지에서 2~3시간이라는 짧지 않은 시간이었습니다.
이 글은 공격이 어떻게 작동했는지, 시스템이 침해되었는지 감지하는 방법, 그리고 API 팀이 향후 종속성 관리에 대해 무엇을 변경해야 하는지 자세히 설명합니다.
Axios 공급망 공격 전개 방식
타임라인
공격자는 18시간 동안 이 작업을 정밀하게 실행했습니다.
- 3월 30일, 05:57 UTC: 깨끗한 미끼 패키지 `plain-crypto-js@4.2.0`이 npm에 게시되었습니다. "깨끗한" 버전을 먼저 게시함으로써 패키지가 레지스트리에 짧은 이력을 갖게 되어 의심을 덜 받도록 했습니다.
- 3월 30일, 23:59 UTC: 악성 버전 `plain-crypto-js@4.2.1`이 게시되었으며, 드로퍼를 포함하는 `postinstall` 훅을 추가했습니다.
- 3월 31일, 00:21 UTC: 침해된 `jasonsaayman` 계정을 사용하여 `axios@1.14.1`이 릴리스되었습니다.
- 3월 31일, 01:00 UTC: 39분 후 `axios@0.30.4`가 이어져 0.x 브랜치에 고정된 프로젝트를 대상으로 했습니다.
- 3월 31일, ~03:15 UTC: 커뮤니티 보고 후 npm은 두 Axios 버전을 모두 게시 취소했습니다.
- 3월 31일, 04:26 UTC: npm은 재게시를 방지하기 위해 `plain-crypto-js`에 대한 보안-홀더 스텁을 게시했습니다.
계정 침해 방식
공격자는 Axios의 주요 관리자인 `jasonsaayman` npm 계정을 장악했습니다. 그들은 등록된 이메일을 `ifstap@proton.me`로 변경했습니다. 주요 포렌식 증거는 다음과 같습니다.
- 합법적인 Axios 릴리스는 npm의 OIDC Trusted Publisher 메커니즘과 함께 GitHub Actions를 사용합니다. 악성 버전에는 OIDC 바인딩이 전혀 없었습니다.
- 침해된 릴리스에는 `gitHead` 필드가 나타나지 않았는데, 이는 해당 GitHub 커밋이 존재하지 않았음을 의미합니다.
- 공격자는 CI/CD를 통하는 대신 탈취한 장기 npm 액세스 토큰을 사용하여 수동으로 게시했습니다.
이러한 구별은 중요합니다. 조직이 npm 패키지를 게시하는 경우, 릴리스에 OIDC 바인딩 및 CI/CD 출처가 없다는 것은 자동화된 확인을 받을 가치가 있는 위험 신호입니다.
종속성 주입 기술
이것이 이 공격을 교묘하게 만든 이유입니다. 공격자는 Axios 소스 코드를 수정하지 않았습니다. 그들은 `package.json`의 한 줄을 변경하여 `plain-crypto-js@^4.2.1`을 런타임 종속성으로 추가했습니다. 이 패키지는 Axios 코드베이스의 어느 곳에서도 임포트되지 않았습니다. 이것은 `npm install` 중에 `postinstall` 훅을 트리거하기 위해서만 존재했습니다.
바이너리 분석 결과 정밀한 정교함이 확인되었습니다: 패키지의 86개 파일 중 깨끗한 1.14.0 릴리스와 침해된 1.14.1 릴리스 간에는 `package.json`만 달랐습니다.
악성 페이로드의 기능
드로퍼 메커니즘
`plain-crypto-js`의 `postinstall` 훅은 `setup.js`라는 4.2KB 크기의 난독화된 파일을 실행했습니다. 이는 두 가지 난독화 계층을 사용했습니다.
- 1단계: 문자열 `"OrDeR_7077"`에서 파생된 키를 사용한 XOR 암호
- 2단계: 문자 반전이 포함된 Base64 인코딩
디코딩된 후, 드로퍼는 호스트 운영 체제를 식별하고 플랫폼별 페이로드를 실행했습니다.
플랫폼별 공격 경로
macOS:
AppleScript를 /tmp/6202033에 작성
osascript를 통해 실행
페이로드를 /Library/Caches/com.apple.act.mond로 다운로드
Windows:
PowerShell을 %PROGRAMDATA%\wt.exe로 복사 (지속성 아티팩트)
cscript를 통해 VBScript 드로퍼 실행
Linux:
Python RAT을 /tmp/ld.py로 다운로드
nohup python3를 통해 실행
세 가지 브랜치 모두 플랫폼별 POST 본문을 사용하여 명령 및 제어 서버와 통신했습니다.
- macOS: `packages.npm.org/product0`
- Windows: `packages.npm.org/product1`
- Linux: `packages.npm.org/product2`
RAT(원격 액세스 트로이 목마) 기능
배포된 원격 액세스 트로이 목마는 다음을 지원합니다.
- 임의의 셸 명령 실행
- 파일 시스템 열거 및 유출
- 프로세스 목록 및 주입
- 메모리 내 바이너리 주입 (파일 없는 실행)
- C2 인프라에 60초 비컨 간격
간단히 말해, 공격자는 개발 머신에 대한 완전한 원격 제어 권한을 얻습니다. 그들은 `.env` 파일을 읽고, API 키를 훔치고, SSH 키를 복사하고, 수천 개의 조직에서 클라우드 공급자 토큰을 수확할 수 있습니다.
포렌식 방지: 자체 삭제 페이로드
실행 후, 드로퍼는 세 가지 정리 단계를 수행했습니다.
- `setup.js` 자체 삭제
- 악성 `package.json` 삭제
- 사전에 준비된 `package.md` (버전 4.2.0 보고)를 `package.json`으로 이름 변경
이것은 `npm list`가 페이로드를 실행한 4.2.1 대신 4.2.0 버전을 보고하는 기만 계층을 만들었습니다. 나중에 종속성을 확인하는 개발자는 아무런 문제가 없다고 생각할 것입니다.
이 공격의 배후
Google 위협 인텔리전스 그룹은 Axios 공격을 북한으로 의심되는 위협 행위자 UNC1069의 소행으로 지목했습니다. macOS 악성웨어는 2026년 2월 Mandiant가 추적한 C++ 백도어 WAVESHAPER와 "상당한 유사점"을 보입니다.
북한의 국가 지원 그룹은 공급망 공격에 대한 깊은 경험을 가지고 있습니다. 그들은 역사적으로 침해된 개발자 도구를 사용하여 암호화폐를 훔쳤으며, 이 작전은 동일한 전략을 따릅니다: 널리 사용되는 개발자 도구를 침해하여 수천 개의 조직에서 자격 증명 및 클라우드 인프라에 대한 접근 권한을 얻습니다.
정교함 수준이 주목할 만합니다. 2단계 종속성 주입, 다중 플랫폼 RAT 배포 및 포렌식 방지 정리는 모두 충분한 자원이 투입된 작전을 가리킵니다. 이것은 암호화폐 채굴기를 배포하는 스크립트 키디의 소행이 아닙니다. 이것은 개발자 워크스테이션을 대상으로 하는 정보 작전입니다.
영향을 받았는지 확인하는 방법
1단계: Axios 버전 확인
Axios를 사용하는 모든 프로젝트에서 다음을 실행하십시오.
npm list axios 2>/dev/null | grep -E "1\.14\.1|0\.30\.4"
이것이 결과를 반환하면 프로젝트가 침해된 버전을 설치한 것입니다.
2단계: 악성 종속성 확인
ls node_modules/plain-crypto-js 2>/dev/null && echo "POTENTIALLY AFFECTED"
드로퍼가 자체적으로 정리했더라도 해당 디렉터리의 존재는 페이로드가 실행되었음을 확인합니다.
3단계: 시스템에서 RAT 아티팩트 확인
macOS:
ls -la /Library/Caches/com.apple.act.mond 2>/dev/null
Linux:
ls -la /tmp/ld.py 2>/dev/null
Windows (PowerShell):
Test-Path "$env:PROGRAMDATA\wt.exe"
4단계: 네트워크 지표 확인
다음으로의 연결을 차단하고 스캔하십시오.
- C2 도메인: `sfrclak.com`
- C2 IP: `142.11.206.73`
- C2 URL: `http://sfrclak.com:8000/6202033`
5단계: CI/CD 빌드 로그 확인
2026년 3월 31일 00:21 UTC와 03:15 UTC 사이에 실행된 모든 CI/CD 파이프라인을 검토하십시오. 이 시간 동안 Axios를 해결한 `npm install` 또는 `npm ci` 실행은 빌드 환경에서 드로퍼를 실행했을 수 있습니다.
즉각적인 완화 조치
침해 지표를 발견하면 해당 시스템을 완전히 침해된 것으로 간주하십시오. 다음은 우선순위 목록입니다.
1. Axios 즉시 다운그레이드
npm install axios@1.14.0
또는 0.x 브랜치의 경우:
npm install axios@0.30.3
2. `package.json`에 버전 오버라이드 추가
악성 버전으로의 전이적 해결을 방지합니다.
{
"overrides": {
"axios": "1.14.0"
}
}
Yarn의 경우:
{
"resolutions": {
"axios": "1.14.0"
}
}
3. 악성 패키지 제거
rm -rf node_modules/plain-crypto-js
4. 모든 자격 증명 교체
드로퍼가 컴퓨터에서 실행되었다면 다음이 침해되었다고 가정하십시오.
- npm 토큰
- AWS/GCP/Azure 자격 증명
- SSH 키
- GitHub 토큰
- `.env` 파일의 API 키
- 데이터베이스 자격 증명
- 환경 변수에 저장된 모든 비밀
모든 것을 교체하십시오. RAT가 활성 시간 동안 무엇을 유출했는지 알 방법은 없습니다.
5. 네트워크 수준에서 C2 차단
호스트 파일 또는 방화벽 규칙에 추가하십시오.
echo "0.0.0.0 sfrclak.com" | sudo tee -a /etc/hosts
6. 아티팩트가 발견되면 시스템 재구축
셸 실행 및 파일 시스템 접근 권한이 있는 RAT는 무엇이든 수정할 수 있습니다. 3단계에서 아티팩트를 발견했다면 시스템을 신뢰하지 마십시오. 알려진 양호한 상태에서 재구축하십시오.
API 개발팀을 위한 장기적인 방어책
잠금 파일 사용 및 정확한 버전 고정
Axios 공격은 `^` 셈버 범위(semver ranges)를 악용했습니다. `package.json`에 `"axios": "^1.14.0"`이라고 되어 있다면, npm은 공격 기간 동안 최신 호환 버전인 1.14.1을 해결합니다.
{
"dependencies": {
"axios": "1.14.0"
}
}
정확한 버전을 고정하십시오. 항상 `package-lock.json` 또는 `yarn.lock`을 커밋하십시오. CI/CD에서 `npm install` 대신 `npm ci`를 실행하여 잠금 파일 해결을 강제하십시오.
CI/CD에서 postinstall 스크립트 비활성화
전체 공격은 `npm install` 중에 `postinstall` 훅이 실행되는 것에 의존했습니다. 다음을 사용하여 이를 비활성화할 수 있습니다.
npm ci --ignore-scripts
이것은 네이티브 컴파일이 필요한 일부 패키지를 손상시킬 수 있습니다. 먼저 빌드를 테스트한 다음, `.npmrc`를 사용하여 필요한 패키지에 대해서만 스크립트를 선택적으로 허용하십시오.
ignore-scripts=true
종속성 정기 감사
npm audit
npx socket-security/cli audit
CI/CD에서 이를 게이트로 실행하십시오. 중요 또는 높은 취약점은 빌드를 차단해야 합니다.
HTTP 클라이언트 종속성 노출 영역 축소
이 공격이 제기하는 더 심층적인 질문은 다음과 같습니다: 왜 API 테스트 워크플로우가 침해될 수 있는 서드파티 HTTP 라이브러리에 의존합니까?
Apidog는 API 테스트, 디버깅 및 문서화를 위한 내장 HTTP 클라이언트를 제공합니다. 테스트 스택에 Axios, node-fetch 또는 got이 필요하지 않습니다. HTTP 클라이언트는 플랫폼의 일부이며, 침해될 수 있는 서드파티 종속성이 없습니다.
특히 API 테스트의 경우, HTTP 요청을 Apidog로 이동하면 전체 공격 표면이 제거됩니다.
- API 테스트: Axios 기반 테스트 스크립트를 작성하는 대신 Apidog의 시각적 테스트 빌더 사용
- API 디버깅: 사용자 정의 HTTP 클라이언트 코드 대신 Apidog의 내장 요청 검사기 사용
- 모의 서버: Express + Axios로 모의 엔드포인트를 구축하는 대신 Apidog의 스마트 모의 서버 사용
- CI/CD 통합: npm HTTP 종속성 없이 자동화된 API 테스트를 위해 Apidog CLI 사용
Apidog를 무료로 사용해보고 API 워크플로우에서 HTTP 라이브러리 종속성을 제거하는 것이 공급망 위험을 어떻게 줄이는지 확인하십시오.
패키지 출처 확인
npm은 이제 Sigstore를 통한 패키지 출처 확인을 지원합니다. 의존하는 패키지가 이를 사용하는지 확인하십시오.
npm audit signatures
악성 Axios 버전에는 OIDC 출처가 없었습니다. CI/CD 파이프라인의 합법적인 릴리스는 빌드 원본에 대한 암호화 증명을 포함합니다. 출처 없이 새 버전이 나타나면 의심해야 합니다.
JavaScript 생태계에 미치는 영향
신뢰 모델이 깨졌다
npm의 신뢰 모델은 관리자 계정 보안에 의존합니다. 단일 침해된 자격 증명은 공격자에게 매주 8,300만 개의 프로젝트가 설치하는 패키지에 대한 제어권을 부여합니다. 2단계 인증이 도움이 되지만, 장기 액세스 토큰은 침해된 개발 환경에서 여전히 도난당할 수 있습니다.
커뮤니티는 여러 구조적 변화를 논의하고 있습니다.
- 필수 OIDC 게시: 다운로드 임계값 이상의 모든 패키지에 대해 장기 자격 증명 대신 OIDC 토큰을 사용하는 CI/CD 기반 게시를 요구합니다.
- 두 사람 릴리스 승인: 중요한 패키지의 릴리스에 대해 두 번째 관리자의 승인을 요구합니다.
- 런타임 권한 범위 지정: Deno의 권한 모델과 유사하게 `postinstall` 스크립트가 액세스할 수 있는 것을 제한합니다.
공급망 공격은 둔화되지 않고 있다
이 공격은 RubyGems 분열 사건 및 현재 진행 중인 PyPI 종속성 문제 발생 후 며칠 내에 발생했습니다. 모든 언어 생태계의 패키지 레지스트리는 지속적인 공격을 받고 있습니다. API 개발자는 종속성 트리를 편리함이 아닌 공격 표면으로 생각해야 합니다.
레딧 토론은 이러한 정서를 잘 포착했습니다: “NPM은 오늘날 인터넷의 가장 큰 약점이며 여전히 거대한 재앙을 초래할 것입니다.” 과장된 표현에 동의하든 안 하든, Axios 공격은 그 폭발 반경이 현실임을 보여줍니다.
비교: HTTP 클라이언트 종속성 접근 방식
| 접근 방식 | 공급망 위험 | 유지보수 부담 | 테스트 기능 |
|---|---|---|---|
| Axios + 사용자 정의 스크립트 | 높음 (서드파티 종속성) | 높음 (버전 관리) | 수동 설정 필요 |
| Node.js 기본 fetch | 낮음 (런타임에 내장) | 낮음 | 제한된 테스트 기능 |
| Apidog 내장 클라이언트 | 없음 (npm 종속성 없음) | 없음 (플랫폼 관리) | 완전한 테스트, 모의, 문서화 |
| curl/httpie 스크립트 | 낮음 (시스템 수준 도구) | 중간 | 제한된 자동화 |
자주 묻는 질문
Axios는 지금 사용해도 안전한가요?
네. 버전 1.14.0 및 0.30.3은 깨끗합니다. 침해된 버전(1.14.1 및 0.30.4)은 약 3시간 이내에 게시 취소되었습니다. `npm list axios`로 설치된 버전을 확인하고 잠금 파일을 확인하여 안전한 버전을 사용 중인지 확인하십시오.
내 컴퓨터에서 RAT이 실행되었는지 어떻게 알 수 있나요?
플랫폼별 아티팩트를 확인하십시오: macOS의 `/Library/Caches/com.apple.act.mond`, Linux의 `/tmp/ld.py`, 또는 Windows의 `%PROGRAMDATA%\wt.exe`. 또한 프로젝트에 `node_modules/plain-crypto-js`가 있는지 확인하십시오. 드로퍼는 자체적으로 정리하므로, 아티팩트가 없다고 해서 침해된 버전을 설치했다면 안전하다고 보장할 수는 없습니다.
Axios 사용을 완전히 중단해야 하나요?
반드시 그렇지는 않습니다. Axios는 강력한 실적을 가진 잘 관리된 라이브러리입니다. 그러나 이 공격은 서드파티 HTTP 클라이언트가 정말 필요한지 평가하도록 유도해야 합니다. Node.js 18+에는 기본 `fetch`가 포함되어 있습니다. API 테스트의 경우, Apidog와 같은 플랫폼은 이러한 종속성을 제거하는 내장 HTTP 클라이언트를 제공합니다.
프로젝트에서 공급망 공격을 어떻게 방지할 수 있나요?
정확한 종속성 버전을 고정하고, 잠금 파일을 커밋하고, CI/CD에서 `npm ci --ignore-scripts`를 실행하고, 종속성을 정기적으로 감사하고, `npm audit signatures`로 패키지 출처를 확인하고, 종속성 트리를 최소화하십시오. HTTP 통신을 위해 npm 패키지에 의존하지 않는 통합 플랫폼으로 API 테스트 워크플로우를 이동하는 것을 고려하십시오.
이 공격은 Claude 코드 소스 유출과 관련이 있었나요?
두 사건 모두 같은 날(2026년 3월 31일) 발생했지만 관련이 없습니다. Axios 공격은 국가 지원 위협 행위자에 의한 의도적인 공급망 침해였습니다. Claude 코드 유출은 Bun 빌드 도구 버그로 인해 소스 맵이 프로덕션에 배포된 결과였습니다. 우연한 타이밍은 npm 레지스트리 보안 전반에 대한 논의를 촉발했습니다.
Axios 공격의 배후는 누구인가요?
Google 위협 인텔리전스 그룹은 이 공격을 북한으로 의심되는 위협 행위자 UNC1069의 소행으로 지목했습니다. macOS 악성웨어는 Mandiant가 추적한 백도어 WAVESHAPER와 상당한 유사점을 공유합니다. 북한 그룹은 공급망 공격에 대한 광범위한 경험이 있으며, 일반적으로 개발자 자격 증명과 암호화폐 인프라를 노립니다.
몇 명의 개발자가 영향을 받았나요?
악성 버전은 약 2~3시간 동안 활성 상태였습니다. 주간 8,300만 회 다운로드를 고려하면 잠재적 노출은 상당합니다. npm은 공식적인 영향 수를 발표하지 않았습니다. StepSecurity의 런타임 탐지는 `npm install` 시작 후 1.1초 이내에 드로퍼가 C2와 접촉했음을 확인했으며, 이는 종속성 해결이 완료되기 전입니다.
Apidog가 공급망 공격 방지에 도움이 될 수 있나요?
Apidog는 API 테스트, 디버깅 및 문서화를 위한 내장 HTTP 클라이언트를 제공함으로써 주요 공격 벡터 중 하나를 제거합니다. 테스트 워크플로우에 Axios, node-fetch 또는 다른 HTTP 라이브러리를 설치할 필요가 없습니다. 이는 npm 종속성 노출 영역을 줄이고 API 개발 프로세스에 영향을 미치는 침해된 HTTP 클라이언트 패키지의 위험을 제거합니다.
핵심 요약
- Axios 공급망 공격은 단일 도난된 관리자 계정을 통해 8,300만 회 이상의 주간 다운로드를 침해했습니다.
- RAT는 모든 플랫폼(macOS, Windows, Linux)을 대상으로 하며 자격 증명, SSH 키 및 클라우드 토큰을 훔칩니다.
- 위 탐지 단계를 사용하여 즉시 시스템을 확인하십시오.
- 정확한 종속성 버전을 고정하고 CI/CD에서 postinstall 스크립트를 비활성화하십시오.
- API 테스트를 위해 Apidog와 같은 내장 도구를 사용하여 HTTP 클라이언트 종속성 노출 영역을 줄이십시오.
- 패키지 레지스트리 보안은 npm, PyPI 및 RubyGems에 영향을 미치는 시스템적인 문제입니다.
Axios 공격은 경고 신호입니다. `node_modules`의 모든 종속성은 신뢰 결정입니다. 기본적으로가 아니라 의도적으로 이러한 결정을 내리고 있는지 확인하십시오.
