CodeQL은 개발자가 Windows 드라이버 소스 코드에서 보안 취약성 및 코드 위반을 식별하는 데 도움이 되는 강력한 정적 분석 엔진입니다. 이 문서에서는 CodeQL 분석을 사용하여 Windows WHCP(하드웨어 호환성 프로그램) 인증용 드라이버 확인 파일을 만드는 방법을 설명합니다.
이 글에서 당신은 다음을 하게 됩니다.
- 적절한 CodeQL 버전을 설치합니다.
- 필요한 CodeQL 패키지 및 쿼리 제품군을 설치합니다.
- CodeQL을 실행하여 데이터베이스를 빌드하고 코드를 분석합니다.
- 드라이버 확인 파일을 빌드합니다.
드라이버에 적합한 CodeQL 버전 선택
비고
VS(Visual Studio) 17.8은 WHCP_21H2 및 WHCP_22H2 분기에 사용된 이전 버전의 CodeQL과의 호환성을 끊습니다. CodeQL CLI 버전 2.15.4는 Visual Studio 17.8 이상에서 WHCP 21H2 및 WHCP 22H2와 함께 사용할 수 있는지 확인합니다. Visual Studio 17.7 이하 버전을 사용하는 경우 버전 2.4.6 또는 버전 2.6.3을 사용합니다. WHCP 프로그램의 경우 인증하는 CodeQL CLI 버전 및 Windows 릴리스(버전 2.4.6, 버전 2.6.3 또는 버전 2.15.4)를 사용합니다. 주 브랜치에서 일반적으로 사용하려면 CodeQL CLI 버전 2.15.4를 사용하십시오.
시나리오에 대한 탭을 선택합니다.
이 매트릭스를 사용하여 다운로드할 버전을 결정합니다.
Windows 릴리스 | CodeQL CLI 버전 | microsoft/windows-drivers CodeQL 패키지 버전 | codeql/cpp-queries CodeQL 패키지 버전 | 사용할 브랜치 |
---|---|---|---|---|
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 |
비고
V2.7.0 이후 버전의 CodeQL은 CodeQL 팩을 지원하므로 CodeQL CLI 2.4.6 및 2.6.3에 대해 CodeQL 팩 버전이 지정되지 않았습니다.
CodeQL 다운로드 및 설치
CodeQL을 포함할 디렉터리를 만듭니다. 이 예제에서는
C:\codeql-home\
C:\> mkdir C:\codeql-home
Microsoft 드라이버 쿼리의 원하는 분기에 따라 사용할 CodeQL CLI 버전을 선택하려면 이전 표를 참조하세요. WHCP 프로그램의 일부로 분석을 수행하는 경우 Windows 하드웨어 호환성 프로그램 사용 테이블을 참조하고, 그렇지 않으면 기본 분기 및 2.15.4를 사용합니다. 다른 버전을 사용하면 데이터베이스가 라이브러리와 호환되지 않을 수 있습니다.
이전 테이블과 연결된 CodeQL CLI 이진 파일 릴리스로 이동하고 프로젝트의 아키텍처에 따라 zip 파일을 다운로드합니다. 예를 들어 64비트 Windows codeql-win64.zip.
Codeql CLI 디렉터리를 방금 만든 디렉터리(예: *C:\codeql-home\codeql*)로 추출합니다.
버전을 확인하여 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'.
CodeQL 도움말 사용
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 명령< --help를 >실행합니다. 다음은 그 예입니다.
codeql create --help
하위 명령에 대한 도움말을 보려면 계층적으로 나열합니다(예: ).
codeql create language --help
CodeQL 패키지 설치
빌드 환경의 탭을 선택합니다.
WHCP_21H2 또는 WHCP_22H2 및 CodeQL CLI 버전 2.15.4에서 Visual Studio 2022 17.8 이상 버전을 사용하는 경우 이 절차를 사용합니다.
비고
이전 버전의 CodeQL로 CodeQL 테스트를 실행한 경우 복제된 리포지토리의 이전 버전이 여전히 있는 경우 이전 CodeQL 하위 모듈을 제거해야 합니다. CodeQL은 기본적으로 하위 모듈의 쿼리를 사용하려고 할 수 있으며, 이로 인해 버전이 일치하지 않아 오류가 발생할 수 있습니다.
CodeQL 쿼리 패키지 다운로드
CodeQL은 버전 2.7.0에서 CodeQL 패키지(CodeQL 팩 또는 쿼리 팩)를 도입하여 인증을 위해 쿼리를 사용하기 위해 Windows-Driver-Developer-Supplemental-Tools 리포지토리를 복제할 필요가 없습니다.
비고
이 옵션은 분석 프로세스를 실행할 때 나중에 필요한 쿼리를 다운로드하므로 1 --download
단계를 건너뛸 수 있습니다.
-
Windows 하드웨어 호환성 프로그램 사용 테이블에서 올바른 버전의 Microsoft/windows 드라이버 팩을 다운로드합니다.
@<version>
다음 명령에서 지정합니다.
C:\codeql-home\> codeql pack download microsoft/windows-drivers@<version>
예를 들어 WHCP_24H2 사용하는 경우 다음 명령을 실행하여 1.1.0 windows 드라이버 쿼리 팩을 다운로드합니다.
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
CodeQL은 쿼리 팩을 기본 디렉터리에 설치합니다.
C:\Users\<current user>\.codeql\packages\microsoft\windows-drivers\<downloaded version>\
중요합니다
설치 디렉터리를 변경하거나 설치된 쿼리 팩을 이동하지 마세요.
Windows 드라이버 쿼리 도구 모음 다운로드
Microsoft는 엔드 투 엔드 드라이버 개발자 워크플로를 간소화하는 두 개의 쿼리 제품군을 제공합니다. windows_driver_recommended.qls 제품군은 Microsoft가 드라이버 개발자에게 유용하다고 판단하는 모든 쿼리의 상위 집합이며, windows_driver_mustfix.qls 제품군에는 WHCP 인증을 위해 "반드시 수정해야 함"으로 간주되는 쿼리가 포함되어 있습니다. 정적 도구 로고 테스트를 통과하려면 windows_driver_mustfix.qls를 실행하고 통과해야 합니다.
두 쿼리 도구 모음 파일을 로컬 PC로 https://github.com/microsoft/Windows-Driver-Developer-Supplemental-Tools/tree/main/suites 복사합니다.
- windows_driver_recommended.qls
- windows_driver_mustfix.qls
쿼리 도구 모음의 내용에 대한 자세한 내용은 CodeQL 쿼리 및 제품군을 참조하세요.
CodeQL 데이터베이스 빌드
이러한 예제에서는 Windows 개발 환경을 사용하고 설치 위치가 C:\codeql-home이라고 가정하지만 사용자에게 적합한 설정을 사용할 수 있습니다. 지원되는 컴파일러 목록은 CodeQL 지원 언어 및 프레임워크 를 참조하세요.
만든 데이터베이스를 배치하는 CodeQL에 대한 디렉터리를 만듭니다. 예: C:\codeql-home\databases
mkdir C:\codeql-home\databases
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 데이터베이스 만들기 또는 CodeQL 도움말 사용을 참조하세요.
분석 수행
이 시점에서 데이터베이스 만들기가 완료되고 다음 단계는 드라이버 소스 코드에 대한 실제 분석을 수행하는 것입니다.
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 데이터베이스 분석 또는 CodeQL도움말 사용을 참조하세요.
결과 보기 및 해석
이 섹션은 다음 단계에 필요한 대로 SARIF 형식에 초점을 맞출 것입니다. 단, CSV 형식을 사용하는 것이 더 나은 경우 사용할 수 있습니다.
SARIF(정적 분석 결과 교환 형식)는 정적 분석 결과를 공유하는 데 사용되는 JSON 형식 형식입니다. OASIS SARIF(정적 분석 결과 교환 형식)의 표준, CodeQL에서 SARIF 출력을 사용하는 방법 및 스키마 json에 대해 자세히 알아보세요.
개체를 수동으로 정렬하는 것을 포함하여 분석 결과를 해석하는 여러 가지 방법이 있습니다. 다음은 사용하는 몇 가지 사항입니다.
Microsoft Sarif Viewer(웹)에는 SARIF 파일을 뷰어로 끌어서 놓은 다음 규칙에 따라 분류된 결과를 표시할 수 있는 기능이 있습니다. 이는 위반 횟수 또는 위반이 있는 쿼리를 확인하는 매우 빠르고 쉬운 방법이지만 줄 번호 외에 소스 코드 정보를 찾기가 쉽지 않습니다. 위반이 없으면 페이지가 업데이트되지 않습니다.
Visual Studio용 Microsoft SARIF 뷰어는 결과에서 소스 코드로 원활하게 전환할 수 있도록 Visual Studio 내에서 결과를 표시하는 데 적합합니다.
Visual Studio Code용 SARIF 확장은 미리 보기 창을 열고 CodeQL에서 보고한 오류, 경고 또는 문제를 표시합니다. Sarif 파일을 읽을 수 있는 형식으로 표시하려면 Visual Studio Code에서 파일을 열고 Shift-Alt-F를 선택합니다.
SARIF 파일의 가장 중요한 섹션은 개체 내 Results
의 Run
속성입니다. 각 쿼리에는 검색된 위반 및 발생한 위치에 대한 세부 정보가 포함된 Results 속성이 있습니다. 위반이 없으면 속성 값이 비게 됩니다.
쿼리는 오류, 경고 및 문제와 같은 상태를 사용하여 분류됩니다. 그러나 이 분류는 Windows 하드웨어 호환성 프로그램 및 정적 도구 로고 테스트가 결과를 채점하는 방식과는 별개입니다. Must-Fix 제품군 내의 쿼리에서 결함이 있는 드라이버는 정적 도구 로고 테스트를 통과하지 못하며 원시 쿼리 파일의 쿼리 분류(예: 경고)에 관계없이 인증되지 않습니다.
SARIF를 DVL(드라이버 확인 로그 형식)으로 변환
정적 도구 로고 테스트는 드라이버 소스 코드에서 실행하는 CodeQL 정적 분석의 컴파일된 결과인 DVL(드라이버 확인 로그)을 구문 분석합니다. SARIF 파일을 DVL 형식으로 변환하는 세 가지 방법이 있습니다. Visual Studio, MSBuild 또는 dvl.exe 도구를 사용하여 명령줄에서. 전체 단계는 드라이버 확인 로그 만들기를 참조하세요.
정적 도구 로고 HLK 테스트에 대한 추가 지침 및 DVL 파일을 배치할 위치에 대한 지침은 정적 도구 로고 테스트 실행에서 찾을 수 있습니다.
문제 해결
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'.
데이터베이스 업그레이드 명령은 데이터베이스를 업데이트합니다. 이는 단방향 업그레이드이며 되돌릴 수 없다는 점에 유의하세요. 자세한 내용은 데이터베이스 업그레이드를 참조하세요.
선택적 절차
필요에 따라 CodeQL 결과를 표시하지 않거나 빌드 및 분석 프로시저를 Visual Studio에서 빌드 후 이벤트로 실행할 수 있습니다.
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 파일에는 결과가 표시되지 않은 데이터가 포함되며 대부분의 결과 뷰어는 기본적으로 결과를 표시하지 않습니다.
Visual Studio 빌드 후 이벤트
Visual Studio를 사용하여 드라이버를 빌드하는 경우 빌드 후 이벤트로 실행되도록 CodeQL 쿼리를 구성할 수 있습니다.
이 예제에서는 작은 일괄 처리 파일이 대상 위치에 만들어지고 빌드 후 이벤트로 호출됩니다. Visual Studio C++ 빌드 이벤트에 대한 자세한 내용은 빌드 이벤트 지정을 참조하세요.
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" "<path to query suite .qls file>" --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
devenv.exe/편집 옵션은 배치 파일에서 기존 Visual Studio 인스턴스에서 SARIF 결과 파일을 여는 데 사용됩니다. SARIF 결과를 보려면 Visual Studio용 Microsoft SARIF 뷰어를 설치하고 자세한 내용은 해당 지침을 참조하세요.
드라이버 프로젝트에서 프로젝트 속성으로 이동합니다. 구성 풀다운에서 CodeQL로 확인하려는 빌드 구성을 선택합니다. 릴리스를 사용하는 것이 좋습니다. CodeQL 데이터베이스를 만들고 쿼리를 실행하는 데 몇 분 정도 걸리므로 프로젝트의 디버그 구성에서 CodeQL을 실행하지 않는 것이 좋습니다.
드라이버 프로젝트 속성에서 빌드 이벤트 및 빌드 후 이벤트를 선택합니다.
배치 파일의 경로와 빌드 후 이벤트에 대한 설명을 제공합니다.
일괄 처리 파일 결과는 빌드 출력의 끝에 표시됩니다.
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 <<<"