다음을 통해 공유


코드 검사

Azure DevOps용 GitHub Advanced Security의 코드 검색을 사용하면 Azure DevOps 리포지토리의 코드를 분석하여 보안 취약성 및 코딩 오류를 찾을 수 있습니다. 분석으로 식별되는 모든 문제는 경고로 발생합니다. 코드 검색은 CodeQL을 사용하여 취약성을 식별합니다.

CodeQL은 보안 확인을 자동화하기 위해 GitHub가 개발한 코드 분석 엔진입니다. CodeQL을 사용하여 코드를 분석하고 결과를 코드 검사 경고로 표시할 수 있습니다.

Azure DevOps용 GitHub Advanced Security는 Azure Repos에서 작동합니다. GitHub 리포지토리에서 GitHub Advanced Security를 사용하려면 GitHub Advanced Security를 참조하세요.

CodeQL 경고

GitHub 전문가, 보안 연구원 및 커뮤니티 기여자 코드 검사에 사용되는 기본 CodeQL 쿼리를 작성하고 기본. 쿼리는 분석을 개선하고 가양성 결과를 줄이기 위해 정기적으로 업데이트됩니다. 쿼리는 오픈 소스이므로 github/codeql 리포지토리에서 쿼리를 보고 기여할 수 있습니다.

CodeQL에 대한 자세한 설명서는 GitHubCodeQL 설명서를 참조하세요.

CodeQL은 컴파일된 언어와 해석된 언어를 모두 지원하며 지원되는 언어로 작성된 코드에서 취약성 및 오류를 찾을 수 있습니다.

  • C/C++
  • C#
  • Go
  • Java
  • JavaScript/TypeScript
  • Kotlin(베타)
  • Python
  • Ruby
  • Swift

자세한 내용은 지원되는 언어 및 프레임워크의 CodeQL 웹 사이트에 있는 설명서를 참조하세요.

종속성 검사와 유사하게 빌드 로그를 통해 CodeQL에서 사용하는 특정 쿼리 및 작업 세부 정보를 볼 수 있습니다.

결과 게시 태스크를 검색하는 코드 스크린샷

코드 검사 경고

Azure DevOps 코드 검색 경고에 대한 GitHub 고급 보안에는 코드 수준 애플리케이션 취약성을 경고하는 리포지토리별 코드 검색 플래그가 포함됩니다.

코드 검색을 사용하려면 먼저 Azure DevOps용 GitHub Advanced Security를 구성 해야 합니다.

Azure DevOps의 리포지토리 아래에 있는 고급 보안 탭은 코드 검색 경고를 볼 수 있는 허브입니다. 코드 검색 탭을 선택하여 검색 경고를 봅니다. 분기, 상태, 파이프라인, 규칙 유형 및 심각도별로 필터링할 수 있습니다. 현재 경고 허브는 PR 분기에서 완료된 검사에 대한 경고를 표시하지 않습니다.

파이프라인 또는 분기의 이름이 바뀌면 결과에 영향을 주지 않습니다. 새 이름이 표시되기까지 최대 24시간이 걸릴 수 있습니다.

사용자 지정 CodeQL 쿼리를 실행하도록 선택하는 경우 기본적으로 다른 쿼리 팩에서 생성된 경고에 대한 별도의 필터가 없습니다. 각 쿼리에 대해 고유한 규칙별로 필터링할 수 있습니다.

리포지토리에 대한 코드 검색 경고 스크린샷

리포지토리에 대한 고급 보안을 해제하면 고급 보안 탭 및 빌드 작업의 결과에 액세스할 수 없게 됩니다. 빌드 작업은 실패하지 않지만 고급 보안을 사용하지 않도록 설정된 상태에서 빌드의 결과가 작업과 함께 실행되며 숨겨지고 유지되지 않습니다.

경고 세부 정보

수정 지침을 포함하여 자세한 내용을 보려면 경고를 선택합니다. 각 경고에는 위치, 설명, 예제 및 심각도가 포함됩니다.

코드 검색 경고 세부 정보 스크린샷

