InfoGrab Docs

정적 도달 가능성 분析

요약

종속성 스캔은 프로젝트의 모든 취약한 종속성을 식별합니다. 정적 도달 가능성 분析은 프로젝트의 소스 코드를 분析하여 SBOM의 종속성 중 어떤 것이 도달 가능한지 결정하는 방식으로 작동합니다. SBOM은 SBOM 파일과 소스 코드 파일이 동일한 프로젝트 디렉터리 트리에 속할 때만 풍부화됩니다.

히스토리
  • GitLab 17.5에서 실험으로 도입됨.
  • GitLab 17.11에서 실험에서 베타로 변경됨.
  • GitLab 18.2 및 종속성 스캔 분析기 v0.32.0에서 JavaScript 및 TypeScript 지원이 도입됨.
  • GitLab 18.5 및 종속성 스캔 분析기 v0.39.0에서 Java 지원이 도입됨.
  • GitLab 18.5에서 베타에서 제한 가용성(LA)으로 변경됨.
  • GitLab 18.8에서 Java 지원이 실험에서 베타로 변경됨.
  • GitLab 19.0에서 일반 가용성으로 변경됨.

종속성 스캔은 프로젝트의 모든 취약한 종속성을 식별합니다. 그러나 모든 취약점이 동등한 위험을 가지는 것은 아닙니다. 정적 도달 가능성 분析은 취약한 패키지가 도달 가능한지, 즉 애플리케이션에서 가져오는지 여부를 확인하여 수정 우선순위를 지정하는 데 도움을 줍니다. 도달 가능한 취약점에 집중함으로써 정적 도달 가능성 분析을 통해 이론적인 위험이 아닌 실제 위협 노출을 기반으로 수정 우선순위를 지정할 수 있습니다.

정적 도달 가능성 분析은 프로젝트의 소스 코드를 분析하여 SBOM의 종속성 중 어떤 것이 도달 가능한지 결정하는 방식으로 작동합니다. 종속성 스캔은 모든 컴포넌트와 그 전이적 종속성을 식별하는 SBOM 보고서를 생성합니다. 정적 도달 가능성 분析은 SBOM의 각 종속성을 확인하고 도달 가능성 값을 추가하여 실제 사용 데이터로 보고서를 풍부하게 만듭니다. 이 풍부화된 SBOM은 취약점 발견을 보완하기 위해 GitLab에서 수집됩니다.

SBOM은 SBOM 파일과 소스 코드 파일이 동일한 프로젝트 디렉터리 트리에 속할 때만 풍부화됩니다. 여러 중첩 프로젝트가 있는 경우 시스템은 풍부화를 결정하기 위해 가장 가까운(가장 깊은) 프로젝트 경로를 선택합니다. 정적 도달 가능성 分析은 Python 및 Java 패키지에 대해 SBOM의 패키지 이름을 해당 코드 가져오기 경로에 매핑하는 메타데이터에 의존합니다. 이 메타데이터는 주간 업데이트로 유지 관리됩니다.

이슈 535498에서 피드백을 공유하세요.

정적 도달 가능성 분析 켜기#

필수 요건:

  • 프로젝트에 대한 Developer, Maintainer 또는 Owner 역할.
  • 프로젝트에서 지원되는 언어 및 패키지 관리자를 사용해야 합니다.
  • 종속성 스캔 분析기 버전 0.39.0 이상(이전 버전은 특정 언어를 지원할 수 있음 - 위의 History 참조).
  • 프로젝트에 대해 SBOM을 사용한 종속성 스캔 켜기. Gemnasium 分析기는 지원되지 않습니다.
  • 언어별 필수 요건:
    • Python:
      • 종속성 그래프 파일은 build 스테이지의 잡 아티팩트로 제공해야 합니다. pip 또는 pipenv에 대한 지침을 참조하세요. 다른 지원되는 Python 패키지 관리자는 종속성 스캔 分析기 문서를 참조하세요.
    • JavaScript 및 TypeScript:
      • 리포지터리에는 종속성 스캔 分析기에서 지원하는 잠금 파일이 있어야 합니다.
    • Java:
      • 종속성 그래프 파일은 build 스테이지의 잡 아티팩트로 제공해야 합니다. Maven 또는 Gradle에 대한 지침을 참조하세요.
Warning

정적 도달 가능성 分析은 잡 소요 시간을 증가시킵니다.

