[삼냥이즈 개발일지] axios 공격 검토 및 패키지 매니저 이전
axios 공격 이슈
최근에 axios 공격이 큰 화재가 되고 있다. 특정 버전의 axios에 악성 코드가 삽입되어 3월 30일부터 31일 사이에 해당 패키지를 install한 경우 서버의 중요한 키나 파일들에 탈취 위험이 생겼다.
이번 공격은 Supply chain attack 방식으로 개발자가 axios 패키지를 설치할 때 RAT이라는 프로그램을 같이 설치하도록 한다. 여기서 Supply chain attack은 서버 자체의 보안 취약점을 공격하는 것이 아니라 개발자가 안전하다고 생각하는 패키지(여기선 axios) 등 신뢰된 경로를 이용해 공격하는 방식을 말한다. 이런 방식으로 RAT 프로그램이 설치되면 해커가 원격에서 감염된 컴퓨터를 제어할 수 있게 된다. 시스템 접근이나 정보 탈취가 가능하며, 중요한 api key 등도 탈취될 수 있다.
Mitigating the Axios npm supply chain compromise | Microsoft Security Blog
On March 31, 2026, the popular HTTP client Axios experienced a supply chain attack, causing two newly published npm packages for version updates to download from command and control (C2) that Microsoft Threat Intelligence has attributed to the North Korean
www.microsoft.com
악의적인 디펜던시가 삽입되어 있는 axios 패키지 버전은 1.14.1버전과 0.30.4 버전이다. 해당 버전은 3월 31일에 업데이트 된 버전으로 다행히 삼냥이즈 서버는 axios 패키지를 의존하고 있지만 31일 이후로 아직까지 새로운 디펜던시가 생기지 않아서 npm install을 하진 않은 상황이다. 그리고 다행히(?)도 자동 배포 환경도 아직 만들지 않았기 때문에 내가 모르는 사이에 해당 패키지가 설치될 일도 없었다.
다만 이번 사건을 겪으면서 필요성을 느낀 부분은 다음과 같다.
- 패키지 매니저 통일. 과거에 pnpm으로 이전하려다 꼬여서 npm을 그대로 쓰고 있다. 그런데 pnpm 파일이 남아 있어 의존하고 있는 패키지와 버전을 파악하는데 어려움이 있었다. 이번 기회에 pnpm으로 업그레이드 해볼 생각이다
- lock 파일 사용. 일반적으로 package.json 같은 파일은 설치 가능한 패키지 버전을 명시한다. 따라서 설치되는 환경마다 조금씩 다른 버전이 설치될 수도 있다. 위 마이크로소프트의 문서에서도 axios 패키지에 대해 정확한 버전을 사용하기를 권장하고 있다. 기존에 사용하던 npm install 대신 lock 파일 기반으로 정확한 버전을 설치하는 방식을 찾을 생각이다.

pnpm으로 패키지 매니저 이전
우선 락 파일을 기존 사용하던 package-lock.json을 제거하고, 대신 pnpm-lock.yaml 파일을 사용하였다.
nestjs/axios 패키지가 의존하는 axios 패키지의 버전을 설정하는게 관건이었다.
문제가 생긴 버전은 1.14.1 버전과 0.30.4 버전이다. 마이크로소프트에서도 1.14.0 버전으로 다운그레이드 하라고 한 것을 보면 1.14.0까지는 안전한 것 같지만 혹시 몰라서 그동안 계속 사용하면서 안정성까지 검증된 1.10.0 버전으로 설치하기로 했다.
nestjs/axios 패키지는 axios 패키지를 peer dependency로 가진다. 즉 일반적으로 내부에서 직접 설치해 사용하는 그냥 dependency와 다르게 axios를 프로젝트에서 직접 설치하고 관리해야 한다. 내가 직접 axios를 설치하지 않아도 기존 npm을 사용할 땐 에러가 나지 않았는데 pnpm을 사용하면서 의존성 관리가 엄격해져서 그런지 에러가 나기 시작했고, 이번 보안 이슈와 같은 상황을 방지하기 위해서라도 axios 버전을 관리할 필요가 있어서 직접 루트 dependency에 추가했다.
| 작업 | npm | pnpm |
| 의존성 설치 | npm install | pnpm install |
| 패키지 추가 | npm install 패키지 이름 | pnpm add 패키지 이름 |
| 패키지 삭제 | npm uninstall 패키지 이름 | pnpm remove 패키지 이름 |
| 빌드 | npm run build | pnpm build |
| 테스트 | npm test | pnpm test |
| 스크립트 실행 | npm run 스크립트 | pnpm 스크립트 |
pnpm 장점
https://ritty-log.tistory.com/23
pnpm
그동안 리티의 백엔드 서버는 패키지 매니저로 npm을 사용하고 있었다. pnpm이 npm보다 좋다는 말은 여러번 들어서 알고 있었고, 과거에 한번 pnpm으로 패키지 매니저를 바꾸려고 했다가 무언가 꼬
tech.sam-meows.com