다음을 통해 공유


CodeQL 및 정적 도구 로고 테스트

CodeQL 및 드라이버 보안

Microsoft는 Windows 운영 체제에 대한 공격 표면을 완화하고 타사 드라이버가 강력한 보안 표시줄을 충족하도록 하는 것이 해당 목표를 달성하는 데 매우 중요합니다. 이 보안 표시줄을 설정하는 한 단계는 모든 드라이버 제출이 드라이버 소스 코드에서 CodeQL 엔진을 사용하고 "반드시 수정해야 함"으로 간주되는 위반을 수정해야 한다고 명시하는 Windows WHCP(하드웨어 호환성 프로그램)에 대한 요구 사항입니다.

GitHub의 CodeQL은 강력한 의미 체계 코드 분석 엔진이며, 강력한 플랫폼과 함께 광범위한 고부가가치 보안 쿼리 제품군을 조합하여 드라이버 코드를 보호하는 데 매우 유용한 도구입니다.

WHCP 테스트를 위해 CodeQL을 사용할 수 있는 방법은 HLK(하드웨어 랩 키트) 최종 사용자 사용권 계약에 따라 허용됩니다. WHCP 참가자의 경우 HLK의 EULA는 WHCP의 일부로 제출 및 인증할 드라이버를 분석하기 위한 일반 엔지니어링 프로세스의 일환으로 자동화된 분석, CI 또는 CD 중에 CodeQL을 사용할 수 있다고 명시하여 GitHub의 CodeQL 사용 약관을 덮어씁니다.

드라이버 소스 코드를 분석하고 "반드시 수정해야 하는" 위반을 수정하기 위한 요구 사항은 정적 도구 로고 테스트의해 적용됩니다.

이 항목에서는 다음 작업을 수행하는 방법을 설명합니다.

  • CodeQL을 사용하여 알려진 고영향 보안 문제에 대한 드라이버 소스 코드를 분석합니다.
  • 정적 도구 로고 테스트가 CodeQL 실행 결과를 사용할 수 있는지 확인합니다.
  • WHCP 인증을 위해 실행해야 하는 "반드시 수정해야 하는" 쿼리를 결정합니다.

Important

Windows 하드웨어 호환성 프로그램에는 클라이언트 및 서버 운영 체제에서 STL(정적 도구 로고) 테스트용 CodeQL이 필요합니다. 우리는 이전 제품에 대한 SDV 및 CA에 대한 지원을 계속 유지합니다. 파트너는 정적 도구 로고 테스트에 대한 CodeQL 요구 사항을 검토하는 것이 좋습니다.

HLK EULA 및 CodeQL

Windows 하드웨어 호환성 프로그램 테스트를 인증하기 위한 CodeQL 사용은 HLK(하드웨어 랩 키트) 최종 사용자 사용권 계약에 따라 허용됩니다. WHCP 참가자의 경우 HLK의 EULA는 GitHub의 CodeQL 사용 약관을 덮어씁니다. HLK EULA는 Windows 하드웨어 호환성 프로그램의 일부로 제출 및 인증할 드라이버를 분석하기 위한 일반 엔지니어링 프로세스의 일부로 자동화된 분석, CI 또는 CD 중에 CodeQL을 사용할 수 있다고 명시하고 있습니다. 일반적인 사용을 위해 다음을 수행하는 경우 GitHub CodeQL 사용 약관을 읽거나 CodeQL에 문의하세요.

CodeQL 개념

CodeQL은 개발자가 라이브 환경 외부의 코드에서 보안 분석을 수행하는 데 사용하는 정적 분석 엔진입니다. CodeQL은 컴파일하는 동안 코드를 수집하고 해당 코드에서 데이터베이스를 빌드합니다. 데이터베이스는 쿼리 가능한 데이터, 원본 참조 및 로그 파일을 포함하는 디렉터리가 됩니다. 데이터베이스가 빌드되면 소스 코드에 위반 또는 보안 취약성이 포함되어 있는지 확인하는 CodeQL 쿼리(검사 또는 규칙이라고도 함)를 활용하여 분석을 실행할 수 있습니다. CodeQL은 언어 정확성, 의미 체계를 확인하는 표준 쿼리 라이브러리를 제공하며 코드에 버그 및 취약성이 없는지 확인하려는 개발자에게 큰 가치를 제공합니다.

CodeQL은 사용자 지정 쿼리를 빌드하는 옵션도 제공합니다. 사용자 지정 쿼리 작성에 대한 자세한 내용은 CodeQL 문서에서 쿼리 작성을 참조하세요.

또한 CodeQL은 CodeQL 작업을 쉽게 수행하거나 대규모 분석을 수행할 수 있는 CodeQL CLI(명령줄 도구)를 제공합니다.

추가 CodeQL CLI 설명서는 CodeQL 시작에서 찾을 수 있습니다.

1. CodeQL 설정

Windows 하드웨어 호환성 프로그램 사용

Windows 하드웨어 호환성 프로그램 릴리스 버전 매트릭스

이 매트릭스를 사용하여 다운로드할 버전을 결정합니다.

Windows 릴리스 CodeQL CLI 버전 microsoft/windows-drivers QL 팩 버전 codeql/cpp-queries QL 팩 버전 사용할 분기
Windows Server 2022 2.4.6 또는 2.15.4 1.0.13(codeql 2.15.4를 사용하는 경우) 0.9.0(codeql 2.15.4를 사용하는 경우) WHCP_21H2
Windows 11 2.4.6 또는 2.15.4 1.0.13(codeql 2.15.4를 사용하는 경우) 0.9.0(codeql 2.15.4를 사용하는 경우) WHCP_21H2
Windows 11 버전 22H2 2.6.3 또는 2.15.4 1.0.13(codeql 2.15.4를 사용하는 경우) 0.9.0(codeql 2.15.4를 사용하는 경우) WHCP_22H2
Windows 11 버전 23H2 2.6.3 또는 2.15.4 1.0.13(codeql 2.15.4를 사용하는 경우) 0.9.0(codeql 2.15.4를 사용하는 경우) WHCP_22H2
Windows 11 버전 24H2 2.15.4 1.1.0 0.9.0 WHCP_24H2

최신 버전의 CodeQL만 QL 팩을 지원하므로 CodeQL CLI 2.4.6 및 2.6.3에는 QL 팩 버전이 지정되지 않았습니다.

일반 사용

WHCP 프로그램 외부의 다른 Windows 버전에서 CodeQL을 일반적으로 사용하거나 쿼리를 개발하고 테스트하려면 현재 다음 버전과 분기를 사용하는 것이 좋습니다.

CodeQL CLI 버전 microsoft/windows-drivers qlpack 버전 codeql/cpp-queries 버전 사용할 분기
2.15.4 latest latest main

CodeQL 다운로드 및 설치

참고 항목

