본문으로 건너뛰기
피드

npm의 기본 설정이 나쁜 이유 — axios 공격으로 다시 드러난 JavaScript 공급망의 구조적 문제

security 약 6분
vote
0
댓글
북마크

axios npm 패키지 탈취 사건을 계기로 npm 클라이언트의 기본 설정이 공급망 공격을 구조적으로 허용하는 이유를 분석. 락파일 자동 수정, postinstall 기본 실행, npx 무방비, trusted publishing 해제 가능 등 핵심 문제점과 pnpm/Bun/Deno의 대안을 비교.

  • 1

    npm install이 락파일을 조용히 수정하는 게 기본 동작

  • 2

    postinstall 스크립트가 모든 의존성에 기본 허용 — axios 공격이 이걸 사용

  • 3

    npx는 락파일/쿨다운/핀 없이 최신 버전을 바로 실행

  • 4

    trusted publishing을 관리자가 언제든 해제 가능

  • 5

    pnpm/Bun은 이미 더 안전한 기본값을 채택했지만 npm이 기본 클라이언트

  • axios npm 패키지가 또 공격당함 — 공격자가 관리자 계정을 탈취, RAT(원격 접근 트로이목마)를 담은 악성 버전을 2~3시간 동안 배포
    • axios는 주간 다운로드 8,300만 건. 이런 공급망 공격이 JavaScript에서만 유독 반복되는 이유가 npm 클라이언트의 기본 설정(defaults) 때문이라는 분석

npm install이 락파일을 덮어씀

  • npm installpackage.jsonpackage-lock.json 사이에 드리프트가 감지되면 락파일을 조용히 수정함
    • 실제로 원하는 동작은 npm ci — 락파일 불일치 시 설치 거부, 수정 안 함
    • 대부분의 개발자가 npm ci를 CI에서 뭔가 깨진 후에야 발견하고, 많은 경우 아예 모름

라이프사이클 스크립트가 기본으로 실행됨

  • npm install 시 모든 의존성과 전이 의존성이 postinstall 스크립트를 통해 임의 코드를 실행할 수 있음
    • 실제로 필요한 건 C/C++ 바인딩 컴파일하는 네이티브 애드온 정도인데, npm은 모든 패키지에 이 권한을 기본으로 부여
    • axios 공격이 정확히 이 메커니즘을 사용 — plain-crypto-js의 깨끗한 버전을 18시간 먼저 게시 → 페이로드 담은 두 번째 버전 → axios 의존성으로 추가 → 설치 시 자동 RAT 설치

⚠️주의

> pnpm v10은 postinstall 스크립트를 기본 차단하고 allow-list 방식으로 전환함. Bun도 trustedDependencies로 opt-in 방식. npm은 v11.10.0에서 npm trust를 추가했지만 기본값은 그대로 — 설정하지 않으면 모든 패키지가 스크립트 실행 가능.

Trusted Publishing의 허점

  • npm의 OIDC 기반 trusted publishing은 CI에서 장기 토큰 없이 배포할 수 있게 해줌 — 좋은 기능
    • 하지만 관리자(또는 계정 탈취한 공격자)가 언제든 trusted publishing을 끄고 토큰 기반으로 되돌릴 수 있음
    • 소비자에게는 이 변경에 대한 시그널이 전혀 없음
    • trusted publishing 활성화는 npm 지원팀만 해제 가능한 단방향 전환이어야 함

npx는 안전장치가 아예 없음

  • npx는 락파일을 사용하지 않음 — 최신 버전을 그대로 가져와서 즉시 실행
    • 쿨다운도 없고 핀 버전도 없음
    • 공격자가 인기 npx 타겟의 악성 버전을 올리면 그 순간부터 모든 호출이 공격 코드를 받음
    • 튜토리얼, CI 스크립트, AI 코딩 에이전트가 npx 명령을 생성해서 실행하는 워크플로우에서 특히 위험

쿨다운과 GitHub Actions 문제

  • min-release-age(v11.10.0)로 최근 게시된 버전 설치를 거부할 수 있지만, 기본값이 꺼져 있어서 모르면 못 씀
    • 대부분의 악성 버전이 24~48시간 내 잡히므로 적당한 쿨다운만 있어도 대부분의 공급망 공격을 차단 가능
  • npm이 클래식 토큰을 폐기하고 90일 수명 제한을 걸었지만, GitHub Actions에서 토큰이 repository secrets에 저장되는 구조는 변함없음
    • Shai-Hulud 공격이 바로 CI 환경에서 토큰을 수확하는 방식이었고, Trivy 공급망 침해도 같은 공격면 — 유출 토큰으로 76개 버전 태그에 악성 코드 강제 푸시