프로젝트에서 정적 도달 가능성 분析을 켜려면:

  1. 상단 표시줄에서 Search or go to를 선택하고 프로젝트를 찾습니다.

  2. 왼쪽 사이드바에서 코드 > 리포지터리를 선택합니다.

  3. .gitlab-ci.yml 파일을 선택합니다.

  4. 편집 > 단일 파일 편집을 선택합니다.

  5. 다음 구성을 추가합니다:

    include:
    - template: Jobs/Dependency-Scanning.v2.gitlab-ci.yml
    
    variables:
      DS_STATIC_REACHABILITY_ENABLED: true
    
  6. 변경 사항 커밋을 선택합니다.

종속성 스캔이 실행되어 SBOM을 출력하면 결과는 정적 도달 가능성 分析으로 보완됩니다.

도달 가능성 값#

종속성은 다음 도달 가능성 값 중 하나를 가질 수 있습니다. 코드에서 실제로 사용되는 것으로 확인된 종속성이므로 로 표시된 종속성의 분류 및 수정 우선순위를 지정하세요.

예 : 이 취약점과 연결된 패키지가 코드에서 도달 가능한 것으로 확인됩니다. 직접 종속성이 도달 가능으로 표시되면 그 전이적 종속성도 도달 가능으로 표시됩니다.

찾을 수 없음 : 정적 도달 가능성 分析이 성공적으로 실행되었지만 취약한 패키지의 사용을 감지하지 못했습니다.

사용 불가 : 정적 도달 가능성 分析이 실행되지 않아 도달 가능성 데이터가 없습니다.

취약한 종속성의 도달 가능성 값을 찾으려면:

  • 취약점 보고서에서 심각도 값 위에 마우스를 올립니다.
  • 취약점의 세부 정보 페이지에서 도달 가능 값을 확인합니다.
  • GraphQL 쿼리를 사용하여 도달 가능한 취약점을 나열합니다.

"찾을 수 없음" 결과#

찾을 수 없음 도달 가능성 값이 종속성이 사용되지 않는다는 것을 보장하지는 않습니다. 정적 도달 가능성 分析이 패키지 사용을 항상 명확하게 결정할 수 있는 것은 아니기 때문입니다.

다음과 같은 경우 종속성은 찾을 수 없음으로 표시됩니다:

  • 잠금 파일에 나타나지만 코드에서 가져오지 않는 경우.
  • 제외된 디렉터리에 있는 경우(예: DS_EXCLUDED_PATHS로 구성됨).
  • 커버리지 테스트나 린팅 패키지처럼 로컬 사용만을 위해 포함된 도구인 경우.

제외된 디렉터리의 다음 예시를 고려해보세요. CI/CD 변수 DS_EXCLUDED_PATHS="test"를 정의했습니다. 프로젝트의 리포지터리 구조는 다음과 같습니다.

.
├── pipdeptree.json  // contains "requests" dependency
└── test/
    └── app.py       // imports "requests" dependency

이 예시에서 그래프 파일 pipdeptree.json은 제외된 디렉터리 외부에 있으며 파일에 나열된 종속성을 식별하기 위해 분析됩니다. 그러나 requests 종속성을 가져오는 소스 코드는 제외된 디렉터리에 있으므로 정적 도달 가능성 分析은 그 도달 가능성을 확인하지 않습니다. 결과적으로 requests 종속성은 찾을 수 없음으로 레이블이 지정됩니다. 즉, 잠금 파일이 제외된 디렉터리 외부에 있지만 종속성을 가져오는 코드가 내부에 있을 때 발생합니다.

지원되는 언어 및 패키지 관리자#

지원은 언어 성숙도에 따라 다르며 각 언어에 대해 특정 패키지 관리자와 파일 유형을 포함합니다.

언어 성숙도 지원되는 패키지 관리자 지원되는 파일 유형
Python1 베타 pip, pipenv2, poetry, uv .py
JavaScript/TypeScript3 베타 npm, pnpm, yarn .js, .ts
Java4 베타 maven5, gradle6 .java