Visual Studio 17.8은 WHCP_21H2 및 WHCP_22H2 분기에 사용된 이전 버전의 CodeQL과의 호환성을 깨뜨렸습니다. CodeQL CLI 버전 2.15.4는 Visual Studio 17.8 이상에서 WHCP 21H2 및 WHCP 22H2와 함께 사용하기 위해 유효성이 검사되었습니다. WHCP 프로그램의 경우 위의 표에 따라 CodeQL CLI 버전을 사용하고 버전 2.4.6, 버전 2.6.3 또는 버전 2.15.4에 대해 인증하는 Windows 릴리스를 사용합니다. 주 분기에서 일반적으로 사용하려면 CodeQL CLI 버전 2.15.4를 사용합니다.

  1. CodeQL을 포함할 디렉터리를 만듭니다. 이 예제에서는 C:\codeql-home\

    C:\> mkdir C:\codeql-home
    
  2. Microsoft 드라이버 쿼리의 원하는 분기에 따라 사용할 CodeQL CLI 버전을 선택하려면 위의 표를 참조하세요. WHCP 프로그램의 일부로 분석을 수행하는 경우 Windows 하드웨어 호환성 프로그램용 테이블을 참조하세요. 그렇지 않으면 기본 분기 및 2.15.4를 사용합니다. 다른 버전을 사용하면 데이터베이스가 라이브러리와 호환되지 않을 수 있습니다.

  3. 위의 테이블과 연결된 CodeQL CLI 이진 파일 릴리스로 이동하고 프로젝트의 아키텍처에 따라 zip 파일을 다운로드합니다. 예를 들어 64비트 Windows "codeql-win64.zip"입니다.

  4. Codeql CLI 디렉터리를 방금 만든 디렉터리(예: C:\codeql-home\codeql)로 추출합니다.

  5. 버전을 확인하여 CodeQL이 올바르게 설치되었는지 확인합니다.

     C:\codeql-home\codeql>codeql --version
     CodeQL command-line toolchain release 2.15.4.
     Copyright (C) 2019-2023 GitHub, Inc.
     Unpacked in: C:\codeql-home\codeql
         Analysis results depend critically on separately distributed query and
         extractor modules. To list modules that are visible to the toolchain,
         use 'codeql resolve qlpacks' and 'codeql resolve languages'.
    
  6. 도움말 명령은 명령줄 사용 정보를 표시합니다.

    C:\codeql-home\codeql\>codeql --help
    Usage: codeql <command> <argument>...
    Create and query CodeQL databases, or work with the QL language.
    
    GitHub makes this program freely available for the analysis of open-source software and certain other uses, but it is
    not itself free software. Type codeql --license to see the license terms.
    
          --license              Show the license terms for the CodeQL toolchain.
    Common options:
      -h, --help                 Show this help text.
      -v, --verbose              Incrementally increase the number of progress messages printed.
      -q, --quiet                Incrementally decrease the number of progress messages printed.
    Some advanced options have been hidden; try --help -v for a fuller view.
    Commands:
      query     Compile and execute QL code.
      bqrs      Get information from .bqrs files.
      database  Create, analyze and process CodeQL databases.
      dataset   [Plumbing] Work with raw QL datasets.
      test      Execute QL unit tests.
      resolve   [Deep plumbing] Helper commands to resolve disk locations etc.
      execute   [Deep plumbing] Low-level commands that need special JVM options.
      version   Show the version of the CodeQL toolchain.
      generate  Generate formatted QL documentation.
    

CodeQL 패키지 설치

WHCP_21H2 및 WHCP_22H2 분기의 경우

WHCP_21H2 또는 WHCP_22H2 및 CodeQL CLI 버전 2.15.4에서 Visual Studio 2022 17.8 이상 사용:

  • "다른 모든 분기"에 대한 단계를 따릅니다.
  • 이전 버전의 리포지토리가 복제된 경우 CodeQL 하위 모듈을 제거해야 합니다. CodeQL은 기본적으로 하위 모듈의 쿼리를 사용하려고 할 수 있으며, 이로 인해 버전이 일치하지 않아 오류가 발생할 수 있습니다.

Visual Studio 버전 17.7 이하 WHCP_21H2 또는 WHCP_22H2 AND CodeQL CLI 버전 2.4.6 또는 2.6.3을 사용하는 경우:

  • 아래의 VS17.7 이하를 사용하여 WHCP_21H2 및 WHCP_22H2 대한 특별 지침을 따릅니다.

기타 모든 분기

CodeQL 쿼리 패키지 다운로드

인증을 위해 쿼리를 사용하기 위해 더 이상 Windows-Driver-Developer-Supplemental-Tools 리포지토리를 복제할 필요가 없습니다. 이제 CodeQL 패키지("QL 팩" 또는 "쿼리 팩")가 사용됩니다.

  1. Windows 하드웨어 호환성 프로그램 릴리스 버전 매트릭스에서 올바른 버전의 Microsoft/windows 드라이버 팩을 다운로드합니다. @<version> 아래 명령에서 지정합니다.
C:\codeql-home\> codeql pack download microsoft/windows-drivers@<version>

예를 들어 WHCP_24H2 사용하는 경우 다음 명령을 실행하여 1.1.0 windows-drivers 쿼리 팩을 다운로드합니다.

C:\codeql-home\> codeql pack download microsoft/windows-drivers@1.1.0

이 명령을 사용하여 CodeQL cpp-querys 쿼리 팩 버전 0.9.0을 다운로드합니다.

C:\codeql-home\> codeql pack download codeql/cpp-queries@0.9.0

(이 옵션은 분석 프로세스의 뒷부분에서 필요한 쿼리를 --download 다운로드하므로 위의 단계를 건너뛸 수 있습니다.)

CodeQL은 다운로드한 쿼리 팩을 기본 디렉터리에 설치합니다.

C:\Users\<current user>\.codeql\packages\microsoft\windows-drivers\<downloaded version>\

이 디렉터리를 변경하거나 설치된 팩을 이동하지 마세요.

Windows 드라이버 쿼리 도구 모음 다운로드

두 개의 기본 쿼리 도구 모음 파일을 찾아 로컬 PC에 복사합니다.

  • windows-driver-recommended.qls
  • windows-driver-mustfix.qls

해당 내용은 쿼리 및 제품군아래에 나와 있습니다. 두 파일은 에 있습니다.https://github.com/microsoft/Windows-Driver-Developer-Supplemental-Tools/tree/main/suites

2. CodeQL 데이터베이스 빌드

이러한 예제에서는 Windows 개발 환경을 사용하고 설치 위치가 C:\codeql-home이라고 가정하지만 사용자에게 적합한 설정을 사용할 수 있습니다. 지원되는 컴파일러 목록은 CodeQL 지원 언어 및 프레임워크를 참조하세요.

  1. 만든 데이터베이스를 배치하는 CodeQL에 대한 디렉터리를 만듭니다. 예: C:\codeql-home\databases

    mkdir C:\codeql-home\databases
    
  2. CodeQL 명령을 사용하여 다음 매개 변수를 사용하여 데이터베이스를 만듭니다.

    • 첫 번째 매개 변수는 데이터베이스 디렉터리에 대한 링크입니다. 예: C:\codeql-home\databases\MyDriverDatabase(디렉터리가 이미 있는 경우 이 명령이 실패).
    • --language 또는 -l 소스 코드가 있는 언어 또는 언어입니다(쉼표로 구분된 목록일 수 있습니다. 예: [cpp, javascript]).
    • -- source 또는 -s 소스 코드의 경로입니다.
    • --command 또는 -c 빌드 명령 또는 빌드 파일의 경로입니다.
    codeql database create <database directory> --language=<language> --source=<path to source code> --command=<build command or path to build file>
    

