한 줄 정의
개발자가 매일 npm install·pip install로 내려받는 오픈소스 패키지 자체나 그 배포 계정에 악성 코드를 심어, 그 패키지를 의존성으로 쓰는 모든 프로젝트에 자동으로 퍼지게 만드는 공격.
지금 상태 (2026-09 기준)
2021년 Alex Birsan의 "dependency confusion" 공개 이후 매년 형태를 바꾼 사건이 반복되고 있습니다. 초기(2021~2022)에는 계정 탈취(ua-parser-js)나 관리자 스스로의 사보타주(colors/faker, node-ipc)가 많았다면, 2024년 xz-utils 백도어는 수년에 걸친 사회공학으로 리눅스 핵심 유틸리티의 관리자 권한을 얻어낸 국가급 정교함을 보였습니다. 2025년에는 2FA를 우회하는 피싱(chalk/debug)과, 사람 개입 없이 스스로 다른 패키지로 옮겨 다니는 웜(Shai-Hulud)까지 등장해 공격 자동화 수준이 한 단계 올라갔습니다.
개념
- Dependency confusion(의존성 혼동): 회사 내부용 사설 패키지와 이름이 같은 패키지를 공개 레지스트리에 더 높은 버전으로 올려두면, 설정에 따라 빌드 시스템이 공개 버전을 우선 설치하는 결함을 이용한 공격. 특정 회사를 노린 표적형 공격에 쓰입니다.
- 계정 탈취(account takeover): 인기 패키지 관리자의 npm/PyPI 로그인 정보를 피싱·크리덴셜 스터핑으로 훔쳐, 정상 패키지의 새 버전에 악성 코드를 얹어 배포하는 방식(ua-parser-js, chalk/debug).
- Protestware / 자체 사보타주: 외부 침입이 아니라 패키지 유지관리자 본인이 정치적 항의나 처우 불만으로 자기 패키지를 고의로 망가뜨리는 경우(colors/faker, node-ipc).
- 자기 복제형 웜(self-propagating worm): 한 패키지를 감염시키는 데 그치지 않고, 훔친 CI/CD 자격증명으로 스스로를 다른 패키지에 재배포해 감염 범위를 자동으로 넓히는 방식(Shai-Hulud).
벤더별 비교
| 구분 | npm (GitHub) | PyPI | Linux 배포판 소스 tarball |
|---|---|---|---|
| 이 글에서 확인된 대표 사건 | ua-parser-js(2021), colors/faker(2022), node-ipc(2022), chalk/debug(2025), Shai-Hulud(2025) | torchtriton dependency confusion(2022) | xz-utils 백도어(2024) |
| 확인된 대응 조치 | 2022-02부터 상위 패키지 관리자 2FA 의무화, 2023-05부터 provenance(빌드 출처) 첨부 지원 | PyPI의 시기별 대응 정책은 1차 출처로 확인하지 못해 적지 않음 | 배포판 안정판에는 반영 전 발견돼 다운스트림 배포는 대부분 면함 |
잘 쓰는 법
- 회사 내부 패키지와 이름이 겹치는 공개 패키지가 없는지 확인하고, 스코프(
@company/pkg)나 사설 레지스트리 우선순위 설정으로 dependency confusion을 원천 차단합니다. - 관리자 2FA·provenance 표시가 있는 패키지를 우선 신뢰하되, "2FA가 있다"가 "피싱에 안 뚫린다"를 보장하진 않는다는 것을 chalk/debug 사고(2025-09)로 확인해 둡니다.
- lockfile(
package-lock.json,poetry.lock등)로 버전을 고정하고, CI에서 신규 버전 자동 업데이트 전 검토 단계를 둡니다. - CI/CD 시크릿은 최소 권한으로 스코프를 좁혀, 웜형 공격(Shai-Hulud)이 자격증명을 훔쳐도 확산 범위가 제한되게 합니다.
- 다운로드 수가 많다는 사실 자체를 신뢰 근거로 삼지 않습니다 — ua-parser-js·chalk·debug 모두 주간 다운로드 수백만~수십억 회 규모였습니다.
타임라인
2021-02-09 · Dependency Confusion 공격 기법 공개
- 이전 대비: 최초 — 이 공격 기법 자체가 처음 이름을 얻고 공개됨
- Alex Birsan이 사설 패키지와 이름이 같은 패키지를 공개 레지스트리에 올려 빌드 시스템이 이를 대신 설치하게 만드는 방식으로 Apple·Microsoft·Tesla 등 35개 이상 기업 내부망에서 코드를 실행시켰다고 공개. 버그바운티로 13만 달러를 받음
- 출처: Dependency Confusion: How I Hacked Into Apple, Microsoft and Dozens of Other Companies
2021-10-22 · ua-parser-js 계정 탈취, 악성코드 유포
- 이전 대비: 설계 결함이 아니라 유지관리자 계정 탈취로 악성 코드가 직접 심긴 사례
- 주간 다운로드 700만 회가 넘는 ua-parser-js의 npm 계정이 탈취돼, 크립토마이너와 정보 탈취 트로이목마가 담긴 0.7.29/0.8.0/1.0.0 버전이 약 4시간 동안 배포됨
- 출처: Malware Discovered in Popular NPM Package, ua-parser-js
2022-01-08 · colors/faker 관리자의 자체 사보타주
- 이전 대비: 외부 침입이 아니라 관리자 본인이 코드를 심어 자기 패키지를 망가뜨린 대규모 사례
- Marak Squires가 자신이 관리하던 colors.js·faker.js에 무한 루프/깨진 코드를 올려, 두 패키지에 의존하는 수많은 프로젝트가 한꺼번에 장애를 겪음. 기업 후원 없는 오픈소스 유지보수에 대한 항의였다고 밝힘
- 출처: Dev corrupts NPM libs 'colors' and 'faker' breaking thousands of apps
2022-02-01 · npm, 인기 패키지 관리자 2FA 의무화 시작
- 이전 대비: 연이은 계정 탈취·사보타주 사고 이후 생태계 차원의 첫 강제 방어 조치
- 2021-11-15 예고된 정책에 따라 의존성 수 기준 상위 100개 패키지 관리자부터 2단계 인증(2FA)을 의무화. 이후 상위 500개로 확대
- 출처: Top-100 npm package maintainers now require 2FA, and additional security-focused improvements to npm
2022-03-15 · node-ipc "protestware" 확산
- 이전 대비: 사보타주가 특정 국가(러시아·벨라루스) IP 사용자만 겨냥하는 정치적 목적의 파일 삭제로 진화
- node-ipc 관리자가 peacenotwar 의존성을 심어, 러시아·벨라루스로 추정되는 IP에서는 파일을 하트 이모지로 덮어쓰는 코드를 배포. Vue.js 등 하위 프로젝트까지 영향받음
- 출처: Alert: peacenotwar module sabotages npm developers in the node-ipc package to protest the invasion of Ukraine
2022-12-25 · PyPI torchtriton 의존성 혼동 공격
- 이전 대비: npm 중심이던 사고 패턴이 PyPI 생태계로 확장되고, 2021-02 dependency confusion 기법이 실전 공격으로 재현됨
- 공격자가 PyPI에 PyTorch-nightly의 내부 의존성과 같은 이름의 가짜 torchtriton 패키지를 올려, 12/25~12/30 사이 설치한 사용자의 시스템 정보를 DNS로 빼돌림. PyTorch 팀이 연휴 기간 긴급 공지, 약 2,700회 다운로드로 파악
- 출처: Compromised PyTorch-nightly dependency chain between December 25th and December 30th, 2022
2024-03-29 · xz-utils 백도어 발견
- 이전 대비: 계정 탈취·즉흥적 사보타주 수준을 넘어, 수년간 신뢰를 쌓은 뒤 리눅스 핵심 유틸리티에 SSH 백도어를 심은 지금까지 가장 정교한 사례
- PostgreSQL 벤치마크 중 SSH 로그인 지연을 이상하게 여긴 Andres Freund가 xz-utils 5.6.0/5.6.1에서 백도어(CVE-2024-3094, CVSS 10.0)를 발견. 수년에 걸쳐 신뢰를 쌓은 계정이 심은 것으로 파악됐고, 다행히 주요 배포판 안정 버전에는 반영되지 않음
- 출처: CVE-2024-3094: XZ Utils SSHd Backdoor Vulnerability in Linux, xz-utils backdoor situation (CVE-2024-3094)
2025-09-08 · chalk·debug 등 npm 18개 패키지 피싱 탈취
- 이전 대비: 2FA가 보편화된 이후에도, 계정을 직접 뚫는 대신 관리자를 속이는 피싱으로 인증 자체를 우회
- 가짜 npm 지원 도메인(npmjs.help)으로 관리자 'qix'를 피싱해 계정을 탈취, 주간 다운로드 26억 회에 달하는 chalk·debug 등 18개 패키지에 브라우저 암호화폐 거래를 가로채는 코드를 심음. 몇 시간 만에 발견·제거됨
- 출처: Critical npm supply chain attack response – September 8, 2025
2025-09-16 · Shai-Hulud 자기 복제형 npm 웜
- 이전 대비: 한 패키지만 감염시키던 이전 사고들과 달리, 스스로 다른 패키지로 옮겨 다니며 확산하는 웜 형태로는 처음
- CI/CD 파이프라인과 클라우드 메타데이터 엔드포인트에서 훔친 자격증명으로 자신을 다른 패키지에 자동 재배포하는 웜이 확산돼 약 500개 npm 패키지가 감염(CrowdStrike 소유 패키지 일부 포함). CISA가 경보를 발령했고, 11월에는 "Shai-Hulud 2.0" 재확산이 이어짐
- 출처: Widespread Supply Chain Compromise Impacting npm Ecosystem, Shai-Hulud 2.0: Guidance for detecting, investigating, and defending against the supply chain attack
출처
- Alex Birsan, "Dependency Confusion: How I Hacked Into Apple, Microsoft and Dozens of Other Companies" (2021-02-09) — https://medium.com/@alex.birsan/dependency-confusion-4a5d60fec610
- CISA, "Malware Discovered in Popular NPM Package, ua-parser-js" (2021-10-22) — https://www.cisa.gov/news-events/alerts/2021/10/22/malware-discovered-popular-npm-package-ua-parser-js
- BleepingComputer, "Dev corrupts NPM libs 'colors' and 'faker' breaking thousands of apps" (2022-01-09) — https://www.bleepingcomputer.com/news/security/dev-corrupts-npm-libs-colors-and-faker-breaking-thousands-of-apps/
- GitHub Blog, "Top-100 npm package maintainers now require 2FA, and additional security-focused improvements to npm" (2022-02) — https://github.blog/security/supply-chain-security/top-100-npm-package-maintainers-require-2fa-additional-security/
- Snyk, "Alert: peacenotwar module sabotages npm developers in the node-ipc package" (2022-03-17) — https://snyk.io/blog/peacenotwar-malicious-npm-node-ipc-package-vulnerability/
- PyTorch, "Compromised PyTorch-nightly dependency chain between December 25th and December 30th, 2022" (2022-12-31) — https://pytorch.org/blog/compromised-nightly-dependency/
- Qualys, "CVE-2024-3094: XZ Utils SSHd Backdoor Vulnerability in Linux" (2024-03-29) — https://blog.qualys.com/vulnerabilities-threat-research/2024/03/29/xz-utils-sshd-backdoor
- thesamesam, "xz-utils backdoor situation (CVE-2024-3094)" (2024-03-30, GitHub Gist) — https://gist.github.com/thesamesam/223949d5a074ebc3dce9ee78baad9e27
- Vercel, "Critical npm supply chain attack response – September 8, 2025" (2025-09-08) — https://vercel.com/blog/critical-npm-supply-chain-attack-response-september-8-2025
- CISA, "Widespread Supply Chain Compromise Impacting npm Ecosystem" (2025-09-23) — https://www.cisa.gov/news-events/alerts/2025/09/23/widespread-supply-chain-compromise-impacting-npm-ecosystem
- Microsoft Security Blog, "Shai-Hulud 2.0: Guidance for detecting, investigating, and defending against the supply chain attack" (2025-12-09) — https://www.microsoft.com/en-us/security/blog/2025/12/09/shai-hulud-2-0-guidance-for-detecting-investigating-and-defending-against-the-supply-chain-attack/