각주:

  1. pipdeptree를 사용한 종속성 스캔 시, 선택적 종속성은 전이적 종속성 대신 직접 종속성으로 표시됩니다. 정적 도달 가능성 分析은 그러한 패키지를 사용 중인 것으로 식별하지 못할 수 있습니다. 예를 들어 passlib[bcrypt]를 요구하면 passlibin_use로, bcryptnot_found로 표시될 수 있습니다. 자세한 내용은 pip를 참조하세요.
  2. Python pipenv의 경우 정적 도달 가능성 分析은 Pipfile.lock 파일을 지원하지 않습니다. 종속성 그래프를 지원하는 pipenv.graph.json에 대해서만 지원이 가능합니다.
  3. 프론트엔드 프레임워크는 지원되지 않습니다.
  4. Java의 동적 특성으로 인해 최신 프레임워크를 사용하는 프로젝트에서 더 높은 오탐 없음 비율을 초래할 수 있는 다음 문제가 발생합니다:
    • 정적 도달 가능성 分析은 직접 가져오기, Java 리플렉션 패턴 및 소스 코드의 Java 데이터베이스 연결 문자열을 통한 명시적 사용을 감지합니다. Spring Boot와 같은 종속성 주입 프레임워크를 사용하는 것처럼 런타임에 동적으로 로드되는 종속성을 식별할 수 없습니다.
    • 커버리지는 GitLab 권고 데이터베이스와 Maven Central에서 가장 널리 의존되는 패키지로 제한됩니다.
  5. Maven 지침에 설명된 대로 maven.graph.json 파일을 사용하세요.
  6. Gradle 지침에 설명된 대로 종속성 잠금 파일을 사용하세요.

오프라인 환경#

오프라인 환경에서 정적 도달 가능성 分析을 실행하려면 초기 설정을 수행하고 지속적인 유지 관리를 해야 합니다.

초기 설정:

지속적인 유지 관리:

  • 새 버전이 릴리스될 때마다 로컬 종속성 스캔(SBOM) 이미지를 업데이트하세요.

Python 및 Java 패키지의 경우 정적 도달 가능성 分析은 메타데이터를 사용하여 SBOM의 패키지 이름을 해당 코드 가져오기 경로에 매핑합니다. 이 메타데이터는 종속성 스캔 분析기의 이미지에 포함되어 있습니다. 오래된 메타데이터는 불완전하거나 부정확한 도달 가능성 분析을 초래할 수 있습니다.

정적 도달 가능성 분析

Tier: Ultimate
Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
원문 보기
요약

종속성 스캔은 프로젝트의 모든 취약한 종속성을 식별합니다. 정적 도달 가능성 분析은 프로젝트의 소스 코드를 분析하여 SBOM의 종속성 중 어떤 것이 도달 가능한지 결정하는 방식으로 작동합니다. SBOM은 SBOM 파일과 소스 코드 파일이 동일한 프로젝트 디렉터리 트리에 속할 때만 풍부화됩니다.

히스토리
  • GitLab 17.5에서 실험으로 도입됨.
  • GitLab 17.11에서 실험에서 베타로 변경됨.
  • GitLab 18.2 및 종속성 스캔 분析기 v0.32.0에서 JavaScript 및 TypeScript 지원이 도입됨.
  • GitLab 18.5 및 종속성 스캔 분析기 v0.39.0에서 Java 지원이 도입됨.
  • GitLab 18.5에서 베타에서 제한 가용성(LA)으로 변경됨.
  • GitLab 18.8에서 Java 지원이 실험에서 베타로 변경됨.
  • GitLab 19.0에서 일반 가용성으로 변경됨.

종속성 스캔은 프로젝트의 모든 취약한 종속성을 식별합니다. 그러나 모든 취약점이 동등한 위험을 가지는 것은 아닙니다. 정적 도달 가능성 분析은 취약한 패키지가 도달 가능한지, 즉 애플리케이션에서 가져오는지 여부를 확인하여 수정 우선순위를 지정하는 데 도움을 줍니다. 도달 가능한 취약점에 집중함으로써 정적 도달 가능성 분析을 통해 이론적인 위험이 아닌 실제 위협 노출을 기반으로 수정 우선순위를 지정할 수 있습니다.

정적 도달 가능성 분析은 프로젝트의 소스 코드를 분析하여 SBOM의 종속성 중 어떤 것이 도달 가능한지 결정하는 방식으로 작동합니다. 종속성 스캔은 모든 컴포넌트와 그 전이적 종속성을 식별하는 SBOM 보고서를 생성합니다. 정적 도달 가능성 분析은 SBOM의 각 종속성을 확인하고 도달 가능성 값을 추가하여 실제 사용 데이터로 보고서를 풍부하게 만듭니다. 이 풍부화된 SBOM은 취약점 발견을 보완하기 위해 GitLab에서 수집됩니다.

