정보보안

npm 인기 라이브러리 axios 해킹, 악성코드 심은 버전 유포돼...주간 1억 회 다운로드 패키지에 원격제어 트로이목마 삽입

2026년 3월 31일

3

thumbnail.webp
npm 패키지 axios의 관리자 계정이 탈취돼 악성 버전이 배포됐다. 약 3시간 만에 삭제됐지만 파장이 우려된다.
[한국정보기술신문] 자바스크립트 생태계에서 가장 널리 쓰이는 HTTP 클라이언트 라이브러리 axios가 공급망 공격에 노출됐다. 2026년 3월 30일(UTC 기준), 보안 기업 StepSecurity는 npm 레지스트리에 게시된 axios 1.14.1 버전과 0.30.4 버전에 원격제어 트로이목마(RAT)를 설치하는 악성코드가 삽입된 사실을 확인했다. axios는 주간 다운로드 수가 1억 회를 넘는 핵심 라이브러리로, 전 세계 수많은 프로젝트에서 사용되고 있어 피해 규모가 상당할 것으로 예상된다.

관리자 계정 탈취로 시작된 정밀 공격

이번 사건은 axios 프로젝트의 주요 관리자인 jasonsaayman의 npm 계정이 탈취되면서 시작됐다. 공격자는 해당 계정의 등록 이메일을 자신이 관리하는 ProtonMail 주소로 변경한 뒤, 1.x와 0.x 두 릴리스 브랜치에 악성 빌드를 동시에 게시했다. npm 레지스트리에는 정상적인 관리자 이름으로 기록되기 때문에 겉으로 보기에는 정상 배포와 구분이 어려웠다.
주목할 점은 정상적인 axios 배포가 GitHub Actions의 OIDC 기반 신뢰 게시 메커니즘을 통해 이루어지는 반면, 이번 악성 버전은 탈취된 npm 액세스 토큰을 이용해 수동으로 게시됐다는 것이다. GitHub 저장소에는 해당 버전에 대응하는 커밋이나 태그가 존재하지 않는다.

18시간 전부터 사전 준비된 치밀한 공격

공격자는 악성 axios 버전을 배포하기 약 18시간 전에 plain-crypto-js라는 가짜 패키지를 npm에 먼저 등록했다. 이 패키지는 정상적인 암호화 라이브러리 crypto-js의 코드를 그대로 복사해 넣어 겉으로는 정상 패키지처럼 보이도록 위장했다. 먼저 깨끗한 4.2.0 버전을 게시해 배포 이력을 만든 뒤, 악성 코드가 담긴 4.2.1 버전을 올리는 방식이었다.
악성 axios 버전에는 이 plain-crypto-js가 런타임 의존성으로 추가됐다. axios 소스코드 어디에서도 이 패키지를 불러오는 코드는 없으며, 오직 설치 시 자동 실행되는 postinstall 스크립트를 작동시키기 위한 목적이었다.

macOS, 윈도우, 리눅스 모두 공격 대상

npm install 명령을 실행하면 plain-crypto-js의 postinstall 스크립트가 자동으로 작동한다. setup.js라는 이름의 이 스크립트는 XOR 암호화와 Base64 인코딩으로 이중 난독화되어 있으며, 운영체제를 판별한 뒤 각 플랫폼에 맞는 방식으로 악성코드를 설치한다.
macOS에서는 AppleScript를 통해 애플 시스템 캐시 파일로 위장한 RAT 바이너리를 다운로드하고, 윈도우에서는 PowerShell을 복사해 윈도우 터미널 실행 파일로 위장한 뒤 VBScript를 거쳐 악성 스크립트를 실행한다. 리눅스에서는 curl로 파이썬 스크립트를 내려받아 백그라운드에서 실행한다. 세 플랫폼 모두 외부 명령제어(C2) 서버에 접속해 2단계 페이로드를 받아오는 구조다.
특히 위험한 것은 자기 은폐 기능이다. 악성 스크립트는 실행이 끝나면 스스로를 삭제하고, 악성 package.json을 깨끗한 파일로 교체한다. 교체된 파일에는 버전 번호까지 4.2.0으로 기재되어 있어, 사후 조사에서도 감염 여부를 파악하기 어렵게 만든다. npm install이 시작된 지 불과 2초 만에 이미 공격자의 서버와 통신이 이루어졌다는 점에서, 이번 공격은 npm 상위 10대 패키지를 겨냥한 공급망 공격 중 가장 정교한 사례 중 하나로 평가되고 있다.

약 3시간 만에 삭제, 그러나 피해 우려 여전

npm 측은 악성 버전이 게시된 지 약 3시간 만에 해당 버전을 삭제하고 plain-crypto-js에 보안 보류 조치를 취했다. 그러나 짧은 시간이었음에도 주간 1억 회 이상 다운로드되는 라이브러리인 만큼 상당수 개발자와 CI/CD 파이프라인이 영향을 받았을 가능성이 있다.

감염 여부 확인과 대응 방법

개발자들은 먼저 프로젝트에서 axios 1.14.1 또는 0.30.4 버전이 설치되어 있는지 확인해야 한다. node_modules 폴더에 plain-crypto-js 디렉터리가 존재한다면, 정상적인 axios에는 포함되지 않는 패키지이므로 감염된 것으로 판단할 수 있다.
macOS에서는 /Library/Caches/com.apple.act.mond 파일을, 윈도우에서는 %PROGRAMDATA%\wt.exe 파일을, 리눅스에서는 /tmp/ld.py 파일을 확인해야 한다. 이 파일이 발견되면 해당 시스템은 완전히 침해된 것으로 간주해야 한다.
대응 조치로는 axios를 안전한 버전인 1.14.0 또는 0.30.3으로 즉시 다운그레이드하고, package.json에 overrides 설정을 추가해 악성 버전으로의 재설치를 방지해야 한다. RAT가 발견된 시스템은 현장 복구를 시도하지 말고 깨끗한 상태에서 새로 구축해야 하며, npm 토큰, AWS 키, SSH 키 등 해당 시스템에서 접근 가능했던 모든 인증 정보를 즉시 교체해야 한다. CI/CD 환경에서는 --ignore-scripts 옵션을 기본 정책으로 적용해 postinstall 스크립트가 자동 실행되지 않도록 하는 것이 권장된다.
이번 사건은 오픈소스 공급망 보안의 취약성을 다시 한번 드러냈다. 단 하나의 관리자 계정 탈취만으로도 전 세계 수백만 프로젝트에 영향을 줄 수 있다는 점에서, npm 패키지 배포 시 다중 인증 의무화와 OIDC 기반 신뢰 게시 확대 등 근본적인 보안 체계 강화가 필요하다는 목소리가 높아지고 있다.
한국정보기술신문 정보보안분과 안서진 기자 news@kitpa.org