요약
2026년 3월 30-31일, npm에서 axios 버전 1.14.1과 0.30.4가 악성 종속성으로 인해 침해당했으며, 이는 감염된 기기에 원격 접속 트로이 목마(RAT)를 설치합니다. 두 버전 모두 게시가 취소되었습니다. 안전한 버전은 1.14.0입니다. axios@1.14.1 또는 0.30.4를 설치했다면, 해당 기기를 침해당한 것으로 간주하고 모든 자격 증명을 즉시 교체하십시오.
axios란 무엇이며, 왜 중요한가요?
axios는 npm에서 매주 1억 회 다운로드되는 핵심 HTTP 클라이언트 라이브러리입니다. 프런트엔드 프레임워크, 백엔드 Node.js 서비스 그리고 다양한 기업 애플리케이션에서 사용됩니다. 이러한 근본적인 패키지가 침해되면 그 영향은 체인 전체로 확산됩니다.
2026년 3월 30일부터 31일까지 짧은 기간 동안, 단순히 npm install 명령을 실행한 개발자들은 자신도 모르는 사이 악성코드를 시스템에 설치했습니다.
이 사건은 가상의 위험이 아니라 실제로 발생한 공급망 공격입니다. 페이로드는 임의 명령 실행, 데이터 유출, 감염 기기에 상주할 수 있는 멀티스테이지 원격 접속 트로이 목마였습니다.
팀에서 axios를 사용하고, Apidog로 HTTP 클라이언트 통합을 설계/테스트하고 있다면, 다음 배포 전 반드시 아래 내용을 점검하세요.
공격 타임라인
-
2026년 3월 30일 23:59:12 UTC:
nrwise@proton.me계정이plain-crypto-js@4.2.1악성 패키지 게시. 18시간 전 게시된 4.2.0 버전은 정상. -
2026년 3월 31일 00:05:41 UTC: Socket 자동화 시스템이
plain-crypto-js@4.2.1을 6분 만에 악성으로 플래그. -
2026년 3월 31일 자정 직후:
axios@1.14.1이 npm에 게시되며, 침해된plain-crypto-js@4.2.1을 종속성으로 포함. 해당 릴리스는 공식 GitHub 태그에 없음. -
2026년 3월 31일 오전: GitHub 이슈
#10604에서 침해 보고. 관리자는 공격자 접근 권한을 즉시 철회하지 못함(더 높은 npm 권한 때문). -
2026년 3월 31일:
axios@1.14.1및axios@0.30.4가 npm에서 게시 취소됨. 관리자는 토큰 철회, 게시 제어 강화 등 대응 시작.
공격 방식
공격자는 axios의 게시 워크플로우 허점(장기 지속 npm 토큰)을 악용하여, 정상 릴리스 프로세스 밖에서 악성 버전을 게시했습니다.
- 새 버전은
plain-crypto-js@4.2.1(정상처럼 보이는 암호화 유틸리티 타이포스쿼트)을 종속성으로 도입했습니다. - 해당 패키지 내부에는 다단계 페이로드가 포함되어 있었습니다.
악성 페이로드 동작
- 설치 시 실행: npm 라이프사이클 스크립트로 보조 페이로드 드롭.
- RAT 배포: 지속적인 백도어 오픈.
- 유출: 임의 셸 명령 실행, 환경 변수/비밀 읽기, 네트워크로 데이터 전송.
RAT는 재부팅 후에도 지속됩니다. npm 패키지 제거만으로는 해결되지 않으니 반드시 명시적인 검색/제거 조치가 필요합니다.
제가 영향을 받았나요?
다음 조건에 해당하면 영향을 받았을 수 있습니다.
-
2026년 3월 30일 23:59 UTC ~ 3월 31일 정오 UTC 사이에
npm install axios또는npm install실행(axios가 package.json에 있을 때) -
node_modules/axios/package.json에 1.14.1 또는 0.30.4 버전이 표시됨 -
package-lock.json또는yarn.lock에서 axios가 1.14.1 또는 0.30.4로 해결됨
즉시 확인 방법
# 설치된 버전 확인
npm list axios
# 잠금 파일에서 axios 버전 찾기
grep '"axios"' package-lock.json | head -5
# plain-crypto-js 존재 여부 확인
npm list plain-crypto-js
ls node_modules/plain-crypto-js 2>/dev/null && echo "INFECTED" || echo "Not found"
plain-crypto-js가 node_modules에 존재하면, 악성 버전을 실제로 실행한 것입니다.
지금 해야 할 일
1. axios를 즉시 안전 버전으로 업데이트
npm install axios@1.14.0
# 또는 최신 안전 버전으로 고정
npm install axios@latest
확인:
npm list axios
# 1.14.0 이상(혹은 1.14.x의 클린 릴리스)이 표시되어야 합니다
2. 침해된 버전을 설치했다면
단순 업데이트가 아니라, 해당 기기가 침해된 것으로 간주하고 아래 조치를 수행하세요.
- 그 기기에서 접근 가능한 모든 비밀을 즉시 교체: API 키, DB 자격 증명, SSH 키, 클라우드 토큰,
.env변수 등 - 환경 변수 내 민감 정보 노출 여부 확인
- 영향받은 기간 내 아웃바운드 네트워크 연결 감사(알 수 없는 IP 연결 탐지)
- 지속성 체크: cron 작업, 시작 스크립트, systemd 서비스 등 감염 시점에 추가/수정된 항목 확인
- 침해된 버전이 설치된 서버/CI 러너라면 재이미징, 노트북은 자격 증명 전면 교체
3. CI/CD 파이프라인 감사
해당 기간 npm install을 실행한 빌드 파이프라인이 있다면, CI 환경도 침해되었을 수 있습니다.
# 빌드 로그에서 axios@1.14.1 설치 내역 확인
# CI 환경의 node_modules 점검
npm list axios plain-crypto-js
CI 파이프라인에서 접근 가능한 모든 비밀(배포 키, 클라우드 자격 증명, 레지스트리 토큰 등)도 교체하세요.
4. 잠금 파일(package-lock.json, yarn.lock) 확인 및 재생성
잠금 파일에 1.14.1이 존재한다면 반드시 재생성해야 합니다.
# 잠금 파일 제거 후 재설치
rm package-lock.json
npm install
새 잠금 파일이 안전한 버전으로 axios를 해결하는지 반드시 커밋 전에 확인하세요.
Apidog를 사용하여 axios API 호출 감사
API 호출에 axios를 사용한다면, Apidog는 종속성 업데이트 후에도 API 요청이 정상 동작하는지 빠르게 확인할 수 있습니다.
- axios@1.14.0 이상으로 업데이트 후, Apidog로 기존 API 엔드포인트를 가져와 회귀 테스트를 실행하세요.
- 악성 버전이 요청/응답 페이로드를 변조했을 가능성도 있으므로, Apidog의 어설션 기능을 적극 활용하세요.
// Apidog 응답 후 어설션 예시
pm.test("응답이 깨끗합니다 — 주입된 필드가 없습니다", () => {
const body = pm.response.json();
pm.expect(body).to.not.have.property('__injected');
pm.expect(pm.response.headers.get('X-Injected-Header')).to.be.null;
});
Apidog에서 전체 테스트 스위트를 실행하면, 프로덕션 배포 전 HTTP 클라이언트 동작에 대한 신뢰성 기준선을 확보할 수 있습니다.
Apidog 무료 체험으로 HTTP 클라이언트 회귀 테스트를 바로 시작하세요.
npm의 공급망 공격을 막기 어려운 이유
axios 공격은 예외가 아닙니다. 아래는 주목할 만한 npm 또는 OSS 공급망 공격 사례입니다.
- event-stream (2018): 악성 관리자가 비트코인 지갑을 노린 페이로드 주입 (주간 800만 다운로드)
- ua-parser-js (2021): 암호화폐 채굴기/비밀번호 탈취기 포함
- node-ipc (2022): 특정 국가 대상 파괴적 코드 추가
- xz utils (2024): Linux 핵심 압축 라이브러리에 백도어 심기
- axios (2026): 관리자 자격 증명 침해 + 악성 종속성(RAT) 배포
공통점: 코드가 아닌 게시 계정에 대한 신뢰
npm의 구조상, 관리자 계정이 침해되면 공격자는 동일한 신뢰/권한을 이어받아 악성 패키지를 게시할 수 있습니다.
실제로 도움이 되는 공급망 보안 조치
| 조치 | 내용 |
|---|---|
잠금 파일(package-lock.json) |
정확한 버전 고정, 자동 업데이트 방지 |
CI의 npm audit
|
배포 전 알려진 취약점 감지 |
| Socket.dev / Snyk | 행동 분석으로 CVE 등록 전에도 이상 탐지 |
| npm 2단계 인증 | 계정 침해 난이도 상승 |
단기 토큰으로 npm publish
|
토큰 유출 시 노출 기간 최소화 |
| PR에서 잠금 파일 검토 | 예기치 못한 종속성 변경 감지 |
axios 팀도 장기 토큰 문제를 인지하고, 더 엄격한 게시 제어로 전환 중입니다. 하지만 공급망 보안은 생태계 전체의 노력이 필요합니다.
침해 지표 (IOCs)
Socket 분석 기준:
-
악성 패키지:
plain-crypto-js@4.2.1,axios@1.14.1,axios@0.30.4 -
게시자 이메일:
nrwise@proton.me - 행동: npm 설치 시 네트워크 연결, RAT 지속성, 환경 변수/비밀 유출
- 안전한 axios 버전: 1.14.0 이하(0.30.4 제외), 1.13.x, 1.12.x
감염 의심 시 security@npmjs.com으로 신고하고, 로그를 보존하세요.
결론
axios 1.14.1 침해 사건은 종속성 보안이 일회성 점검이 아니라 지속적이고 자동화된 프로세스이어야 함을 보여줍니다.
- 버전을 잠그고
- CI에서 Socket과 같은 행동 분석 도구를 실행하며
- 이상 징후 발견 시 즉시 자격 증명 교체
- PR/코드 리뷰에서 잠금 파일을 꼼꼼히 살펴보세요
axios 업데이트 후 API 통합 신뢰를 재구축하려면, Apidog는 배포 전 HTTP 클라이언트 동작을 검증할 수 있는 테스트 시나리오, 어설션, 목킹 도구를 제공합니다.
FAQ
어떤 axios 버전이 침해되었나요?
axios@1.14.1, axios@0.30.4입니다. 두 버전 모두 npm에서 게시가 취소되었습니다. 안전한 버전은 1.14.0(또는 1.13.x, 1.12.x 라인의 모든 버전)입니다.
악성 axios 페이로드는 무엇을 하나요?
plain-crypto-js@4.2.1을 가져와, 원격 접속 트로이 목마(RAT)를 포함한 다단계 페이로드를 배포합니다. RAT는 임의 명령 실행, 환경 변수 및 비밀 유출, 재부팅 후 지속 등이 가능합니다.
침해된 버전을 설치했는지 어떻게 알 수 있나요?
npm list axios 실행 시 1.14.1 또는 0.30.4가 표시되면 영향을 받은 것입니다. 또한 npm list plain-crypto-js로 plain-crypto-js가 존재하는지 확인하세요.
axios만 업데이트하면 충분한가요?
아닙니다. 업데이트는 향후 악성 종속성 설치를 막지만, RAT가 이미 기기에 설치되어 있을 수 있습니다. 침해된 버전을 설치했다면 모든 비밀을 교체하고, 기기에서 지속성(백도어) 여부를 반드시 점검하세요.
공격자는 어떻게 관리자가 아니면서 npm에 게시할 수 있었나요?
공격자는 관리자 자격 증명을 침해, 게시 권한이 있는 장기 npm 토큰을 악용한 것으로 보입니다. axios 팀은 게시 제어 강화를 진행 중입니다.
이것과 일반적인 취약점의 차이는 무엇인가요?
취약점은 정상 코드 내 결함입니다. 공급망 공격은 신뢰받는 게시 채널을 통해 악성 코드를 주입합니다. 침해된 코드는 axios GitHub 저장소에는 존재하지 않고, npm 게시에 직접 주입되었습니다.
향후 공급망 공격으로부터 프로젝트를 어떻게 보호할 수 있나요?
잠금 파일 사용, CI에서 npm audit 실행, Socket.dev 등 행동 분석 도구 추가, npm 2단계 인증 활성화, 단기 게시 토큰 사용, PR에서 잠금 파일 변경사항 감사 등 보안 수칙을 철저히 준수하세요.
Top comments (0)