2026년 하루 평균 보고된 CVE가 전년 대비 131% 증가했습니다.
← 용어집으로 돌아가기

숨은 종속성

숨은 종속성은 빌드가 다운로드해 사용하지만 어떤 잠금 파일이나 매니페스트에도 나오지 않는 코드, 패키지, 파일로, 대부분의 SBOM에서 빠집니다.

최종 업데이트: 2026년 11월 11일

숨은 종속성(hidden dependency)은 빌드가 다운로드해 사용하지만 어떤 잠금 파일이나 매니페스트에도 나오지 않는 코드, 패키지, 파일입니다. 대부분의 SBOM 도구는 이런 목록을 기반으로 하므로 숨은 종속성은 대부분의 SBOM에서 빠지며, 최근의 여러 공급망 공격이 바로 이 경로를 이용했습니다. 일반적인 소프트웨어 공학에서는 모듈 사이의 선언되지 않은 결합을 뜻하기도 하지만, 여기서는 공급망의 의미로 씁니다.

흔한 숨은 종속성

  • 설치 훅. npm은 패키지의 preinstall, install, postinstall 스크립트를 npm install 중에 실행합니다(npm 문서). 이 스크립트가 다운로드한 것은 package-lock.json에 절대 나타나지 않습니다. Shai-Hulud 웜이 사용한 경로가 바로 이것입니다.
  • 빌드 스크립트. Cargo는 크레이트를 빌드하기 직전에 그 크레이트의 build.rs를 컴파일해 실행합니다(Cargo Book). 일부 빌드 스크립트는 이때 C 라이브러리나 미리 빌드된 바이너리를 다운로드하며, Cargo.lock은 이를 기록하지 않습니다.
  • 베이스 이미지. 컨테이너 빌드에서 베이스 이미지와 그 운영체제 레이어는 레지스트리에서 오며, 어떤 언어의 잠금 파일에도 나오지 않습니다. Docker 이미지 SBOM을 참고하세요.
  • CI 단계. 워크플로의 설정 액션과 curl | sh 설치 프로그램은 작성자가 추가하지 않는 한 잠금 파일, 버전 고정, 해시 없이 URL에서 바로 도구를 가져옵니다.

저장소에 커밋된 코드(벤더링된 종속성)도 매니페스트에서 빠지는 또 다른 경로이지만, 빌드 중에 가져오는 것은 아닙니다. "phantom dependency"는 또 다른 개념으로, JavaScript에서 코드가 선언하지 않고 사용하며 호이스팅으로만 접근할 수 있는 패키지를 뜻합니다.

SBOM 도구가 이를 놓치는 이유

잠금 파일 기반 도구는 잠금 파일에 선언된 목록을 읽으므로 선언된 것만 봅니다. 출력 스캐너는 완성된 아티팩트를 살펴 무엇이 들어갔는지 추론하는데, Rust처럼 컴파일된 코드에서는 추측에 그칩니다. 둘 다 빌드가 도중에 가져온 것은 보지 못합니다. 캐시와 빌드 도구를 포함해 각 방식이 놓치는 것의 전체 목록은 오픈 소스 SBOM 생성기에 있습니다. 숨은 종속성은 SBOM 스스로는 드러낼 수 없는 SBOM 완전성의 공백입니다.

버전 고정으로도 해결되지 않습니다. 잠금 파일이 완벽해도, 거기서 고정한 설치 훅이 새로운 것을 다운로드할 수 있습니다. 빌드 중에 무언가를 가져오는 빌드는 재현 가능한 빌드를 달성하기 어려운 이유 중 하나이기도 합니다.

찾는 방법

  • 빌드 로그에서 다운로드를 확인합니다. npm install과 cargo build의 출력, 그리고 curl이나 wget 줄입니다.
  • 잠금 파일로 생성한 SBOM과 설치 단계가 보고하는 패키지를 비교합니다.
  • 베이스 이미지에 있다고 알고 있는 패키지(예: libc6)를 SBOM에서 검색합니다. 없다면 이미지 레이어가 빠진 것입니다.
  • 워크플로에서 curl과 wget을 검색합니다.

확실한 방법은 나중에 재구성하는 것이 아니라, 빌드가 네트워크로 실제로 받아들인 것을 기록하는 것입니다.

CRACI

CRACI는 각 빌드로 들어오는 트래픽을 보므로, 잠금 파일 기반 도구가 놓치는 숨은 종속성을 기록합니다. 예를 들어 작업이 패키지 인식 프록시를 우회하는 트래픽을 허용해 모든 것을 볼 수 없었다면, 작업의 완전성 상태가 이를 알려 줍니다. 또한 이그레스 정책이 빌드가 접근할 수 있는 호스트를 정하므로, 정책이 허용하지 않는 호스트로의 curl | sh는 실패합니다. 빌드 시점 SBOM을 참고하세요.