CodeQL이란?

완료됨

CodeQL은 개발자가 보안 검사를 자동화하고 보안 연구원이 변형 분석을 수행하는 데 사용하는 분석 엔진입니다.

CodeQL에서 코드는 데이터처럼 처리됩니다. 보안 취약성, 버그 및 기타 오류는 코드에서 추출된 데이터베이스에 대해 실행할 수 있는 쿼리로 모델링됩니다. GitHub 연구원 및 커뮤니티 기여자가 작성한 표준 CodeQL 쿼리를 실행하거나 사용자 지정 분석에 사용하도록 직접 작성할 수 있습니다. 잠재적 버그를 찾는 쿼리는 원본 파일에서 직접 결과를 강조 표시합니다.

이 단원에서는 CodeQL 정적 분석 도구가 무엇인지와 이 도구가 데이터베이스, 쿼리 모음, 쿼리 언어 팩을 사용하여 변형 분석을 수행하는 방법을 알아봅니다.

변형 분석

변형 분석은 알려진 보안 취약성을 시드로 사용하여 코드에서 유사한 문제를 찾는 프로세스입니다. 보안 엔지니어가 잠재적인 취약성을 식별하고 이러한 위협이 여러 코드베이스에서 제대로 해결되도록 하는 데 사용하는 기술입니다.

CodeQL을 사용하여 코드를 쿼리하는 것이 변형 분석을 수행하는 가장 효율적인 방법입니다. 표준 CodeQL 쿼리를 사용하여 시드 취약성을 식별하거나 사용자 지정 CodeQL 쿼리를 작성하여 새 취약성을 찾을 수 있습니다. 그런 다음 기존의 수동 방법으로는 누락되었을 수 있는 이 버그의 논리적 변형을 자동으로 찾아주는 쿼리를 개발하거나 반복할 수 있습니다.

CodeQL 데이터베이스

CodeQL 데이터베이스에는 특정 시점에 단일 언어에 대한 코드베이스에서 추출된 쿼리 가능한 데이터가 포함됩니다. 이 데이터베이스에는 추상 구문 트리, 데이터 흐름 그래프 및 제어 흐름 그래프의 표현을 포함하는 코드의 완전한 계층적 표현이 들어 있습니다.

각 언어에는 데이터베이스를 만드는 데 사용되는 관계를 정의하는 고유한 데이터베이스 스키마가 있습니다. 스키마는 추출 프로세스 중에 수행된 초기 어휘 분석과 CodeQL 쿼리 계산기의 복잡한 실제 분석 사이의 인터페이스를 제공합니다. 스키마는 일례로 모든 언어 구문에 대한 테이블이 있음을 지정합니다.

각 언어에 대해 CodeQL 라이브러리는 데이터베이스 테이블에 대한 추상화 계층을 제공하는 클래스를 정의합니다. 이를 통해 쿼리를 더 쉽게 작성할 수 있게 해 주는 개체 지향 데이터 보기가 제공됩니다.

예를 들어 Java 프로그램의 CodeQL 데이터베이스에서 두 가지 주요 테이블은 다음과 같습니다.

  • expressions 테이블: 빌드 프로세스에서 분석된 소스 코드의 모든 단일 식에 대한 행이 들어 있습니다.
  • statements 테이블: 빌드 프로세스에서 분석된 소스 코드의 모든 단일 문에 대한 행이 들어 있습니다.

CodeQL 라이브러리는 이러한 각 ExprStmt 테이블(및 관련 보조 테이블)에 대해 추상화 계층을 제공하는 클래스를 정의합니다.

쿼리 도구 모음

CodeQL 쿼리 도구 모음은 파일 이름, 메타데이터 속성 또는 디스크 또는 QL 팩의 위치에 따라 쿼리를 선택하는 방법을 제공합니다. CodeQL 분석에서 자주 사용하려는 쿼리에 대한 쿼리 그룹을 만듭니다.

쿼리 도구 모음을 사용하면 각 쿼리 파일의 경로를 개별적으로 지정하지 않고도 여러 쿼리를 CodeQL에 전달할 수 있습니다. 쿼리 도구 모음 정의는 .qls 확장이 있는 YAML 파일에 저장됩니다. 도구 모음 정의는 명령으로 이루어진 시퀀스입니다. 여기서 각 명령은(일반적으로) 단일 키를 갖는 YAML 매핑입니다. 명령은 쿼리 도구 모음 정의에 표시되는 순서대로 실행됩니다. 도구 모음 정의의 모든 명령이 실행된 후에는 선택한 쿼리 집합이 생성됩니다.

기본 쿼리 도구 모음

