npm 공급망 공격이란 — 악성 패키지 하나가 14개월 동안 경고 없이 설치됐다
An npm supply-chain attack hides malware inside a JavaScript package that developers install as a dependency, often in an install script that runs automatically. CloudSEK's MALFEX report, published September 30, 2026, traced one operator who uploaded at least 12 packages between August 2023 and September 2026; one malicious package, function-flag, went about 14 months without an advisory. Eight flagged packages were downloaded 40,767 times and delivered the Overlord remote-access trojan or a Discord and browser data stealer.
npm 공급망 공격은 개발자가 자바스크립트 프로그램을 만들 때 내려받는 공개 부품(패키지)에 악성코드를 숨겨, 설치하는 순간 개발자 PC나 서버를 감염시키는 공격이다. npm 패키지는 설치 때 '설치 후 스크립트(postinstall)'를 자동으로 실행할 수 있어 별도 클릭 없이도 코드가 돈다. 보안업체 클라우드섹이 2026년 9월 30일 공개한 'MALFEX' 캠페인에서는 한 공격자가 2023년 8월부터 3년간 패키지 12개 이상을 올렸고, 그중 'function-flag'는 약 14개월 동안 경고 없이 설치 가능했다. 악성 판정된 8개 패키지는 4만767회 내려받혔다
3줄 요약
- 원리 — 공개 부품에 악성코드를 숨긴다. 설치 스크립트가 자동 실행돼 npm install 한 번이면 감염
- MALFEX — 한 공격자가 3년간 12개 이상 업로드, 하나는 14개월 무경고. 8개 합계 4만767회 다운로드
- 대응 — 설치 스크립트 차단, 버전 고정, 새 패키지 하루 이상 대기, 의존성 자동 수락 금지
핵심 질문
- npm 악성 패키지 확인 방법
- **설치 전에 이름·이력·설치 스크립트를 본다.** | 점검 | 방법 | |---|---| | 이름 | 유명 패키지와 한두 글자 다른 오타형인지 | | 이력 | 게시자·생성일·다운로드 수·저장소 링크 | | 스크립트 | package.json의 preinstall·postinstall 항목 | | 경고 | npm audit, 보안 권고(GHSA·MAL-) 조회 | | 차단 | npm install --ignore-scripts로 스크립트 실행 막기 |
- postinstall 스크립트 위험
- **설치만 해도 패키지 작성자의 코드가 내 PC 권한으로 실행된다.** | 항목 | 내용 | |---|---| | 실행 시점 | npm install 직후 자동 | | 권한 | 설치한 사용자 계정 권한 | | 악용 예 | 실행 파일 내려받기, 토큰·비밀번호 수집 | | 막는 법 | ignore-scripts 설정, 필요한 패키지만 허용 목록 |
- MALFEX npm 패키지 목록
- **클라우드섹이 경고가 없는 위험 패키지로 꼽은 것은 셋이다.** | 패키지 | 상태 | |---|---| | function-flag | 2025년 7월 18일부터 악성, 약 14개월 무경고 | | cdn-img-fetch | 상위 패키지 압수 뒤에도 설치 가능 | | function-color | function-flag를 의존성으로 끌어옴 | 이미 경고가 붙은 것: tlxbnhd, tldriver, mxdriver, img-to-native 등.
요즘 프로그램은 직접 짜는 코드보다 남이 만든 부품을 가져다 쓰는 코드가 훨씬 많다. 공급망 공격은 그 부품 상자에 독을 넣는 방식이다. 자바스크립트 개발자가 가장 많이 쓰는 부품 저장소 npm에서 또 사례가 나왔다. 보안업체 클라우드섹은 2026년 9월 30일 'MALFEX'라는 캠페인을 공개했다. 한 공격자가 3년 동안 패키지 12개 이상을 올렸고, 그중 하나는 약 14개월 동안 아무 경고 없이 설치할 수 있었다. 악성 판정된 8개 패키지의 다운로드는 합쳐서 4만767회다. npm 공급망 공격이 어떻게 작동하는지, 이번 사례에서 무엇이 새로웠는지, 개발자는 무엇을 하면 되는지 정리한다.
1. npm 공급망 공격의 원리 — 설치만 해도 실행된다
npm은 자바스크립트용 공개 패키지 저장소다. 개발자는 npm install 패키지명 한 줄로 남이 만든 기능을 프로젝트에 붙인다. 문제는 패키지 하나가 다른 패키지 수십 개를 줄줄이 끌고 온다는 점, 그리고 설치 과정에서 코드를 자동 실행할 수 있다는 점이다.
| 단계 | 일어나는 일 |
|---|---|
| ① 업로드 | 공격자가 그럴듯한 이름으로 패키지 게시(또는 기존 인기 패키지 계정 탈취) |
| ② 의존성 | 정상처럼 보이는 패키지가 악성 패키지를 의존성으로 끌어옴 |
| ③ 설치 | 개발자가 npm install 실행 |
| ④ 자동 실행 | package.json의 preinstall·postinstall 스크립트가 사용자 권한으로 실행 |
| ⑤ 감염 | 원격조종 악성코드 설치, 토큰·비밀번호·브라우저 데이터 탈취 |
공격 유형은 크게 셋이다.
| 유형 | 방식 | 대표 사례 |
|---|---|---|
| 오타 노리기(타이포스쿼팅) | 유명 패키지와 한두 글자 다른 이름 | 클라우드섹이 9월 추적한 오타형 패키지 85개 |
| 계정·빌드 탈취 | 인기 패키지 관리자 계정이나 배포 파이프라인을 장악해 악성 버전 배포 | 2025년 8월 Nx 사건 |
| 위장 도구 | 정상 기능을 하면서 뒤에서 악성 행위 | MALFEX의 일부 패키지 |
2. MALFEX — 무엇이 새로웠나
| 항목 | 내용 |
|---|---|
| 활동 기간 | 2023년 8월~2026년 9월 |
| 운영 | 포르투갈어 계정을 쓰는 단일 공격자 |
| 규모 | npm 패키지 12개 이상 + 깃허브 저장소 1개 |
| 분류 | 경고(MAL-) 붙은 악성 5개, 경고 없는 악성 3개, 위장용 정상 도구 4개 |
| 다운로드 | 악성 판정 8개 합계 4만767회(더해커뉴스) |
| 탐지 지연 | function-flag는 2025년 7월 18일부터 악성, 약 14개월 무경고 |
| 공개 | 아마존 인스펙터가 9월 22~28일 5개에 경고, 클라우드섹 9월 30일 보고서 |
감염 경로는 두 갈래였다.
| 경로 | 동작 | 최종 피해 |
|---|---|---|
| A | 설치 스크립트가 이미지(PNG)로 위장한 윈도우 실행 파일을 내려받음 → 오토잇(AutoIt) 스크립트로 풀어 실행 | 오픈소스 원격조종 악성코드 '오버로드(Overlord)' 설치 |
| B | PNG 겸용 파일에서 암호화된 코드를 꺼내 64MB짜리 Node.js 프로그램을 내려받음 | 디스코드 앱에 침투, 브라우저 데이터·텔레그램 세션 탈취 |
새로운 점은 두 가지다. 첫째, 지휘 서버 주소를 솔라나 블록체인 메모에 숨기는 기능이 실제로 켜진 표본이 처음 확인됐다. 서버를 차단해도 블록체인에 새 주소를 적으면 그만이라 막기 어렵다. 둘째, npm이 상위 악성 패키지 'img-to-native'를 압수한 뒤에도 그 패키지가 의존하던 'cdn-img-fetch'는 계속 설치할 수 있었다. 부품 하나를 치워도 그 부품이 끌고 오던 부품은 남는다는 허점이다.
3. AI 코딩 에이전트와는 무슨 상관인가
MALFEX 자체가 AI 코딩 도구를 노렸다는 증거는 없다. 다만 위험이 커지는 방향은 분명하다. AI 코딩 에이전트는 필요한 기능을 찾으면 패키지 설치 명령을 스스로 제안하거나 실행한다. 사람이 이름 한 글자를 확인하지 않고 '수락'을 누르면 오타형 패키지가 그대로 들어온다. 2025년 8월 Nx 사건에서는 악성 설치 스크립트가 개발자 PC에 깔린 AI 코딩 도구를 위험한 옵션으로 호출해 민감한 파일을 뒤지게 했다는 보고가 있었다. 에이전트를 가둬 두는 장치의 한계는 「샌드박스란」에, 외부 문서가 AI를 조종하는 공격은 「프롬프트 인젝션이란」에 정리했다.
4. 개발자와 회사가 할 수 있는 것
| 조치 | 방법 | 효과 |
|---|---|---|
| 설치 스크립트 차단 | npm install --ignore-scripts 또는 npm config set ignore-scripts true | 설치 시 자동 실행 차단(필요한 패키지만 별도 허용) |
| 버전 고정 | package-lock.json 커밋, npm ci로 설치 | 몰래 바뀐 새 버전 유입 차단 |
| 대기 기간 | 새로 올라온 버전은 하루 이상 지나 설치 | 대부분의 악성 버전은 며칠 안에 신고·삭제 |
| 이름 확인 | 오타형 이름, 최근 생성, 저장소 링크 없음 경계 | 타이포스쿼팅 방어 |
| 정기 점검 | npm audit, 의존성 검사 도구, 보안 권고 구독 | 이미 들어온 악성 패키지 발견 |
| AI 에이전트 | 패키지 설치는 사람 승인 후, 자동 수락 끄기 | 에이전트 경유 유입 차단 |
클라우드섹은 MALFEX와 관련해 function-flag·cdn-img-fetch·function-color 설치 차단, 윈도우 사용자 폴더의 오토잇 실행 파일과 '\Maiden'이라는 예약 작업 점검, 공격 서버로의 외부 연결 차단을 권고했다. 저장소 운영자에게는 패키지를 내릴 때 그 패키지가 선언한 의존성까지 함께 검사하라고 했다.
5. 자주 묻는 질문
| 질문 | 답 |
|---|---|
| 일반 사용자도 위험한가 | 직접 위험은 개발자 PC·빌드 서버다. 다만 감염된 빌드로 만든 앱이 배포되면 사용자에게 번질 수 있다 |
| npm만의 문제인가 | 아니다. 파이썬 PyPI, 러스트 crates.io 등 공개 저장소 전반의 문제다. npm은 규모가 가장 커서 사례가 많다 |
| 백신이 막아 주나 | 일부는 잡지만, 설치 스크립트는 개발 도구가 정상적으로 실행하는 것이라 놓치기 쉽다. MALFEX도 14개월 동안 경고가 없었다 |
| 취약점 점수로 판단하면 되나 | 악성 패키지는 '취약점'이 아니라 '의도된 악성코드'라 CVSS 점수(「CVSS란」)와 별개로 MAL- 권고로 관리된다 |
6. 남은 것과 확인되지 않은 것
- 패키지 수는 집계 기준에 따라 12개 이상(클라우드섹) 또는 악성 8개(더해커뉴스)로 다르다.
- 디스코드로 데이터를 빼돌리는 웹훅이 보고서 시점에 여전히 살아 있었다고 클라우드섹은 밝혔으나, 이후 차단 여부는 확인하지 못했다.
- 국내 피해 사례는 확인되지 않았다.
출처
- CloudSEK — MALFEX: A malicious npm postinstall no advisory has caught for fourteen months
- The Hacker News — Eight Malicious npm Packages Downloaded 40,767 Times Deliver Overlord RAT and Stealer
- Hackread — MALFEX npm Attack Spreads Windows RAT, Steals Discord and Browser Data
- AI Incident Database — Incident 1210: Malicious Nx npm Packages Reportedly Weaponize AI Coding Agents
- npm Docs — scripts (lifecycle scripts)