섹션 설명
위치 위치 섹션에서는 CodeQL이 취약성을 감지한 특정 인스턴스에 대해 자세히 설명합니다. 동일한 규칙을 위반하는 코드 인스턴스가 여러 개 있는 경우 각 고유 위치에 대해 새 경고가 생성됩니다. 위치 카드 영향을 받는 코드 조각에 대한 직접 링크를 포함하므로 편집을 위해 Azure DevOps 웹 UI로 보낼 코드 조각을 선택할 수 있습니다.
설명 설명은 문제를 기반으로 CodeQL 도구에서 제공됩니다.
추천 권장 사항은 지정된 코드 검사 경고에 대한 권장 수정 사항입니다.
예시 예제 섹션에서는 코드에서 식별된 약점의 간소화된 예제를 보여 줍니다.
심각도 심각도 수준은 낮음, 중간, 높음 또는 위험일 수 있습니다. 심각도 점수는 식별된 CWE(Common Weakness Enumeration)에 대해 지정된 CVSS(Common Vulnerability Scoring System) 점수를 기반으로 합니다. 이 GitHub 블로그 게시물에서 심각도 점수 매기기 방법에 대해 자세히 알아봅니다.

코드 검사 경고 관리

리포지토리에 대한 경고 보기

리포지토리에 대한 기여자 권한이 있는 사용자는 리포지토리의 고급 보안 탭에서 리포지토리에 대한 모든 경고의 요약을 볼 수 있습니다. 코드 검색 탭을 선택하여 모든 비밀 검색 경고를 봅니다.

결과를 표시하려면 코드 검사 작업을 먼저 실행해야 합니다. 첫 번째 검사가 완료되면 검색된 취약성이 고급 보안 탭에 표시됩니다.

기본적으로 경고 페이지에는 리포지토리의 기본 분기 대한 종속성 검사 결과가 표시됩니다.

지정된 경고의 상태 다른 분기 및 파이프라인에 경고가 있는 경우에도 기본 분기 및 최신 실행 파이프라인의 상태를 반영합니다.

코드 검색 경고 해제

경고를 해제하려면 적절한 권한이 필요합니다. 기본적으로 프로젝트 관리자만 고급 보안 경고를 해제할 수 있습니다.

경고를 해제하려면 다음을 수행합니다.

  1. 닫을 경고로 이동하고 경고에서 선택합니다.
  2. 경고 닫기 드롭다운을 선택합니다.
  3. 아직 선택하지 않은 경우 닫는 이유로 허용된 위험 또는 가양성을 선택합니다.
  4. 메모 텍스트 상자에 선택적 주석추가합니다.
  5. 기를 선택하여 경고를 제출하고 닫습니다.
  6. 경고 상태가 열기에서 닫힘으로 변경되고 해고 사유가 표시됩니다.

코드 검색 경고를 해제하는 방법의 스크린샷

그러면 선택한 분기에 대한 경고만 해제됩니다. 동일한 취약성을 포함하는 다른 분기는 해제될 때까지 활성 상태로 유지됩니다. 이전에 해제된 경고는 수동으로 다시 열 수 있습니다.

CodeQL에서 사용자 지정 쿼리 사용

기본적으로 파이프라인 설정에 지정된 사용자 지정 구성 파일이 없는 경우 CodeQL은 쿼리 팩을 security-extended 실행하여 코드를 분석합니다. 사용자 지정 CodeQL 쿼리를 활용하여 고유한 쿼리를 작성하여 특정 취약성 및 오류를 찾을 수 있습니다. 또한 CodeQL의 기본 분석을 수정하기 위해 사용자 지정 구성 파일을 만들어야 합니다.

기존 사용자 지정 쿼리를 찾거나 사용자 고유의 사용자 지정 쿼리를 제공하려면 CodeQL에 기여를 참조하세요.

사용자 지정 쿼리를 사용하여 분석

사용자 지정 쿼리로 시작하는 가장 빠른 방법은 쿼리를 작성하고 로컬 Azure DevOps 리포지토리에 저장하는 것입니다. 필요에 따라 사용자 지정 쿼리의 세부 정보를 사용자 지정할 수 있지만 적어도 규칙 ID가 있어야 합니다. 고유한 CodeQL 쿼리를 작성하는 방법에 대한 자세한 내용은 CodeQL 쿼리 작성을 참조 하세요. 여러 쿼리를 쿼리 도구 모음에 함께 묶거나 다른 사용자가 게시한 팩을 활용할 수도 있습니다. 자세한 내용은 CodeQL 팩 게시 및 사용을 참조 하세요.

사용자 지정 구성 파일 사용