예제

단일 드라이버 예제입니다.

C:\codeql-home\codeql> codeql database create D:\DriverDatabase --language=cpp --source-root=D:\Drivers\SingleDriver --command="msbuild /t:rebuild D:\Drivers\SingleDriver\SingleDriver.sln"

여러 드라이버 예제입니다.

C:\codeql-home\codeql> codeql database create D:\SampleDriversDatabase --language=cpp --source-root=D:\AllMyDrivers\SampleDrivers --command=D:\AllMyDrivers\SampleDrivers\BuildAllSampleDrivers.cmd

명령을 사용하는 방법에 대한 자세한 내용이나 도움말은 database create CodeQL 데이터베이스 만들기로 이동하거나 다음 명령을 사용합니다.

C:\codeql-home\codeql> codeql database create --help

3. 분석 수행

참고 항목

Visual Studio 버전 17.7 이하 및 WHCP_21H2 또는 WHCP_22H2 AND CodeQL VLI 버전 2.4.6 또는 2.6.3을 사용하는 경우 아래 VS17.7 이하를 사용하여 WHCP_21H2 및 WHCP_22H2 대한 특별 지침을 따릅니다.

이 시점에서 설정이 완료되고 다음 단계는 드라이버 소스 코드에 대한 실제 분석을 수행하는 것입니다.

  1. CodeQL 명령을 사용하여 다음 매개 변수를 사용하여 데이터베이스를 분석합니다.

    • 첫 번째 매개 변수는 데이터베이스 디렉터리에 대한 링크입니다. 예: C:\codeql-home\databases\MyDriverDatabase. 디렉터리가 없으면 이 명령이 실패합니다.
    • --download 플래그는 쿼리를 실행하기 전에 CodeQL에 종속성을 다운로드하도록 지시합니다.
    • --format 는 출력 파일의 파일 형식입니다. 옵션에는 SARIF 및 CSV가 포함됩니다. (WHCP 사용자의 경우 SARIF 형식을 사용합니다.)
    • --output 는 출력 파일을 원하는 위치의 경로입니다. 파일 이름에 형식을 포함해야 합니다. (디렉터리가 아직 없는 경우 이 명령이 실패합니다.)
    • 쿼리 지정자 매개 변수는 다음을 포함할 수 있는 공백으로 구분된 인수 목록입니다.
      • 쿼리 파일의 경로
      • 쿼리 파일이 포함된 디렉터리의 경로
      • 쿼리 도구 모음 파일의 경로
      • CodeQL 쿼리 팩의 이름
    codeql database analyze --download <path to database> <path to query suite .qls file> --format=sarifv2.1.0 --output=<outputname>.sarif
    

    예시:

    codeql database analyze --download D:\DriverDatabase suites/windows-driver-recommended.qls --format=sarifv2.1.0 --output=D:\DriverAnalysis1.sarif 
    

    명령을 사용하는 방법에 대한 자세한 내용이나 도움말은 database analyze CodeQL CLI를 사용하여 데이터베이스 분석 및 CodeQL 팩을 사용하여 CodeQL 데이터베이스를 분석하세요.

    명령줄 도움말의 경우 다음 명령을 사용합니다.

    C:\codeql-home\codeql> codeql database analyze --help
    

VS17.7 이하를 사용하는 WHCP_21H2 및 WHCP_22H2 대한 특별 지침

이러한 지침은 CodeQL 2.6.3 또는 2.4.6과 함께 Visual Studio 17.7 이하를 사용하는 경우에만 적용됩니다.

  1. 위 단계에 표시된 대로 CodeQL 버전을 설치합니다.

  2. 드라이버에 대한 CodeQL 쿼리를 포함하는 Windows 드라이버 개발자 추가 도구 리포지토리를 복제하고 설치합니다.

    git clone https://github.com/microsoft/Windows-Driver-Developer-Supplemental-Tools.git --recurse-submodules

  3. 인증하려는 Windows 버전에 대한 올바른 분기를 확인하려면 Windows 하드웨어 호환성 프로그램 릴리스 버전 매트릭스 를 참조하세요.

  4. git checkout 명령을 사용하여 식별된 분기를 체크 아웃합니다.

  5. 하위 모듈이 codeql-home 디렉터리에 있는지 확인합니다.

     D:/codeql-home
         |--- codeql
         |--- Windows-Driver-Developer-Supplemental-Tools
    
  6. CodeQL 데이터베이스를 분석합니다.

    환경과 일치하도록 이 예제 명령을 업데이트합니다. 매개 변수, 새 데이터베이스 경로, 형식, 출력 sarif 파일, 분석에 사용할 CodeQL 쿼리 또는 쿼리 도구 모음의 경로를 설정합니다.

    codeql database analyze <path to database> --format=sarifv2.1.0 --output=<"path to output file".sarif> <path to query/suite to run>

    예시:

    codeql database analyze D:\DriverDatabase --format=sarifv2.1.0 --output=D:\DriverAnalysis1.sarif D:\codeql-home\Windows-driver-developer-supplemental-tools\src\suites\windows_driver_mustfix.qls

    실행하려는 도구 모음 또는 쿼리의 경로를 확인해야 합니다. 모든 분기의 파일 구조가 동일하지는 않습니다.

  7. 테스트 결과 검토 및 제출과 같은 다음 단계는 이 문서의 다른 지침을 참조하세요.

4. 결과 보기 및 해석

이 섹션에서는 다음 단계에 필요한 대로 SARIF 형식에 초점을 맞출 것입니다. 단, CSV 형식이 요구 사항에 더 적합한 경우 사용할 수 있습니다.

SARIF(정적 분석 결과 교환 형식)는 정적 분석 결과를 공유하는 데 사용되는 JSON 형식 형식입니다. OASIS SARIF(정적 분석 결과 교환 형식)의 표준, CodeQL에서 SARIF 출력을 사용하는 방법 및 스키마 json에 대해 자세히 알아보세요.

개체를 수동으로 정렬하는 것을 포함하여 분석 결과를 해석하는 여러 가지 방법이 있습니다. 다음은 사용하는 몇 가지 사항입니다.

  • Microsoft Sarif Viewer(웹)에는 SARIF 파일을 뷰어로 끌어서 놓은 다음 규칙에 따라 분류된 결과를 표시할 수 있는 기능이 있습니다. 이는 위반 횟수 또는 위반이 있는 쿼리를 확인하는 매우 빠르고 쉬운 방법이지만 줄 번호 외에 소스 코드 정보를 찾기가 쉽지 않습니다. 위반이 없으면 페이지가 업데이트되지 않습니다.

  • Visual Studio용 Microsoft SARIF 뷰어는 결과에서 소스 코드로 원활하게 전환할 수 있도록 Visual Studio 내에서 결과를 표시하는 데 적합합니다.

  • Visual Studio Code용 SARIF 확장

