CodeQLを使ってみる

CodeQL入門

はじめに

この記事は最近知ったCodeQLを使ってみるというものです。CodeQLはGitHubがSemmleという会社を買収したという時に知りました。

少し面白そうだなと思ったのでメモとして残します。

CodeQL

CodeQLは、qlというクエリ言語を使用してソースコードを静的に解析できるものらしいです。脆弱性などを見つけるのに便利そうですね。現時点で複数の言語に対応していました。

CodeQLの使い方を見るとクエリを投げるまでにいくつかのステップ分かれているので下記で順に説明していきます。

CodeQL CLIのセットアップ

ローカルで使用するためにはCodeQLのcliをインストールする必要があるのでインストールします。

$ wget https://github.com/github/codeql-cli-binaries/releases/latest/download/codeql.zip

インストールしたら任意のディレクトリでunzipしてください。unzipしたディレクトリに存在するcodeqlを実行できれば成功です。適宜pathを通すなどをしてください。

$codeql --version                                                                                                2145ms
CodeQL command-line toolchain.
Version: 2.0.0.
Copyright (C) 2019 GitHub, Inc.
(snip)

databaseの作成

次はソースコードからdatabaseを作成します。このdatabaseがクエリを投げる対象になります。

databaseを用意する方法は2通りあるらしく、自分で作成する方法、または https://lgtm.com/から任意のリポジトリ用のdatabaseをダウンロードする方法となっているようです。ここでは自分でdatabaseを作成してみます。まずは解析したいリポジトリをcloneします。

$ git clone https://github.com/m-y-mo/struts_9805

cloneしたら次のコマンドでdatabaseを作成します。

$ codeql database create ./struts_db -s ./struts_9805 \
-j 0 -l java --command "mvn -B -DskipTests \
-DskipAssembly"

上記のコマンドはmavenを使用しているので、インストールをしていないと失敗するのであらかじめインストールしておいてください。コマンドが成功するとstruts_dbというものが作成され、それが今回作成したdatabaseとなります。ちなみに結構時間がかかるので、気長に待っていてください。

先ほど作成したdatabaseのディレクトリ構成は以下になります。

$ cd struts_db
$ ls
codeql-database.yml* db-java/ log/ src.zip* working

クエリの実行

それではdatabaseを作成したので、さっそくクエリを投げたいと思います。まずはqlをcloneします。

$ git clone https://github.com/Semmle/ql.git

cloneができたら以下のコマンドでクエリを実行。

$ codeql analyze struts_db \
./ql/java/ql/src/Security/CWE/CWE-502/UnsafeDeserialization.ql \
--format=csv --output=java-analysis/result.csv

今回実行したクエリはとくに意味もなく選んでいます。クエリを指定するときは作成したdatabaseに対応する言語のディレクトリ配下に存在するものを指定します。

こちらも少し時間がかかります。outputで指定したファイルに結果が書き込まれています。今回解析対象に使用したリポジトリは こちらで紹介されていますので、検知した結果を公開してもいいような気がしますが、怖いのでここは実際に試してみて確認してください。

$ bat java-analysis/result.csv
(snip)

おわりに

今回はCodeQLを簡単に使用しただけなので、次はやられサイトに対して検証できたらと思っています。最近はDevSecOpsにも興味がでてきたのでCodeQLをもう少し調べてみようかな。

Software Engineer

Software Engineer