SBOM은 SBOM 파일과 소스 코드 파일이 동일한 프로젝트 디렉터리 트리에 속할 때만 풍부화됩니다. 여러 중첩 프로젝트가 있는 경우 시스템은 풍부화를 결정하기 위해 가장 가까운(가장 깊은) 프로젝트 경로를 선택합니다. 정적 도달 가능성 分析은 Python 및 Java 패키지에 대해 SBOM의 패키지 이름을 해당 코드 가져오기 경로에 매핑하는 메타데이터에 의존합니다. 이 메타데이터는 주간 업데이트로 유지 관리됩니다.

이슈 535498에서 피드백을 공유하세요.

정적 도달 가능성 분析 켜기#

필수 요건:

  • 프로젝트에 대한 Developer, Maintainer 또는 Owner 역할.
  • 프로젝트에서 지원되는 언어 및 패키지 관리자를 사용해야 합니다.
  • 종속성 스캔 분析기 버전 0.39.0 이상(이전 버전은 특정 언어를 지원할 수 있음 - 위의 History 참조).
  • 프로젝트에 대해 SBOM을 사용한 종속성 스캔 켜기. Gemnasium 分析기는 지원되지 않습니다.
  • 언어별 필수 요건:
    • Python:
      • 종속성 그래프 파일은 build 스테이지의 잡 아티팩트로 제공해야 합니다. pip 또는 pipenv에 대한 지침을 참조하세요. 다른 지원되는 Python 패키지 관리자는 종속성 스캔 分析기 문서를 참조하세요.
    • JavaScript 및 TypeScript:
      • 리포지터리에는 종속성 스캔 分析기에서 지원하는 잠금 파일이 있어야 합니다.
    • Java:
      • 종속성 그래프 파일은 build 스테이지의 잡 아티팩트로 제공해야 합니다. Maven 또는 Gradle에 대한 지침을 참조하세요.
Warning

정적 도달 가능성 分析은 잡 소요 시간을 증가시킵니다.

프로젝트에서 정적 도달 가능성 분析을 켜려면:

  1. 상단 표시줄에서 Search or go to를 선택하고 프로젝트를 찾습니다.

  2. 왼쪽 사이드바에서 코드 > 리포지터리를 선택합니다.

  3. .gitlab-ci.yml 파일을 선택합니다.

  4. 편집 > 단일 파일 편집을 선택합니다.

  5. 다음 구성을 추가합니다:

    include:
    - template: Jobs/Dependency-Scanning.v2.gitlab-ci.yml
    
    variables:
      DS_STATIC_REACHABILITY_ENABLED: true
    
  6. 변경 사항 커밋을 선택합니다.

종속성 스캔이 실행되어 SBOM을 출력하면 결과는 정적 도달 가능성 分析으로 보완됩니다.

도달 가능성 값#

종속성은 다음 도달 가능성 값 중 하나를 가질 수 있습니다. 코드에서 실제로 사용되는 것으로 확인된 종속성이므로 로 표시된 종속성의 분류 및 수정 우선순위를 지정하세요.

예 : 이 취약점과 연결된 패키지가 코드에서 도달 가능한 것으로 확인됩니다. 직접 종속성이 도달 가능으로 표시되면 그 전이적 종속성도 도달 가능으로 표시됩니다.

찾을 수 없음 : 정적 도달 가능성 分析이 성공적으로 실행되었지만 취약한 패키지의 사용을 감지하지 못했습니다.

사용 불가 : 정적 도달 가능성 分析이 실행되지 않아 도달 가능성 데이터가 없습니다.

취약한 종속성의 도달 가능성 값을 찾으려면:

  • 취약점 보고서에서 심각도 값 위에 마우스를 올립니다.
  • 취약점의 세부 정보 페이지에서 도달 가능 값을 확인합니다.
  • GraphQL 쿼리를 사용하여 도달 가능한 취약점을 나열합니다.

"찾을 수 없음" 결과#

찾을 수 없음 도달 가능성 값이 종속성이 사용되지 않는다는 것을 보장하지는 않습니다. 정적 도달 가능성 分析이 패키지 사용을 항상 명확하게 결정할 수 있는 것은 아니기 때문입니다.