SARIF 파일의 가장 중요한 섹션은 "Run" 개체 내의 "Results" 속성입니다. 각 쿼리에는 검색된 위반 및 발생한 위치에 대한 세부 정보가 포함된 Results 속성이 있습니다. 위반이 없으면 속성 값이 비어 있습니다.

쿼리는 "오류" "경고" 및 "문제"와 같은 상태를 사용하여 분류되지만 이 분류는 Windows 하드웨어 호환성 프로그램 및 특히 정적 도구 로고 테스트에서 결과를 채점하는 방법과는 별개입니다. "Must-Fix" 제품군 내의 쿼리에서 결함이 있는 드라이버는 정적 도구 로고 테스트를 통과 하지 못하며 원시 쿼리 파일의 쿼리 분류(예: "경고")에 관계없이 인증되지 않습니다.

5. CodeQL 결과 표시 안 함(선택 사항)

드라이버용 CodeQL은 결과 표시 안 을 지원합니다. 제거는 현재 개발자가 문제를 심사하고 노이즈를 줄이는 데 도움이 되도록 편의를 위해 제공되며, 반드시 수정해야 하는 검사를 우회하는 방법이 아닙니다. 드라이버 확인 로그를 생성하거나 현재 정적 도구 로고 테스트를 통과하는 데 영향을 주지 않습니다. 억제를 사용하려면 실행하려는 다른 쿼리 또는 제품군과 동시에 DriverAlertSuppression.ql 쿼리를 실행해야 합니다. 기본적으로 이 쿼리는 Githubs 주/개발 분기에서 제품군을 실행할 때 사용하도록 설정됩니다.

코드 분석에서 포팅된 검사의 경우 기존 코드 분석 억제가 적용됩니다. 자세한 내용은 C++ 경고 pragma를 참조하세요.

  • Known limitation: 현재 동일한 줄에서 #pragma(사용 안 함) 및 #pragma(표시 안 함)를 결합할 수 없습니다.

CodeQL에 새로 추가된 검사의 경우 다음 두 가지 중 하나를 수행하여 표시하지 않을 수 있습니다.

  • 코드 분석과 마찬가지로 위반 위의 줄에 "#pragma(suppress:the-rule-id-here)" 주석(따옴표 빼기)을 작성합니다. "the-rule-id-here"는 파일 맨 위에서 볼 수 있는 지정된 쿼리 메타데이터의 값으로 바꿀 @id 수 있습니다.

  • "lgtm[the-rule-id-here]" 텍스트로 구성된 위의 줄에 주석을 씁니다(따옴표 빼기). 드라이버 경고 억제 쿼리 대신 표준 C/C++ 경고 표시 안 함 쿼리를 실행해야 합니다.

제거가 존재하고 인식되면 결과 SARIF 파일에는 결과가 표시되지 않은 데이터가 포함되며 대부분의 결과 뷰어는 기본적으로 결과를 표시하지 않습니다.

6. SARIF를 DVL(드라이버 확인 로그 형식)으로 변환

정적 도구 로고 테스트는 드라이버 소스 코드에서 실행된 여러 정적 분석 엔진의 컴파일된 결과인 DVL(드라이버 확인 로그)을 구문 분석합니다. SARIF 파일을 DVL 형식으로 변환하는 세 가지 방법이 있습니다. 설정에 가장 적합한 파일을 선택합니다.

Visual Studio 사용(WDK 미리 보기 빌드 20190 이상)

  1. SARIF 결과 파일을 .vcxproj 파일과 동일한 디렉터리에 배치합니다.
  2. 드라이버 확장 메뉴에서 드라이버 확인 로그 만들기를 선택합니다.
  3. DVL UI가 SARIF 파일을 검색했는지 확인합니다.
    • 참고: Visual Studio UI를 사용하여 SARIF 파일을 .vcxproj 디렉터리로 이동한 경우 Visual Studio에서 실제로 이동하는 대신 SARIF 파일에 대한 참조를 만들 수 있습니다. Visual Studio 외부에서 디렉터리를 열어 실제로 존재하는지 확인합니다.
  4. 만들기를 실행합니다.

MSBuild 사용

  1. SARIF 결과 파일을 .vcxproj 파일과 동일한 디렉터리에 배치합니다.

  2. Visual Studio 명령 프롬프트, Visual Studio 네이티브 도구 명령 프롬프트 또는 EWDK(Enterprise Windows 드라이버 키트)를 엽니다.

  3. 다음 매개 변수와 함께 msbuild 명령을 사용합니다.

    • vcx 프로젝트 파일 경로
    • /target:dvl
    • /p:Configuration="Release"
    • /P:Platform=<platform> (x86, x64, arm, arm64 문자열 중 하나만 사용)

    msbuild.exe <vcxprojectfile> /target:dvl /p:Configuration="Release" /P:Platform=<platform>

CMD 사용

  1. WDK 또는 탑재된 eWDK에서 dvl.exe 찾습니다.

  2. 다음 매개 변수와 함께 exe를 사용합니다.

    • /manualCreate
    • driver name (.sys 파일 형식은 포함하지 마세요.)
    • driver architecture (x86, x64, arm, arm64 문자열 중 하나만 사용)

    "C:\Program Files (x86)\Windows Kits\10\Tools\dvl\dvl.exe" /manualCreate <driver name> <driver architecture>

정적 도구 로고 HLK 테스트에 대한 추가 지침 및 DVL 파일을 배치할 위치에 대한 지침은 테스트 실행에서 찾을 수 있습니다.

7. Visual Studio 빌드 후 이벤트(선택 사항)

Visual Studio를 사용하여 드라이버를 빌드하는 경우 빌드 후 이벤트로 실행되도록 CodeQL 쿼리를 구성할 수 있습니다.

