flawopen.com/참고/Dependency Confusion
Dependency Confusion: 패키지 출처 혼동이 발생하는 방식
High Severity
CWE-829: Inclusion of Functionality from Untrusted Control Sphere
소프트웨어 공급망
쉽게 설명 — 이름이 비슷한 공급업체
팀이 공급업체 카탈로그에서 구성 요소를 주문하는데 서로 다른 업체가 같은 제품명을 쓴다고 해 보세요. 규칙이 신뢰할 업체를 지정하지 않으면 빌드가 예상하지 못한 구성 요소를 받을 수 있습니다. Dependency Confusion은 출처 선택 실패입니다. 빌드가 조직이 신뢰하려던 곳이 아닌 레지스트리나 네임스페이스에서 패키지를 가져옵니다.
Boundary: 패키지 이름, 네임스페이스, 레지스트리 설정, lockfile 출처
Failure: 리졸버가 의도하지 않은 출처에서 같은 이름의 패키지를 가져올 수 있음
Impact: 검토되지 않은 서드파티 코드가 빌드에 들어올 수 있고 설치 스크립트가 실행될 수 있음
Remediation: 명시적인 네임스페이스-레지스트리 정책, 검토된 lockfile, 최소 권한 빌드
Dependency Confusion이 발생하는 방식
정확한 동작은 패키지 관리자와 설정에 따라 다릅니다. pip 문서는 사설 --index-url과 공개 --extra-index-url을 함께 쓰면 같은 이름의 공개 패키지가 선택될 수 있다고 경고합니다. npm은 패키지 scope 또는 기본 설정으로 레지스트리를 선택하며 항상 더 높은 버전을 고르지는 않습니다. 공통 원인은 모호한 출처 정책입니다. 스크립트가 허용되면 빌드 작업 권한으로 실행됩니다.
pip.conf 및 requirements.txt (모호한 출처)위험한 설정
[global]
index-url = https://packages.example.internal/simple
extra-index-url = https://pypi.org/simple
corp-auth-utils
.npmrc 및 package.json (scope 기반 명시적 라우팅)강화 예시
@corp:registry=https://packages.example.internal/repository/npm/
{
"dependencies": {
"@corp/billing-engine": "1.2.0"
}
}
Dependency Confusion의 실패 경로
- 1내부 패키지 이름이나 네임스페이스가 조직 외부에 알려집니다.
- 2공개 레지스트리에 같은 이름의 scope 없는 패키지가 있거나 설정된 정책이 해당 레지스트리의 응답을 허용합니다.
- 3리졸버가 의도하지 않은 출처를 선택합니다. lockfile이 없거나 재생성되거나 검토 없이 승인되면 대체를 놓칠 수 있습니다.
- 4설치 또는 빌드 스크립트가 활성화되면 패키지 코드는 작업 권한으로 실행됩니다. 영향은 자격 증명, 네트워크, 격리에 달려 있으며 root 실행이 필수는 아닙니다.
엔지니어링 방어 통제
- ✓출처 정책을 명확히 하세요. 조직 소유 scope나 네임스페이스를 사용하고 의도한 레지스트리로 연결하며 사설 이름이 공개 출처로 fallback되지 않게 하세요. Python 사설 패키지에 사설 인덱스와
--extra-index-url을 함께 쓰지 말고 통제된 proxy나 단일 권위 인덱스를 사용하세요. - ✓네임스페이스 소유권을 관리하세요. 레지스트리가 지원하면 조직 이름을 예약하되 이를 리졸버 정책의 대체물로 여기지 마세요. 내부 이름을 목록화하고 공개 충돌을 모니터링하세요.
- ✓lockfile을 검토하고 강제하세요. lockfile을 저장하고 고정 CI 설치 모드를 사용하세요(npm은
npm ci). 패키지명, 레지스트리 URL, 버전, 무결성 값 변경을 검토하세요. lockfile은 출처가 의도한 게시자임을 증명하지 않습니다. - ✓빌드 실행을 제한하세요. 가능하면 의존성 스크립트를 비활성화하고 예외를 검토하세요. 단기 최소 권한 자격 증명을 사용하고 빌드를 운영 비밀과 분리하며 외부 네트워크를 제한하세요.
관련 보안 주제와 사고 분석 보기:보안 디렉터리 →