CodeQL

#1 CodeQL - Hello, CodeQL

geunyeong 2021. 6. 12. 22:04

Abstract

CodeQL은 LGTM이 개발한 코드 스캐닝 도구다. 소스코드를 대상으로 데이터베이스를 구축하고 해당 데이터베이스에 쿼리하는 형태로 구성되며, 변수나 함수, 클래스 선언부는 물론 변수에 할당된 값의 흐름까지도 추적할 수 있다. CodeQL은 github계정의 codeql 레포지토리에 공개되어있다.

https://github.com/github/codeql

Hello, CodeQL

CodeQL을 개발한 LGTM 사이트에서 CodeQL 쿼리를 직접 실행할 수 있는 웹 쿼리 콘솔을 제공한다. 깃허브에 업로드한 자신의 프로젝트나 공개된 다른 사람의 깃허브 프로젝트를 대상으로 CodeQL을 실행할 수 있다. 프로젝트 하나 뿐만 아니라 여러 개의 프로젝트를 대상으로도 가능하다. 본 글에서는 깃허브에 공개되어 있는 프로젝트 하나를 대상으로 Query console에서의 CodeQL 사용법을 살펴보겠다.

 

LGTM CodeQL 웹 쿼리 콘솔

 

처음 Query console 페이지에 들어가면 보이는 화면이다. 가운데 Query 입력창이 CodeQL 쿼리를 작성하는 영역이고, 우측 위에 "Select a language"에서는 쿼리할 언어(C/C++, C# 등)를 지정하며 Project에서는 쿼리를 실행할 대상 프로젝트를 지정한다. 순서는 다음과 같다.

  1. 쿼리할 언어를 선택한다. (C/C++, C#, GO, Java, Javascript, Python)
  2. 코드를 스캔할 프로젝트를 선택한다. (깃헙 주소로도 가능)
  3. CodeQL 쿼리를 작성하고 실행한다.

 

먼저 쿼리할 언어를 선택한다. 스캔할 대상 프로젝트가 C로 이루어져 있기 때문에 언어는 C/C++을 선택했다. 언어를 선택하면 쿼리 작성 영역이 활성화되며 기본 쿼리문(hello world)이 제공된다.

 

 

프로젝트를 선택하려하면 기본적으로 torvalds/linux와 fish-shell/fish-shell이 제공될 것이다. 이는 단순히 쿼리 테스트 용으로 쓰라고 보여주는 건데, 소스코드 양이 워낙에 많다보니 스캔에 시간이 많이 걸린다. 내가 원하는 프로젝트를 스캔하고 싶다면 "Your projects"에서 "My projects"를 클릭해 스캔하고자 하는 프로젝트를 추가한다.

 

 

"My projects"를 클릭하면 프로젝트 링크를 입력하는 입력창이 나온다. 이 입력창에 깃 주소를 입력하고 Follow를 클릭한다.

 

 

깃허브에 공개된 프로젝트가 추가된 것을 볼 수 있다.

 

 

다시 Query console로 돌아가 프로젝트를 선택하면 깃 주소로 추가한 프로젝트를 볼 수 있다. 해당 프로젝트를 선택한다.

 

 

프로젝트 추가가 완료되면 CodeQL 쿼리를 작성한다. 그림 속 코드는 함수 이름이 sum인 함수의 선언 코드를 찾으라는 뜻이다. Run을 클릭해 실행하면 쿼리를 컴파일하고 대상 프로젝트에서 쿼리에 부합되는 코드를 찾아 보여준다. CodeQL의 Function 클래스에 대한 내용은 여기를 참조하길 바란다.

 

 

쿼리 수행 중에는 현재 코드를 스캔중인 프로젝트와 진행 상태를 보여준다. 쿼리 수행이 끝나면 어떤 프로젝트의 어떤 소스코드에서 쿼리에 부합되는 내용을 찾았는지 보여준다. 위 그림에서는 sum이라는 함수가 sum.cpp의 3번째 줄에 존재한다는 의미다.

 

 

쿼리 수행 결과를 클릭해보면 소스코드와 그 함수를 볼 수 있다.

Close

이상으로 LGTM Query console 사용법과 CodeQL 간단 쿼리 작성법을 살펴봤다. 앞으로 CodeQL CLI와 CodeQL for VS Code도 공부하여 포스팅하도록 하겠다.