이 예제에서는 작은 일괄 처리 파일이 대상 위치에 만들어지고 빌드 후 이벤트로 호출됩니다. Visual Studio C++ 빌드 이벤트에 대한 자세한 내용은 빌드 이벤트 지정을 참조 하세요.

  1. CodeQL 데이터베이스를 다시 만든 다음 원하는 쿼리를 실행하는 작은 일괄 처리 파일을 만듭니다. 이 예제에서는 일괄 처리 파일의 이름을 지정 RunCodeQLRebuildQuery.bat합니다. 디렉터리 위치와 일치하도록 예제 일괄 처리 파일에 표시된 경로를 수정합니다.

    ECHO ">>> Running CodeQL Security Rule V 1.0 <<<"
    ECHO ">>> Removing previously created rules database <<<"
    rmdir /s/q C:\codeql-home\databases\kmdf
    CALL C:\codeql-home\codeql\codeql\codeql.cmd database create -l=cpp -s="C:\codeql-home\drivers\kmdf" -c "msbuild /p:Configuration=Release /p:Platform=x64 C:\codeql-home\drivers\kmdf\kmdfecho.sln /t:rebuild /p:PostBuildEventUseInBuild=false " "C:\codeql-home\databases\kmdf" -j 0
    CALL C:\codeql-home\codeql\codeql\codeql database analyze "C:\codeql-home\databases\kmdf" "C:\codeql-home\Windows-Driver-Developer-Supplemental-Tools\codeql\codeql-queries\cpp\ql\src\Likely Bugs\Underspecified Functions" --format=sarifv2.1.0 --output=C:\codeql-home\databases\kmdf.sarif -j 0 --rerun
    ECHO ">>> Loading SARIF Results in Visual Studio <<<"
    CALL devenv /Edit C:\codeql-home\databases\kmdf.sarif
    SET ERRORLEVEL = 0
    
  2. devenv.exe/편집 옵션은 배치 파일에서 기존 Visual Studio 인스턴스에서 SARIF 결과 파일을 여는 데 사용됩니다. SARIF 결과를 보려면 Visual Studio용 Microsoft SARIF 뷰어를 설치하고 자세한 내용은 해당 지침을 참조하세요.

  3. 드라이버 프로젝트에서 프로젝트 속성으로 이동합니다. 구성 풀다운에서 CodeQL로 확인하려는 빌드 구성을 선택합니다. "릴리스를 사용하는 것이 좋습니다. CodeQL 데이터베이스를 만들고 쿼리를 실행하는 데 몇 분 정도 걸리므로 프로젝트의 디버그 구성에서 CodeQL을 실행하지 않는 것이 좋습니다.

  4. 드라이버 프로젝트 속성에서 빌드 이벤트빌드 후 이벤트를 선택합니다.

  5. 배치 파일의 경로와 빌드 후 이벤트에 대한 설명을 제공합니다.

명령줄 옵션으로 구성된 일괄 처리 파일을 보여 주는 Visual Studio 빌드 후 이벤트 구성입니다.

  1. 실행 중인 일괄 처리 파일의 결과는 빌드 출력의 끝에 표시됩니다.

    1>Starting evaluation of codeql-cpp\Likely Bugs\Underspecified Functions\MistypedFunctionArguments.ql.
    1>Starting evaluation of codeql-cpp\Likely Bugs\Underspecified Functions\TooManyArguments.ql.
    1>Starting evaluation of codeql-cpp\Likely Bugs\Underspecified Functions\TooFewArguments.ql.
    1>Starting evaluation of codeql-cpp\Likely Bugs\Underspecified Functions\ImplicitFunctionDeclaration.ql.
    1>[1/4 eval 4.4s] Evaluation done; writing results to codeql-cpp\Likely Bugs\Underspecified Functions\TooManyArguments.bqrs.
    1>[2/4 eval 4.4s] Evaluation done; writing results to codeql-cpp\Likely Bugs\Underspecified Functions\TooFewArguments.bqrs.
    1>[3/4 eval 4.5s] Evaluation done; writing results to codeql-cpp\Likely Bugs\Underspecified Functions\ImplicitFunctionDeclaration.bqrs.
    1>[4/4 eval 5.2s] Evaluation done; writing results to codeql-cpp\Likely Bugs\Underspecified Functions\MistypedFunctionArguments.bqrs.
    1>Shutting down query evaluator.
    1>Interpreting results.
    1>">>> Loading SARIF Results in Visual Studio <<<"
    

문제 해결

WHCP를 사용하여 인증하는 경우 먼저 대상으로 지정하는 Windows 릴리스와 연결된 HLK 버전, Windows 드라이버 개발자 추가 도구 리포지토리의 연결된 분기 및 후속 CodeQL CLI 버전을 사용하고 있는지 확인합니다. HLK/Windows 릴리스 호환성 매트릭스는 Windows 하드웨어 랩 키트 및 Windows 릴리스/Windows 드라이버 개발자 추가 도구 리포지토리 분기/CodeQL CLI 버전을 참조하세요. CodeQL 설치 섹션의 WHCP 테이블을 참조하세요.

오류 및 해결 방법

데이터베이스 버전 불일치 문제의 경우 다음 도구가 유용할 수 있습니다.

codeql 버전 명령을 사용하여 codeql exe의 버전을 표시합니다.

C:\codeql-home\codeql\>codeql version
CodeQL command-line toolchain release 2.4.0.
Copyright (C) 2019-2020 GitHub, Inc.
Unpacked in: C:\codeql-home\codeql\
   Analysis results depend critically on separately distributed query and
   extractor modules. To list modules that are visible to the toolchain,
   use 'codeql resolve qlpacks' and 'codeql resolve languages'.

데이터베이스 업그레이드 명령은 데이터베이스를 업데이트합니다. 이는 단방향 업그레이드이며 되돌릴 수 없다는 점에 유의하세요. 자세한 내용은 데이터베이스 업그레이드를 참조 하세요.

쿼리 및 제품군

Microsoft CodeQL GitHub 리포지토리의 일부로 엔드투엔드 드라이버 개발자 워크플로를 간소화하는 두 개의 쿼리 도구 모음을 제공합니다. windows_driver_recommended.qls 쿼리 도구 모음은 Microsoft가 드라이버 개발자에게 유용하다고 판단한 모든 쿼리의 상위 집합입니다. windows_driver_mustfix.qls 쿼리 도구 모음에는 정적 도구 로고 테스트를 통과하기 위해 실행 및 통과해야 하는 WHCP 인증에 대해 "반드시 수정해야 합니다"로 간주되는 쿼리가 포함되어 있습니다. 필수 수정 및 권장 쿼리 도구 모음은 모두 정기적으로 업데이트됩니다.

반드시 수정해야 하는 쿼리

아래 쿼리의 하위 집합은 WHCP 인증을 위한 Must-Fix이며 권장 수정 도구 모음에도 포함되어 있습니다.

이 규칙 집합은 windows_driver_mustfix.qls에 포함됩니다.

ID 위치 일반적인 약점 열거형
cpp/bad-addition-overflow-check codeql/cpp-queries//<Version>Likely Bugs/Arithmetic/BadAdditionOverflowCheck.ql CWE-190, CWE-192
cpp/pointer-overflow-check codeql/cpp-queries//<Version>Likely Bugs/Memory Management/PointerOverflow.ql 해당 없음
cpp/too-few-arguments codeql/cpp-queries//<Version>Likely Bugs/Underspecified Functions/TooFewArguments.ql 해당 없음
cpp/comparison-with-wider-type codeql/cpp-queries//<Version>Security/CWE/CWE-190/ComparisonWithWiderType.ql CWE-190, CWE-197, CWE-835
cpp/hresult-boolean-conversion codeql/cpp-queries//<Version>Security/CWE/CWE-253/HResultBooleanConversion.ql CWE-253

windows_driver_mustfix.qls 파일에는 코드 쿼리를 수정해야 합니다.

# Copyright (c) Microsoft Corporation.
# Licensed under the MIT license.