npm이 바꿔야 할 것

  • pnpm, Bun, Deno 모두 더 나은 기본값을 선택했지만, npm이 Node.js와 함께 배포되는 기본 클라이언트라 다른 도구의 개선이 생태계 전체 보안 수준을 바꾸지 못함
    • npm은 더 안전한 옵션을 플래그나 설정 키로 제공하긴 함
    • 하지만 npm install이나 npx를 플래그 없이 칠 때 기본으로 일어나는 일을 바꾸지 않으면 의미가 없음
    • OpenSSF의 "secure by default" 원칙이 정확히 이걸 말하는 것

기술 맥락

  • npm installnpm ci의 차이가 왜 중요하냐면, 개발 중에 npm install을 쓰면 락파일이 변경되면서 의존성 트리가 미묘하게 달라질 수 있어요. CI에서 npm ci를 쓰는 건 상식이 되었지만, 로컬 개발에서도 의도치 않은 의존성 변경을 인지하는 게 중요함
  • postinstall 스크립트 차단이 pnpm/Bun에서는 기본인데 npm에서는 여전히 opt-in인 이유는 하위 호환성 때문이에요. 네이티브 모듈(node-gyp 등)이 postinstall에 의존하는 패키지가 아직도 상당수 있어서 기본 차단하면 기존 프로젝트가 대량으로 깨지거든요. 하지만 보안 관점에서는 이미 한참 넘은 문제
  • npx가 AI 에이전트 워크플로우에서 위험하다는 지적은 꽤 시의적절해요. Claude Code, Copilot 같은 에이전트가 npx create-xxx를 자동으로 실행하는데, 에이전트는 패키지 진위를 검증하지 않으니까 악성 패키지가 끼어들 여지가 커요

npm의 문제는 안전한 옵션이 없는 게 아니라 기본값이 안전하지 않다는 것. 스캐너나 정책보다 기본 설정 하나 바꾸는 게 공급망 보안에 더 큰 영향을 줌.

댓글

댓글

댓글을 불러오는 중...

security

엘에이 경찰, 사생활 침해 논란 끝에 플록 번호판 감시 계약 종료

엘에이 경찰이 번호판 인식 카메라 업체 플록 세이프티와의 3년 계약을 연장하지 않기로 했어. 시민권, 프라이버시, 데이터 보관과 공유 문제를 해결하지 못했다는 게 핵심 이유야. 플록은 미국 전역에 최소 8만 대 카메라망을 깔아 경찰과 연방기관이 차량을 추적할 수 있게 해왔고, 오탐·보안 사고·이민 단속 악용 의혹까지 겹치며 압박이 커졌어.

security

크로미움 148부터 Math.tanh 한 번으로 운영체제 지문이 새는 문제

크로미움 148 이후 V8이 Math.tanh 계산을 자체 구현 대신 운영체제의 수학 라이브러리에 맡기면서, 같은 입력값도 리눅스·맥·윈도우에서 마지막 비트가 달라지는 지문 신호가 생겼다. 이 차이는 User-Agent로 맥이라고 주장하면서 리눅스 수학 결과를 내는 식의 위장을 바로 들키게 만든다. CSS 삼각함수와 웹 오디오까지 보면 브라우저 수학 경로가 꽤 복잡하게 갈라지고, 제대로 흉내 내려면 실제 운영체제 라이브러리의 비트 단위 동작까지 맞춰야 한다.

security

출입통제도 클라우드 구독제로 간다…제로트러스트·AI 분석이 승부처

기업 출입보안이 사업장별 서버를 두는 방식에서 클라우드 기반 서비스형 출입통제(ACaaS)로 옮겨가고 있다. 시장은 2026년 17억8000만 달러에서 2030년 31억9000만 달러로 커질 전망이고, 제로트러스트·모바일 인증·AI 출입 분석·스마트빌딩 통합이 핵심 경쟁 포인트로 꼽힌다.

security

AWS·구글 클라우드, 양자컴퓨터 대비해 암호 체계 갈아엎는 중

AWS와 구글 클라우드가 양자컴퓨터 시대를 대비해 기존 공개키 암호와 양자내성암호를 함께 쓰는 하이브리드 전환을 시작했다. 핵심 배경은 지금 훔친 암호문을 나중에 양자컴퓨터로 푸는 ‘선수집·후해독’ 공격이고, 국내도 통신·금융·국방 등 5개 분야에 45억원을 투입해 실증에 들어간다.

security

보안 점검 맡긴 AI 에이전트가 악성코드를 직접 실행할 수 있다는 경고

AI 보안 에이전트가 저장소를 검사하다가 README 같은 문서에 숨은 프롬프트 인젝션에 속아 악성 바이너리를 실행할 수 있다는 연구가 나왔다. 클로드 코드와 코덱스의 자동 모드처럼 승인 없이 명령을 수행하는 구성에서 문제가 재현됐고, 여러 모델과 공급업체를 가로질러 같은 패턴이 통했다는 점이 핵심이다.