ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Axios 사태로 다시 생각해보는 “안전하게 npm 패키지 사용하는 방법”
    JavaScript 2026. 6. 1. 00:23

    올해에 4월초에 꽤 큰 사건이 하나 있었다.

    👉 axios npm 패키지가 해킹된 사건

    단순 취약점이 아니라,
    “정상 패키지에 악성 코드가 포함된 상태로 배포”된 케이스다.

     

    사건 요약

    • axios maintainer 계정 탈취
    • 정상 버전처럼 보이는 패키지 배포
    • 내부에 악성 dependency 삽입
    • npm install 하는 순간 RAT(원격 제어 악성코드) 실행

    👉 더 무서운 포인트는 이거다:

    “코드를 실행한 게 아니라, 설치만 했는데 감염됨”

    실제로 이 공격은 약 2~3시간 동안만 살아있었고
    그 사이 설치한 환경은 그대로 위험에 노출됐다 (Snyk)


    여기서 깨달아야 하는 포인트

    이건 axios 문제가 아니다.

    👉 npm 생태계 자체의 구조적인 문제

    • 우리는 수백 개의 dependency를 신뢰한다
    • 그 중 하나만 뚫려도 끝이다
    • 심지어 “transitive dependency”면 눈에도 안 보임

    그래서 필요한 관점

    이제는 이렇게 생각해야 한다.

    ❌ “유명한 라이브러리니까 안전하겠지”
    “언제든 뚫릴 수 있다”


    1. 가장 강력한 방법: “시간 지연 (cooldown)”

    이거 진짜 핵심이다.

    왜 효과가 있냐

    대부분 공급망 공격 패턴은 이렇다

    악성 버전 배포 → 몇 시간 ~ 며칠 내 발견 → 삭제
    

    실제 axios도

    👉 약 2~3시간만 살아있다가 삭제됨 (Snyk)

    해결 방법 -> 일정 기간 지난 버전만 설치

    npm에서 이런 설정이 있다

    # .npmrc
    min-release-age=7d
    

    👉 의미

    “배포된 지 7일 안 된 패키지는 설치하지 않겠다”


    왜 이게 엄청 강력하냐

    • 공격은 대부분 “짧게 치고 빠짐”
    • 커뮤니티가 빠르게 탐지
    • npm에서 제거됨

    즉,

    👉 시간만 지나면 자연스럽게 필터링됨

    실제로 이런 정책 하나로
    많은 공격을 차단할 수 있다 (daniakash.com)


    pnpm / bun도 가능

    # pnpm-workspace.yaml
    minimumReleaseAge: 10080 # (분 단위 = 7일)
    

    한 줄 정리

    (쉽게 말하면, “갓 나온 버전은 위험하니까 당분간 안 쓴다” 전략이다)


    2. lockfile을 “신뢰”하지 말 것

    많이 착각하는 부분이다.

    “package-lock.json 있으니까 안전한 거 아닌가?”

    ❌ 아니다.


    왜냐면

    npm install 실행 → lockfile 갱신 → 악성 버전 기록됨
    

    그 이후

    npm ci
    

    👉 오히려 악성 버전을 “고정”해서 계속 설치함


    그래서 필요한 것

    • lockfile commit 필수
    • lockfile 변경 PR 리뷰
    • CI에서는 npm ci만 사용

    👉 lockfile은 “방어 수단”이 아니라
    “결과물”이다


    3. install script (postinstall) 경계하기

    axios 사건의 핵심도 이거였다.

    "scripts": {
      "postinstall": "악성 코드 실행"
    }
    

    👉 npm install 하는 순간 자동 실행됨


    대응 방법

    • 새 dependency 추가 시 확인
    • lockfile에서 hasInstallScript 체크
    • 필요 없으면 scripts disable

    현실적인 기준

    “왜 이 패키지가 설치 시 스크립트를 실행하지?”

    이 질문 한 번만 해도 많이 걸러진다.


    4. 자동 업데이트를 무조건 믿지 않기

    Dependabot, Renovate 좋다.

    근데 문제는:

    👉 “가장 최신 버전을 바로 올려준다”


    해결 방법

    Dependabot에도 cooldown 설정 가능

    updates:
      - package-ecosystem: "npm"
        cooldown:
          default-days: 7
    

    👉 최신이 아니라
    “검증된 최신”만 받는다


    5. CI/CD에서 install 전략 바꾸기

    많이 놓치는 부분


    ❌ 위험한 방식

    npm install
    
    • 매번 최신 버전 가져옴
    • 공격 타이밍에 그대로 당함

    ✅ 안전한 방식

    npm ci
    
    • lockfile 기반
    • 예측 가능

    근데 이것만으로 부족함

    👉 앞에서 말한 cooldown이랑 같이 써야 함


    정리

    이번 axios 사건이 말해주는 건 단순하다.

    👉 “npm install은 안전하지 않다”


    핵심 4가지

    1. min-release-age 설정 (가장 중요)
    2. lockfile 관리 (맹신 X)
    3. install script 경계
    4. 자동 업데이트도 cooldown 적용

    덧붙임 (개발자 관점)

    이거 하나는 확실히 바뀌어야 한다.

    예전.

    “최신 버전 쓰는 게 좋은 거 아닌가?”

    지금,

    👉 “조금 늦더라도 안전한 버전이 더 중요하다”


    한 줄 결론

    npm 생태계에서 가장 쉬운 보안은
    “조금 늦게 설치하는 것”이다


    참고자료

Designed by Tistory.