- description: Security queries required to fix when certifying Windows Drivers
- queries: . 
  from: codeql/cpp-queries
  version: 0.9.0
- include:
    query path: 
      - Likely Bugs/Arithmetic/BadAdditionOverflowCheck.ql
      - Likely Bugs/Memory Management/PointerOverflow.ql
      - Likely Bugs/Underspecified Functions/TooFewArguments.ql
      - Security/CWE/CWE-190/ComparisonWithWiderType.ql
      - Security/CWE/CWE-253/HResultBooleanConversion.ql
- import: windows-driver-suites/windows_mustfix_partial.qls
  from: microsoft/windows-drivers

이 규칙 집합은 windows-driver-suites/windows_mustfix_partial.qls에 포함 됩니다.

ID 위치 일반적인 약점 열거형
cpp/windows/wdk/deprecated-api /microsoft/windows-drivers/<Version>/drivers/general/queries/WdkDeprecatedApis/wdk-deprecated-api.ql 해당 없음
microsoft/Security/CWE/CWE-704/WcharCharConversionLimited /microsoft/windows-drivers//<Version>microsoft/Security/CWE/CWE-704/WcharCharConversionLimited.ql CWE-704

windows_mustfix_partial.qls 파일에는 코드 쿼리를 수정해야 합니다.

# Copyright (c) Microsoft Corporation.
# Licensed under the MIT license.

- description: Security queries required to fix when certifying Windows Drivers
- queries: .
  from: microsoft/windows-drivers
- include:
    query path: 
      - drivers/general/queries/WdkDeprecatedApis/wdk-deprecated-api.ql
      - microsoft/Security/CWE/CWE-704/WcharCharConversionLimited.ql

이러한 쿼리는 Microsoft GitHub CodeQL 리포지토리의 windows_driver_recommended.qls 쿼리 도구 모음 에 포함됩니다. "CWE(Common Weakness Enumeration)" 열은 지정된 쿼리에서 검색하는 보안 문제의 종류를 지정합니다. CWE에 대한 자세한 내용은 CWE의 Mitre 페이지를 참조하세요.

좋은 연습 방법

ID 위치 일반적인 약점 열거형
cpp/offset-use-before-range-check codeql/cpp-queries//<Version>Best Practices/Likely Errors/OffsetUseBeforeRangeCheck.ql 해당 없음

버그 가능성이 높습니다.

ID 위치 일반적인 약점 열거형
cpp/bad-addition-overflow-check codeql/cpp-queries//<Version>Likely Bugs/Arithmetic/BadAdditionOverflowCheck.ql CWE-190, CWE-192
cpp/integer-multiplication-cast-to-long codeql/cpp-queries//<Version>Likely Bugs/Arithmetic/IntMultToLong.ql CWE-190, CWE-192, CWE-197, CWE-681
cpp/signed-overflow-check codeql/cpp-queries//<Version>Likely Bugs/Arithmetic/SignedOverflowCheck.ql 해당 없음
cpp/upcast-array-pointer-arithmetic codeql/cpp-queries//<Version>Likely Bugs/Conversion/CastArrayPointerArithmetic.ql CWE-119, CWE-843
cpp/pointer-overflow-check codeql/cpp-queries//<Version>Likely Bugs/Memory Management/PointerOverflow.ql 해당 없음
cpp/too-few-arguments codeql/cpp-queries//<Version>Likely Bugs/Underspecified Functions/TooFewArguments.ql 해당 없음
cpp/incorrect-not-operator-usage codeql/cpp-queries//<Version>Likely Bugs/Likely Typos/IncorrectNotOperatorUsage.ql CWE-480
cpp/suspicious-add-sizeof codeql/cpp-queries//<Version>Likely Bugs/Memory Management/SuspiciousSizeof.ql CWE-468
cpp/uninitialized-local codeql/cpp-queries//<Version>Likely Bugs/Memory Management/UninitializedLocal.ql CWE-457, CWE-665

보안

ID 위치 일반적인 약점 열거형
cpp/conditionally-uninitialized-variable codeql/cpp-queries//<Version>Security/CWE/CWE-457/ConditionallyUninitializedVariable.ql. CWE-457
cpp/unterminated-variadic-call codeql/cpp-queries//<Version>Security/CWE/CWE-121/UnterminatedVarargsCall.ql CWE-121
cpp/suspicious-pointer-scaling codeql/cpp-queries//<Version>Security/CWE/CWE-468/IncorrectPointerScaling.ql CWE-468
cpp/suspicious-pointer-scaling-void codeql/cpp-queries//<Version>Security/CWE/CWE-468/IncorrectPointerScalingVoid.ql CWE-468
cpp/잠재적으로 위험한 함수 codeql/cpp-queries//<Version>Security/CWE/CWE-676/PotentiallyDangerousFunction.ql CWE-676
cpp/incorrect-string-type-conversion codeql/cpp-queries//<Version>Security/CWE/CWE-704/WcharCharConversion.ql CWE-704
cpp/comparison-with-wider-type codeql/cpp-queries//<Version>Security/CWE/CWE-190/ComparisonWithWiderType.ql CWE-190, CWE-197, CWE-835
cpp/hresult-boolean-conversion codeql/cpp-queries//<Version>Security/CWE/CWE-253/HResultBooleanConversion.ql CWE-253
cpp/suspicious-add-sizeof codeql/cpp-queries/<Version>/Security/CWE/CWE-468/CWE-468/SuspiciousAddWithSizeof.ql CWE-468

windows_driver_recommended.qls 파일에는 이러한 권장 코드 쿼리가 포함되어 있습니다.

# Copyright (c) Microsoft Corporation.
# Licensed under the MIT license.

- description: Recommended and required queries for Windows Drivers.
- import: windows-driver-suites/windows_mustfix_partial.qls
  from: microsoft/windows-drivers
- import: windows-driver-suites/windows_recommended_partial.qls
  from: microsoft/windows-drivers
- queries: . 
  from: codeql/cpp-queries
  version: 0.9.0
- include:
    query path: 
      - Best Practices/Likely Errors/OffsetUseBeforeRangeCheck.ql
      - Likely Bugs/Arithmetic/IntMultToLong.ql
      - Likely Bugs/Arithmetic/SignedOverflowCheck.ql
      - Likely Bugs/Conversion/CastArrayPointerArithmetic.ql
      - Likely Bugs/Likely Typos/IncorrectNotOperatorUsage.ql
      - Likely Bugs/Memory Management/SuspiciousSizeof.ql
      - Likely Bugs/Memory Management/UninitializedLocal.ql
      - Security/CWE/CWE-121/UnterminatedVarargsCall.ql
      - Security/CWE/CWE-457/ConditionallyUninitializedVariable.ql
      - Security/CWE/CWE-468/IncorrectPointerScaling.ql
      - Security/CWE/CWE-468/IncorrectPointerScalingVoid.ql
      - Security/CWE/CWE-468/SuspiciousAddWithSizeof.ql
      - Security/CWE/CWE-676/PotentiallyDangerousFunction.ql
      - Security/CWE/CWE-704/WcharCharConversion.ql
      - Likely Bugs/Arithmetic/BadAdditionOverflowCheck.ql
      - Likely Bugs/Memory Management/PointerOverflow.ql
      - Likely Bugs/Underspecified Functions/TooFewArguments.ql
      - Security/CWE/CWE-190/ComparisonWithWiderType.ql
      - Security/CWE/CWE-253/HResultBooleanConversion.ql