CodeQL에는 두 가지 기본 제공 쿼리 모음이 있습니다.

  • default: GitHub의 CodeQL 코드 검사에서 기본적으로 실행되는 쿼리로, 코드 검사의 기본 설정과 함께 사용할 수 있습니다. 이 쿼리 모음의 쿼리는 매우 정확하며 몇 가지 가양성 코드 검사 결과를 반환합니다. security-extended 쿼리 모음에 비해 default 모음은 신뢰도가 낮은 코드 검사 결과를 더 적게 반환합니다.
  • security-extended: 이 모음에는 default 모음의 모든 쿼리와 약간 낮은 정밀도 및 심각도의 추가 보안 쿼리가 포함되어 있습니다. 코드 검색의 기본 설정에서 사용할 수 있으며 쿼리 도구 모음 드롭다운에서 "확장" 옵션으로 나열됩니다. default 쿼리 모음에 비해 이 모음은 더 많은 수의 오탐 코드 검사 결과를 반환할 수 있습니다.

코드 검사의 기본 설정은 default 쿼리 모음을 사용합니다. 코드QL 구성을 보려면 오버플로 아이콘을 선택한 다음 편집 단추로 선택하여 변경할 수 있습니다. "검색 설정"에서 쿼리 도구 모음으로 요약된 두 가지 옵션 중 하나를 선택할 수 있습니다.

CodeQL 패키지

CodeQL 팩은 CodeQL 분석에서 사용되는 파일을 구성하는 데 사용되어 CodeQL 쿼리 및 라이브러리를 쉽게 만들고, 공유하고, 사용하고, 실행할 수 있도록 합니다. 여기에는 쿼리, 라이브러리 파일, 쿼리 도구 모음 및 중요한 메타데이터가 포함됩니다. CodeQL 팩과 CodeQL CLI의 패키지 관리 명령을 사용하면 사용자 지정 쿼리를 게시하고 이를 코드베이스 분석에 통합할 수 있습니다.

CodeQL 팩에는 세 가지 유형, 즉 쿼리 팩, 라이브러리 팩, 모델 팩이 있습니다.

  • 쿼리 팩은 실행되도록 설계되었습니다. 쿼리 팩이 게시되면 번들에 쿼리 원본 외에도 각 쿼리의 모든 전이적 종속성과 미리 컴파일된 표현이 포함됩니다. 이렇게 하면 팩에서 쿼리를 일관되고 효율적으로 실행할 수 있습니다.
  • 라이브러리 팩은 쿼리 팩(또는 다른 라이브러리 팩)에서 사용하도록 설계되었으며 쿼리 자체를 포함하지 않습니다. 라이브러리는 별도로 컴파일되지 않습니다.
  • 모델 팩을 사용하여 코드 검색 분석을 확장하여 기본적으로 지원되지 않는 종속성을 포함할 수 있습니다. 모델 팩은 현재 베타 버전이며 변경될 수 있습니다. 베타 중에는 리포지토리 수준에서 Java 분석에 모델 팩을 사용할 수 있습니다. 고유한 모델 팩을 만드는 방법에 대한 자세한 내용은 "CodeQL 모델 팩 만들기"를 참조하세요.

CodeQL 팩 구조

CodeQL CLI는 pack init 명령을 사용하여 팩을 개발하고 게시할 수 있습니다. 이 명령은 루트 디렉터리에 있는 qlpack.yml라는 기본 파일을 포함하여 필요한 디렉터리 구조와 파일을 생성합니다. 각 qlpack.yml 파일의 메타데이터는 CodeQL에 팩의 쿼리를 컴파일하는 방법, 팩이 사용하는 라이브러리, 쿼리 모음 정의를 찾을 수 있는 위치를 알려줍니다.

CodeQL 팩의 콘텐츠(CodeQL 분석에 사용되는 쿼리 또는 라이브러리)는 qlpack.yml과 동일한 디렉터리 또는 해당 하위 디렉터리에 포함되어 있습니다.

qlpack.yml 파일이 포함된 디렉터리가 CodeQL 팩의 콘텐츠에 대한 루트 디렉터리 역할을 합니다. 즉, 팩의 모든 .ql 파일과 .qll파일에 대해 CodeQL은 팩의 루트에 있는 qlpack.yml 파일이 포함된 디렉터리를 기준으로 모든 가져오기 문을 확인합니다.

qlpack.yml 파일의 예는 다음과 같습니다.

name: codeql/java-queries
version: 0.0.6-dev
groups: java
suites: codeql-suites
extractor: java
defaultSuiteFile: codeql-suites/java-code-scanning.qls
dependencies:
    codeql/java-all: "*"
    codeql/suite-helpers: "*"

고유한 CodeQL 팩을 만들고 게시하는 방법에 대한 자세한 내용은 "CodeQL 팩 게시 및 사용"을 참조하세요.[1]