npm 3분 소요

axios가 해킹당했다 — 주간 다운로드 4천만의 NPM 패키지가 뚫린 날

지난주, 자바스크립트 생태계가 또 한 번 흔들렸습니다. 주간 다운로드 4천만 건 이상을 기록하는 NPM 패키지 axios가 공급망 공격(supply chain attack)에 노출된 겁니다. 보안 유튜버 John Hammond의 분석 영상이 공개 나흘 만에 7만 뷰를 넘기며, 개발자 커뮤니티 전체가 긴장 모드에 들어갔습니다.

npm install 한 줄이 백도어가 되는 세상

공급망 공격의 원리는 단순합니다. 개발자가 직접 작성한 코드가 아니라, 그 코드가 의존하는 외부 패키지를 오염시키는 거죠. axios처럼 사실상 표준에 가까운 라이브러리가 타깃이 되면 피해 범위는 기하급수적으로 커집니다. npm install 한 번이면 감염된 코드가 프로젝트에 스며들고, CI/CD 파이프라인을 타고 프로덕션 서버까지 도달할 수 있습니다.

이번 공격에서는 원격 접근 트로이목마(RAT)가 삽입된 것으로 알려졌습니다. RAT는 공격자가 감염된 시스템을 원격으로 제어할 수 있게 해주는 악성코드입니다. 단순히 정보를 빼가는 수준이 아니라, 서버 자체를 장악할 수 있다는 뜻입니다.

axios라서 더 심각하다

axios는 그냥 인기 있는 라이브러리가 아닙니다. Node.js 백엔드부터 React, Vue 프론트엔드까지, 자바스크립트로 HTTP 요청을 보내는 거의 모든 곳에서 쓰입니다. GitHub에서 10만 개 이상의 저장소가 axios를 직접 의존하고 있고, 간접 의존까지 포함하면 그 숫자는 훨씬 커집니다.

문제는 많은 프로젝트가 package.json에서 버전을 캐럿(^) 범위로 지정한다는 점입니다. 이 경우 npm install을 실행할 때마다 최신 마이너 또는 패치 버전을 자동으로 가져옵니다. 오염된 버전이 올라가면, 별도의 조치 없이도 다음 빌드에서 바로 감염됩니다.

반복되는 패턴, 달라지지 않는 대응

NPM 공급망 공격은 이번이 처음이 아닙니다. 2021년 ua-parser-js, 2022년 colors.jsfaker.js, 2024년 xz-utils 사건까지. 패턴은 놀라울 정도로 비슷합니다.

  • 유지보수자 계정이 탈취되거나, 악의적인 기여자가 신뢰를 쌓은 뒤 코드를 오염시킵니다
  • 수백만 다운로드를 가진 패키지가 타깃이 됩니다
  • 발견까지 수시간에서 수일이 걸리고, 그 사이 피해가 확산됩니다

매번 사건이 터질 때마다 커뮤니티는 경각심을 가지지만, 근본적인 구조는 변하지 않았습니다. NPM 레지스트리의 패키지 게시 과정은 여전히 단일 계정의 인증 토큰 하나에 의존하는 경우가 많습니다.

당장 확인해야 할 것들

이번 사건을 계기로 점검해볼 만한 항목들이 있습니다.

lockfile 관리가 제대로 되고 있는가. package-lock.json이나 yarn.lock을 커밋하고, CI에서 npm ci를 사용하고 있다면 의도치 않은 버전 업데이트는 막을 수 있습니다. 하지만 lockfile이 없거나 무시하고 있다면 지금 당장 바꿔야 합니다.

의존성 감사를 자동화하고 있는가. npm audit은 기본이고, Socket.dev나 Snyk 같은 도구는 패키지의 행동 변화까지 감지합니다. 새로운 네트워크 요청이 추가되거나, 파일 시스템 접근 패턴이 바뀌면 경고를 보내주는 식입니다.

2FA가 활성화되어 있는가. NPM 계정에 이중 인증을 설정하는 건 가장 기본적인 방어선입니다. 오픈소스 유지보수자라면 필수이고, 조직 단위로 강제하는 것이 이상적입니다.

오픈소스의 구조적 딜레마

이 문제의 근본에는 불편한 진실이 있습니다. 수십억 달러 가치의 소프트웨어 인프라가 소수의 무급 유지보수자에게 의존하고 있다는 것입니다. axios의 핵심 유지보수자는 손에 꼽을 정도입니다. 이들의 계정 하나가 뚫리면 전 세계 수백만 프로젝트가 위험에 처합니다.

기업들은 오픈소스를 공짜로 가져다 쓰면서도, 그 보안에 투자하는 데는 인색합니다. OpenSSF나 GitHub의 Sponsors 프로그램 같은 시도가 있지만, 생태계의 규모에 비하면 아직 턱없이 부족합니다.


결국 이번 axios 사건은 하나의 질문으로 귀결됩니다. 우리는 의존성 목록에 있는 패키지들을 정말로 신뢰할 수 있는가. node_modules 폴더 안에 뭐가 들어있는지 마지막으로 확인해본 게 언제인지, 한번 떠올려 보시기 바랍니다.

npm supply-chain-attack axios 오픈소스 보안

댓글

    댓글을 불러오는 중...