의존성 혼란(Dependency Confusion) 공격은 패키지 관리자가 내부(Private) 패키지보다 동일 이름의 공개(Public) 패키지를 우선 설치하는 취약점을 악용하는 공급망 공격이다. 2021년 Alex Birsan이 발표해 Microsoft, Apple, PayPal 등에서 실증됐다.
공격 원리
정상 상황:
회사 내부망 → 내부 레지스트리(company-lib v1.0) 설치
공격 상황:
1. 공격자: company-lib v9.9.9 를 npm/PyPI에 공개 등록
(내부 버전보다 높은 버전 번호)
2. 빌드 서버: npm install 실행 시
→ 내부 레지스트리(v1.0) vs 공개 npm(v9.9.9)
→ 버전이 높은 공개 패키지 다운로드!
3. 악성 코드 실행 (postinstall 스크립트)
피해 사례 (Alex Birsan, 2021):
- Apple, Microsoft, PayPal, Shopify 등 35개 기업
- RCE 달성 (일부 내부 서버)
- 최대 $30,000 버그 바운티 수령
취약한 패키지 관리자
npm (Node.js):
취약: scope 미사용 시 공개 레지스트리 우선
대응: scoped package (@company/lib) + .npmrc 설정
pip (Python):
취약: --index-url 옵션만 지정 시 공개 PyPI 검색
대응: --index-url + --no-index 병용
RubyGems:
취약: gemspec에 공개 gem 이름 사용
대응: Gemfile에 source 명시
Maven/Gradle:
취약: 레포지토리 순서 잘못 설정
대응: 내부 레포지토리를 첫 번째로 설정
방어 전략
bash
# npm: scoped 패키지 + 내부 레지스트리 강제
# .npmrc
@company:registry=https://registry.company.com
//registry.company.com/:_authToken=${NPM_TOKEN}
# npm: 특정 패키지 공개 레지스트리 차단
# package.json
{
"overrides": {
"@company/internal-lib": "npm:@company/internal-lib@*"
}
}
# pip: 내부 레지스트리만 사용
pip install --index-url https://pypi.company.com/simple --no-index company-lib
# Artifactory: 가상 레포지토리에서
# 내부 레포지토리 우선순위 설정
관련 문서