이러한 쿼리는 windows_recommended_partial.qls일부입니다.

ID 위치 일반적인 약점 열거형
cpp/paddingbyteinformationdisclosure microsoft/windows-drivers//<Version>microsoft/Likely Bugs/Boundary Violations/PaddingByteInformationDisclosure.ql 해당 없음
cpp/badoverflowguard microsoft/windows-drivers//<Version>microsoft/Likely Bugs/Conversion/BadOverflowGuard.ql 해당 없음
cpp/infiniteloop microsoft/windows-drivers//<Version>microsoft/Likely Bugs/Conversion/InfiniteLoop.ql 해당 없음
cpp/uninitializedptrfield microsoft/windows-drivers//<Version>microsoft/Likely Bugs/UninitializedPtrField.ql 해당 없음
cpp/use-after-free microsoft/windows-drivers//<Version>microsoft/Likely Bugs/Memory Management/UseAfterFree/UseAfterFree.ql 해당 없음
ID 위치 코드 분석 경고
cpp/weak-crypto/cng/hardcoded-iv /microsoft/windows-drivers//<Version>microsoft/Security/Crytpography/HardcodedIVCNG.ql 해당 없음

드라이버 - 일반

ID 위치 코드 분석 경고
cpp/drivers/ke-set-event-pageable /microsoft/windows-drivers/<Version>/drivers/general/queries/KeSetEventPageable/KeSetEventPageable.ql 연결된 CA 확인 없음
cpp/drivers/role-type-correctly-used /microsoft/windows-drivers//<Version>drivers/general/queries/RoleTypeCorrectlyUsed/RoleTypeCorrectlyUsed.ql 연결된 CA 확인 없음
cpp/drivers/extended-deprecated-api /microsoft/windows-drivers/<Version>/drivers/general/queries/ExtendedDeprecatedApis.ql C28719 경고, C28726 경고, C28735 경고, C28750 경고
cpp/drivers/irql-not-saved /microsoft/windows-drivers//<Version>drivers/general/queries/IrqlNotSaved/IrqlNotSaved.ql C28158 경고
cpp/drivers/irql-not-used /microsoft/windows-drivers//<Version>drivers/general/queries/IrqlNotUsed/IrqlNotUsed.ql C28157 경고
cpp/drivers/irql-set-too-high /microsoft/windows-drivers/<Version>/drivers/general/queries/IrqlTooHigh/IrqlTooHigh.ql C28150 경고
cpp/drivers/irql-too-low /microsoft/windows-drivers//<Version>drivers/general/queries/IrqlTooLow/IrqlTooLow.ql C28120 경고
cpp/drivers/irql-set-too-high /microsoft/windows-drivers/<Version>/drivers/general/queries/IrqlSetTooHigh/IrqlTooHigh.ql C28121 경고
cpp/drivers/irql-set-too-low /microsoft/windows-drivers/<Version>/drivers/general/queries/IrqlSetTooLow/IrqlSetTooLow.ql C28124 경고
cpp/drivers/pool-tag-integral /microsoft/windows-drivers//<Version>drivers/general/queries/PoolTagIntegral/PoolTagIntegral.ql C28134 경고
cpp/drivers/str-safe /microsoft/windows-drivers/<Version>/drivers/general/queries/StrSafe/StrSafe.ql C28146 경고

드라이버 - WDM

ID 위치 코드 분석 경고
cpp/drivers/illegal-field-access /microsoft/windows-drivers//<Version>drivers/wdm/queries/IllegalFieldAccess/IllegalFieldAccess.ql C28128 경고
cpp/drivers/illegal-field-access2 /microsoft/windows-drivers//<Version>drivers/wdm/queries/IllegalFieldAccess2/IllegalFieldAccess2.ql C28175 경고
cpp/drivers/illegal-field-write /microsoft/windows-drivers//<Version>drivers/wdm/queries/IllegalFieldWrite/IllegalFieldWrite.ql C28176 경고
cpp/drivers/opaque-mdl-use /microsoft/windows-drivers//<Version>drivers/wdm/queries/OpaqueMdlUse/OpaqueMdlUse.ql (연결된 CA 검사 없음)
cpp/drivers/opaque-mdl-write /microsoft/windows-drivers//<Version>drivers/wdm/queries/OpaqueMdlUse/OpaqueMdlWrite.ql C28145 경고
cpp/drivers/pending-status-error /microsoft/windows-drivers//<Version>drivers/wdm/queries/PendingStatusError/PendingStatusError.ql C28143 경고
cpp/drivers/wrong-dispatch-table-assignment /microsoft/windows-drivers//<Version>drivers/wdm/queries/WrongDispatchTableAssignment/WrongDispatchTableAssignment.ql C28169 경고

windows-driver-suites/windows_recommended_partial.qls 파일에는 이러한 권장 코드 쿼리가 포함되어 있습니다.

# Copyright (c) Microsoft Corporation.
# Licensed under the MIT license.

- description: Recommended and required queries for Windows Drivers.
- import: windows-driver-suites/windows_mustfix_partial.qls
- queries: .
  from: microsoft/windows-drivers
- include:
    query path: 
      - microsoft/Likely Bugs/Boundary Violations/PaddingByteInformationDisclosure.ql
      - microsoft/Likely Bugs/Conversion/BadOverflowGuard.ql
      - microsoft/Likely Bugs/Conversion/InfiniteLoop.ql
      - microsoft/Likely Bugs/Memory Management/UseAfterFree/UseAfterFree.ql
      - microsoft/Likely Bugs/UninitializedPtrField.ql
      - microsoft/Security/Crytpography/HardcodedIVCNG.ql
      - drivers/general/queries/KeSetEventPageable/KeSetEventPageable.ql
      - drivers/general/queries/RoleTypeCorrectlyUsed/RoleTypeCorrectlyUsed.ql
      - drivers/general/queries/DefaultPoolTag/DefaultPoolTag.ql
      - drivers/general/queries/ExaminedValue/ExaminedValue.ql
      - drivers/general/queries/ExtendedDeprecatedApis/ExtendedDeprecatedApis.ql
      - drivers/general/queries/IrqlNotSaved/IrqlNotSaved.ql
      - drivers/general/queries/IrqlNotUsed/IrqlNotUsed.ql
      - drivers/general/queries/IrqlTooHigh/IrqlTooHigh.ql
      - drivers/general/queries/IrqlTooLow/IrqlTooLow.ql
      - drivers/general/queries/IrqlSetTooHigh/IrqlTooHigh.ql
      - drivers/general/queries/IrqlSetTooLow/IrqlSetTooLow.ql
      - drivers/general/queries/PoolTagIntegral/PoolTagIntegral.ql
      - drivers/general/queries/StrSafe/StrSafe.ql
      - drivers/wdm/queries/IllegalFieldAccess/IllegalFieldAccess.ql
      - drivers/wdm/queries/IllegalFieldAccess2/IllegalFieldAccess2.ql
      - drivers/wdm/queries/IllegalFieldWrite/IllegalFieldWrite.ql
      - drivers/wdm/queries/OpaqueMdlUse/OpaqueMdlUse.ql
      - drivers/wdm/queries/OpaqueMdlUse/OpaqueMdlWrite.ql
      - drivers/wdm/queries/PendingStatusError/PendingStatusError.ql
      - drivers/wdm/queries/WrongDispatchTableAssignment/WrongDispatchTableAssignment.ql

