Axios NPM 공급망 해킹 사고 전말(Post Mortem)
가장 널리 쓰이는 JavaScript HTTP 클라이언트 라이브러리 중 하나인 axios의 주요 관리자 계정이 탈취되어 악성 버전(1.14.1, 0.30.4)이 3시간가량 npm에 배포되는 공급망 공격이 발생했습니다. 공격자는 윈도우, macOS, 리눅스용 원격 접속 트로이목마(RAT)를 설치하는 악의적인 의존성을 주입했습니다. 개발자들은 해당 버전을 사용 중인지 즉시 확인하고, 감염된 환경의 모든 비밀키를 교체하는 등 비상 조치를 취해야 합니다.
저장소: axios / axios (Public)
포크(Fork): 11.6k 스타(Star): 109k
[이슈] Post Mortem: axios npm supply chain compromise #10636
- 담당자(Assignees):
- 라벨(Labels): type::security (보안과 관련된 변경사항으로 주로 CVE로부터 비롯됨)
설명 jasonsaayman이 2026년 4월 2일에 열음
본문
Post Mortem: axios npm 공급망 해킹 사고
- 날짜: 2026년 3월 31일
- 작성자: Jason Saayman
- 상태: 복구 진행 중
2026년 3월 31일, 탈취된 계정을 통해 npm 레지스트리에 두 개의 악성 axios 버전(1.14.1 및 0.30.4)이 게시되었습니다. 두 버전 모두 plain-crypto-js@4.2.1이라는 의존성을 주입하여 macOS, Windows, Linux에 원격 접속 트로이 목마(RAT)를 설치했습니다. 해당 악성 버전은 삭제되기 전까지 약 3시간 동안 배포된 상태로 유지되었습니다.
영향을 받으셨나요?
lockfile(잠금 파일)을 확인하세요:
grep -E " axios@(1\.14\.1|0\.30\.4)|plain-crypto-js " package-lock.json yarn.lock 2> /dev/null
만약 결과가 출력된다면, 해당 머신은 해킹된 것으로 간주해야 합니다:
axios@1.14.0(0.x 사용자의 경우0.30.3)으로 다운그레이드하세요.node_modules/plain-crypto-js/디렉토리를 삭제하세요.- 해당 머신의 모든 시크릿(secret), 토큰 및 자격 증명을 교체(rotate)하세요.
- 네트워크 로그에서
sfrclak[.]com또는142.11.206.73의 8000번 포트로의 연결 기록이 있는지 확인하세요. - 이 문제가 CI Runner에서 발생한 경우, 영향을 받은 빌드 동안 주입된 모든 시크릿을 교체하세요.
만약 이미 깨끗한 버전으로 고정(pinned)되어 있었고, 3월 31일 00:21 UTC부터 03:15 UTC 사이에 새로 설치를 실행하지 않았다면 안전합니다.
CI/CD 관련 단계를 포함한 자세한 복구 가이드는 다음을 참조하세요:
- StepSecurity: 전체 기술 분석 및 복구
- Snyk: 권고사항 및 스캐닝 가이드
- Socket: npm의 악성 종속성을 끌어오는 Axios 공급망 공격
무슨 일이 일어났나요 공격자는 표적화된 사회공학적 캠페인과 RAT(원격 접속 트로이 목마) 악성코드를 통해 수석 관리자의 PC에 대한 접근 권한을 획득했습니다. 이를 통해 그들은 npm 계정 자격 증명에 접근할 수 있었고, 이를 사용하여 악성 버전을 게시했습니다. 이번 공격은 오픈소스 관리자를 표적으로 삼은 유사한 캠페인에서 기록된 패턴을 따랐습니다.
해결 방안 수석 관리자의 모든 기기를 완전히 초기화(wipe)하고 모든 자격 증명을 재설정했습니다. 여기에는 개인 계정 및 기타 모든 목적의 계정과 상관없이 모든 플랫폼의 계정이 포함됩니다.
변경되는 사항 재발 방지를 위해 다음과 같은 변경 사항을 적용하고 있습니다:
- 조치 유형: 모든 기기 및 자격 증명 재설정 (예방)
- 변경 불가능한(Immutable) 릴리스 설정 (예방)
- 게시를 위한 OIDC(OpenID Connect) 흐름의 적절한 도입 (예방)
- 전반적인 보안 태세 개선 (예방)
- 모든 GitHub Actions를 업데이트하여 모범 사례 채택 (예방)
이 목록이 끝이 아닙니다. 우리는 이러한 항목을 넘어 보안을 개선하기 위해 계속해서 적극적으로 노력할 것입니다.
공격 타임라인 초기 해킹이 발생한 정확한 시기에 대한 타임라인은 알 수 없지만, 패키지 자체의 이벤트 순서는 다음과 같습니다:
- 3월 31일 약 2주 전: 수석 관리자를 대상으로 한 사회공학적 캠페인 시작
- 3월 30일 05:57 UTC:
plain-crypto-js@4.2.0이 npm에 게시됨 - 3월 31일 00:21 UTC:
plain-crypto-js@4.2.1이 주입된axios@1.14.1이 게시됨 - 3월 31일 약 01:00 UTC: 동일한 페이로드가 주입된
axios@0.30.4가 게시됨 - 3월 31일 약 01:00 UTC: 최초의 외부 탐지 발생
- 3월 31일 약 01:00 UTC: 커뮤니티 멤버들이 해킹을 보고하는 이슈를 제기함. 공격자는 탈취한 계정을 사용해 해당 이슈들을 삭제함.
- 3월 31일 01:38 UTC: axios 협력자 DigitalBrainJS가 손상된 버전을 지원 중단(deprecate) 처리하기 위한 PR
chore(ci): add deprecate action; #10591을 열고, 삭제된 이슈를 커뮤니티에 알리며 npm에 직접 연락함 - 3월 31일 03:15 UTC: npm에서 악성 버전 제거 완료
- 3월 31일 03:29 UTC: npm에서
plain-crypto-js제거 완료
자세한 기술적 타임라인은 다음을 참조하세요:
- StepSecurity: 포렌식 타임라인
- Datadog Security Labs: 전체 공격 흐름 및 대응 분석