다음과 같은 경우 종속성은 찾을 수 없음으로 표시됩니다:

  • 잠금 파일에 나타나지만 코드에서 가져오지 않는 경우.
  • 제외된 디렉터리에 있는 경우(예: DS_EXCLUDED_PATHS로 구성됨).
  • 커버리지 테스트나 린팅 패키지처럼 로컬 사용만을 위해 포함된 도구인 경우.

제외된 디렉터리의 다음 예시를 고려해보세요. CI/CD 변수 DS_EXCLUDED_PATHS="test"를 정의했습니다. 프로젝트의 리포지터리 구조는 다음과 같습니다.

.
├── pipdeptree.json  // contains "requests" dependency
└── test/
    └── app.py       // imports "requests" dependency

이 예시에서 그래프 파일 pipdeptree.json은 제외된 디렉터리 외부에 있으며 파일에 나열된 종속성을 식별하기 위해 분析됩니다. 그러나 requests 종속성을 가져오는 소스 코드는 제외된 디렉터리에 있으므로 정적 도달 가능성 分析은 그 도달 가능성을 확인하지 않습니다. 결과적으로 requests 종속성은 찾을 수 없음으로 레이블이 지정됩니다. 즉, 잠금 파일이 제외된 디렉터리 외부에 있지만 종속성을 가져오는 코드가 내부에 있을 때 발생합니다.

지원되는 언어 및 패키지 관리자#

지원은 언어 성숙도에 따라 다르며 각 언어에 대해 특정 패키지 관리자와 파일 유형을 포함합니다.

언어 성숙도 지원되는 패키지 관리자 지원되는 파일 유형
Python1 베타 pip, pipenv2, poetry, uv .py
JavaScript/TypeScript3 베타 npm, pnpm, yarn .js, .ts
Java4 베타 maven5, gradle6 .java

각주:

  1. pipdeptree를 사용한 종속성 스캔 시, 선택적 종속성은 전이적 종속성 대신 직접 종속성으로 표시됩니다. 정적 도달 가능성 分析은 그러한 패키지를 사용 중인 것으로 식별하지 못할 수 있습니다. 예를 들어 passlib[bcrypt]를 요구하면 passlibin_use로, bcryptnot_found로 표시될 수 있습니다. 자세한 내용은 pip를 참조하세요.
  2. Python pipenv의 경우 정적 도달 가능성 分析은 Pipfile.lock 파일을 지원하지 않습니다. 종속성 그래프를 지원하는 pipenv.graph.json에 대해서만 지원이 가능합니다.
  3. 프론트엔드 프레임워크는 지원되지 않습니다.
  4. Java의 동적 특성으로 인해 최신 프레임워크를 사용하는 프로젝트에서 더 높은 오탐 없음 비율을 초래할 수 있는 다음 문제가 발생합니다:
    • 정적 도달 가능성 分析은 직접 가져오기, Java 리플렉션 패턴 및 소스 코드의 Java 데이터베이스 연결 문자열을 통한 명시적 사용을 감지합니다. Spring Boot와 같은 종속성 주입 프레임워크를 사용하는 것처럼 런타임에 동적으로 로드되는 종속성을 식별할 수 없습니다.
    • 커버리지는 GitLab 권고 데이터베이스와 Maven Central에서 가장 널리 의존되는 패키지로 제한됩니다.
  5. Maven 지침에 설명된 대로 maven.graph.json 파일을 사용하세요.
  6. Gradle 지침에 설명된 대로 종속성 잠금 파일을 사용하세요.

오프라인 환경#

오프라인 환경에서 정적 도달 가능성 分析을 실행하려면 초기 설정을 수행하고 지속적인 유지 관리를 해야 합니다.

초기 설정:

지속적인 유지 관리:

  • 새 버전이 릴리스될 때마다 로컬 종속성 스캔(SBOM) 이미지를 업데이트하세요.

Python 및 Java 패키지의 경우 정적 도달 가능성 分析은 메타데이터를 사용하여 SBOM의 패키지 이름을 해당 코드 가져오기 경로에 매핑합니다. 이 메타데이터는 종속성 스캔 분析기의 이미지에 포함되어 있습니다. 오래된 메타데이터는 불완전하거나 부정확한 도달 가능성 분析을 초래할 수 있습니다.