FAQ(질문과 대답)

디바이스 인증에 필요한 경우는 언제인가요?

요구 사항 세부 정보는 Windows 하드웨어 호환성 프로그램 인증 프로세스를 참조하세요.

드라이버 소스 코드에서 CodeQL을 실행하도록 요구하는 동기는 무엇인가요?

드라이버 소스 코드에서 CodeQL을 실행하도록 요구하는 동기는 다음 두 가지 주요 이유로 요약할 수 있습니다.

  1. Windows 보안이 가장 중요하며, 드라이버 소스 코드에서 CodeQL을 실행하도록 요구하는 것은 Microsoft에서 인증을 받는 구성 요소의 보안을 개선하는 데 도움이 되는 한 단계입니다.
  2. Microsoft는 Microsoft에서 사용되는 것과 동일한 고품질 도구에서 하드웨어 에코시스템의 이점을 보장하기 위해 최선을 다하고 있으므로 Microsoft의 보안 엔지니어가 CodeQL 쿼리를 적극적으로 개발합니다.

CodeQL 및 정적 도구 로고 테스트는 어떤 유형의 드라이버에 적용됩니까?

현재 정적 도구 로고 테스트를 수행하려면 CodeQL을 실행하고 그래픽 드라이버를 제외한 모든 커널 모드 드라이버에 대해 전달된 "Must-Fix" 쿼리 집합이 필요합니다. 현재 필요하지는 않지만 그래픽 드라이버 에서 CodeQL을 실행하는 것이 좋습니다 . 일부 쿼리는 사용자 모드 구성 요소에서 유용한 결함을 찾을 수도 있습니다.

향후에는 그래픽 드라이버, 사용자 모드 드라이버 및 드라이버 구성 요소 및 기타 드라이버 패키지 구성 요소에 대한 결과가 필요하도록 테스트 및 해당 쿼리를 확장할 것으로 예상합니다. 그래픽 드라이버 또는 사용자 모드 드라이버에서 CodeQL을 실행하는 예기치 않은 동작 또는 가양성 문제가 발생하는 경우 Windows-Driver-Developer-Supplemental-Tools 리포지토리문제를 제출하세요.

드라이버 개발자를 위한 CodeQL 사용을 제어하는 라이선스는 무엇인가요?

WHCP 테스트를 위해 CodeQL을 사용할 수 있는 방법은 HLK(하드웨어 랩 키트) 최종 사용자 사용권 계약에 따라 허용됩니다. WHCP 참가자의 경우 HLK의 EULA는 GitHub의 CodeQL 사용 약관을 덮어씁니다. HLK EULA는 WHCP의 일부로 제출 및 인증할 드라이버를 분석하기 위한 일반 엔지니어링 프로세스의 일부로 자동화된 분석, CI 또는 CD 중에 CodeQL 을 사용할 수 있다고 명시하고 있습니다.

Visual Studio 또는 msbuild를 사용하여 CodeQL을 실행해야 하나요?

CodeQL 은 MSBuild 또는 Visual Studio를 사용할 필요가 없습니다. 지원되는 컴파일러 목록은 지원되는 언어 및 프레임워크를 참조하세요.

HLK는 내 드라이버가 CodeQL에서 검사되었는지 어떻게 확인하나요?

HLK의 정적 도구 로고 테스트는 이 요구 사항을 적용하는 테스트입니다. 정적 도구 로고 테스트에 대한 세부 정보는 MS Docs 페이지에서 찾을 수 있습니다.

CodeQL의 모든 결함이 실제 결함으로 보고되고 있나요?

모든 CodeQL 쿼리에는 다양한 수준의 정밀도가 있습니다. 우리의 목표는 거짓 긍정을 최소화하는 것이지만 때때로 발생합니다. 광범위한 테스트 결과 가양성이 거의 0이 되므로 WHCP 프로그램에서 사용하기 위해 "Must-Fix" 쿼리 제품군이 개발되고 직접 선택되었습니다. "Must-Fix" 쿼리 집합의 쿼리에서 가양성 표시가 표시되는 경우 즉시 이메일을 보내 stlogohelp@microsoft.com 거나 Windows-Driver-Developer-Supplemental-Tools 리포지토리문제를 제출하면 가능한 한 빨리 해결할 수 있도록 노력할 것입니다.

정적 도구 로고 테스트의 목적에 따라 쿼리의 "경고" 또는 "오류" 분류가 중요합니까?

쿼리는 CodeQL에서 "error" "warning" 및 "problem"와 같은 상태를 사용하여 분류되지만 이 분류는 Windows 하드웨어 호환성 프로그램 및 특히 정적 도구 로고 테스트에서 결과를 채점하는 방법과는 별개입니다. "Must-Fix" 제품군 내의 쿼리에서 결함이 있는 드라이버는 정적 도구 로고 테스트를 통과 하지 못하며 원시 쿼리 파일의 쿼리 분류(예: "경고")에 관계없이 인증되지 않습니다.

Visual Studio 솔루션에서 DVL을 생성할 수 있나요?

아니요, DVL 생성은 프로젝트 수준에서 실행되어야 하며 Visual Studio 솔루션에서 실행할 수 없습니다. DVL을 생성하는 방법에 대한 지침은 드라이버 확인 로그 만들기에서 찾을 수 있습니다.

msbuild 또는 Visual Studio 컨텍스트 외부에서 DVL(드라이버 확인 로그)을 생성할 수 있나요?

WDK(Windows 드라이버 키트) 및 eWDK(Enterprise WDK)의 일부로 Microsoft는 DVL(드라이버 확인 로그)을 생성하는 데 사용할 수 있는 dvl.exe라는 구성 요소를 제공합니다. WDK/eWDK 미리 보기 버전 21342 이상부터 드라이버 이름 및 아키텍처를 전달하여 msbuild 또는 Visual Studio 컨텍스트 외부의 명령줄에서 DVL을 생성할 수 있습니다. 자세한 내용은 드라이버 확인 로그 만들기를 참조하세요.

내 드라이버에서 CodeQL을 사용하는 방법에 대한 의견이나 질문이 있습니다. 어디에서 피드백을 보내나요?

에 대한 피드백 및 질문 stlogohelp@microsoft.com보내기