사용자 지정 구성 파일은 코드에 대해 CodeQL을 분석하는 동안 실행되는 쿼리를 관리하는 방법입니다. 실행할 추가 쿼리 또는 쿼리 팩을 지정하고 기본 CodeQL 쿼리를 변경하거나 사용하지 않도록 설정할 수 있습니다.

포함하려는 특정 쿼리를 포함하려면 리포지토리에서 쿼리 파일(.ql)의 위치에 대한 이름과 경로를 사용하여 쿼리를 지정합니다.

포함하려는 특정 팩을 포함하려면 팩 이름을 지정합니다. 구성 파일에서 실행할 CodeQL 쿼리 팩 수를 지정할 수 있습니다.

구성 파일의 packs 필터는 GitHub에서 호스트되는 리포지토리에서 팩 다운로드를 지원하지만 queries 필터는 지원하지 않습니다. GitHub에서 팩이 프라이빗인 경우 태스크를 통해 AdvancedSecurity-Codeql-Init@1 환경 변수 및 변수 이름으로 GitHub 액세스 토큰을 제공해야 합니다. 토큰 read:packages범위는 다음과 같습니다GITHUB_TOKEN.

다음은 예제 구성 파일입니다.

name: "Run custom queries"

# When using a configuration file, if you do not disable default queries,
# then the default CodeQL queries in the `code-scanning` query suite will also execute upon analysis.
disable-default-queries: true
 
# To reference local queries saved to your repository,
# the path must start with `./` followed by the path to the custom query or queries.
# Names for each query referenced is optional.
queries:
  - name: Use security-extended query suite
    uses: security-extended
  - name: Use local custom query (single query)
    uses: ./customQueries/javascript/FindTestFunctions.ql
  - name: Use local custom query (directory of queries)
    uses: ./customQueries/javascript/MemoryLeakQueries  
 
packs:
 - mygithuborg/mypackname
 
paths:
 - src
 
paths-ignore:
  - src/node_modules
  - '**/*.test.js'
 
query-filters:
 - include:
    kind: problem
 - include:
     precision: medium
 - exclude:
    id:
      - js/angular/disabling-sce
      - js/angular/insecure-url-allowlist

구성 파일 사양은 태스크에 대한 AdvancedSecurity-Codeql-Init@1 파이프라인 수준 구성보다 무시하고 우선합니다. includepaths / ignorepaths 은 무시되거나 있는 경우 paths/paths-ignore 다음의 paths/paths-ignore값으로 덮어씁니다. querysuite 는 구성 파일 또는 queriespacks 구성 파일에 지정된 값으로 덮어씁니다.

구성 파일에 대한 보다 구체적인 조언 및 구성 옵션은 코드 검색을 위한 고급 설정 사용자 지정을 참조하세요.

구성 파일이 있으면 CodeQL 분석을 실행하는 파이프라인을 사용자 지정하여 새 파일을 활용해야 합니다. 구성 파일을 가리키는 샘플 파이프라인은 다음과 같습니다.

trigger: none
 
pool:
  vmImage: windows-latest

# You can either specify your CodeQL variables in a variable block... 
variables:
# `configfilepath` must be an absolute file path relative to the repository root
  advancedsecurity.codeql.configfilepath: '$(build.sourcesDirectory)/.pipelines/steps/configfile.yml' 

# Or you can specify variables as variables for the task. You do not need both definitions. 
steps:
- task: AdvancedSecurity-Codeql-Init@1
  displayName: Initialize CodeQL
  inputs:
    languages: 'javascript'
    loglevel: '2'
    configfilepath: '$(build.sourcesDirectory)/.pipelines/steps/configfile.yml'
# If downloading a pack from GitHub,
# you must include a GitHub access token with the scope of `read:packages`.
  env:
    GITHUB_TOKEN: $(githubtoken)
 
- task: AdvancedSecurity-Codeql-Autobuild@1
  displayName: AutoBuild
 
- task: AdvancedSecurity-Codeql-Analyze@1
  displayName: Perform CodeQL Analysis

코드 검사 문제 해결

일반적으로 CodeQL 실행에 오류가 발생하는 경우 CodeQL CLI는 실행된 각 명령의 상태 종료 코드로 보고합니다. 종료 코드는 후속 명령 또는 CodeQL CLI를 사용하는 다른 도구에 대한 정보를 제공합니다. 종료 코드 세부 정보에 대한 자세한 내용은 종료 코드를 참조 하세요.

오류: 'database finalize' CodeQL 명령(32)

이 오류는 추출 오류 또는 빌드 단계 누락으로 인해 CodeQL 데이터베이스 만들기를 완료하는 데 문제가 있음을 나타냅니다.

문제 해결 단계:

  1. 코드가 존재하고 컴파일되었는지 확인
    • 컴파일된 언어의 경우 빌드 프로세스가 코드를 컴파일하고 작업 AdvancedSecurity-Codeql-Analyze 간에 AdvancedSecurity-Codeql-Init 발생하는지 확인합니다. 일반적인 빌드 명령 및 필수 플래그(예: 클린 no-cache/no-daemon)는 빌드 명령 지정에서 찾을 수 있습니다.
    • 해석된 언어의 경우 프로젝트에 지정된 언어에 대한 소스 코드가 있는지 확인합니다.
  2. 추출 오류 확인
    • 추출 오류가 CodeQL 데이터베이스의 상태에 영향을 주는지 확인합니다.
    • 로그 파일에서 추출 오류 및 경고를 검토하여 전체 데이터베이스 상태를 평가합니다.
  3. 압도적인 오류 조사
    • 대부분의 파일에서 추출기 오류가 발생하는 경우 추가로 조사하여 부적절한 추출의 근본 원인을 파악합니다.

오류: 자동 작성 스크립트(1)

이 오류는 자동 빌드 실패에 대해 설명하며, 코드 검색 설정 또는 구성에 문제가 있음을 시사합니다.

문제 해결 단계:

  1. 빌드 단계 구성
    • AutoBuild 단계를 제거하고 대신 파이프라인에서 컴파일된 언어에 대한 특정 빌드 단계를 구성합니다.
    • Azure DevOps에 대한 GitHub 고급 보안 구성에 제공된 설정 지침을 참조하세요.

오류: 에이전트 도구 캐시에서 CodeQL 디렉터리를 찾을 수 없음

이 오류는 자체 호스팅 에이전트에 대한 CodeQL 설치와 관련된 문제를 나타냅니다.

문제 해결 단계:

  1. Azure DevOps에 대한 GitHub 고급 보안 구성에 제공된 설정 지침 또는 구성 스크립트를 참조하세요.

오류: 언어 파이프라인 변수가 설정되지 않음

이 오류는 검색할 언어를 지정하는 파이프라인 변수를 설정하지 않고 CodeQL을 실행하려고 할 때 발생합니다.

문제 해결 단계:

  1. 언어 파이프라인 변수 설정
    • 언어 파이프라인 변수가 올바르게 구성되었는지 확인합니다. Azure DevOps에 대한 GitHub 고급 보안 구성에 제공된 설정 지침을 참조하세요.
    • 지원되는 언어에는 csharp,, gocpp, javajavascript, pythonruby및 .swift

결과를 반환하지 않는 CodeQL

이 섹션에서는 CodeQL 분석에서 결과를 생성하지 않는 상황에 대한 지침을 제공합니다.

문제 해결 단계:

  1. 검색된 취약성 확인
    • 코드에 취약성이 없을 수 있는 가능성을 고려합니다. 취약성이 예상되었지만 검색되지 않은 경우 추가 확인을 진행합니다.
  2. 쿼리 도구 모음 구성 검토
  3. 결과 보기에 대한 권한 조정
    • 적어도 기여자 수준에서 분석 결과에 액세스할 수 있는 적절한 권한이 부여되었는지 확인합니다. 자세한 내용은 고급 보안 권한을 참조 하세요.

코드 검사 작업 권한

코드 검사 빌드 작업은 파이프라인 ID를 사용하여 고급 보안 REST API를 호출합니다. 기본적으로 동일한 프로젝트의 파이프라인은 CodeQL 분석을 실행하여 생성된 SARIF 파일을 업로드할 수 있습니다. 빌드 서비스 계정에서 해당 권한을 제거하거나 사용자 지정 설정(예: 리포지토리와 다른 프로젝트에서 호스트되는 파이프라인)이 있는 경우 이러한 권한을 수동으로 부여해야 합니다.

문제 해결 단계:

  • 파이프라인에서 사용되는 빌드 서비스 계정에 대한 권한 Advanced Security: View alerts 부여 및 Advanced Security: Manage and dismiss alerts 권한( 프로젝트 범위 파이프라인의 경우 [Project Name] Build Service ([Organization Name])및 컬렉션 범위 파이프라인의 경우 Project Collection Build Service ([Organization Name])).