スタートアップSemmleの買収により、GitHubは継続的統合/継続的デプロイサービスの一部として、継続的な脆弱性検出を行うことを目指している。
GitHub CEOのNat Friedman氏は買収の発表として次のように書いている:
Semmleの革新的なセマンティックコード分析エンジンは、開発者がクエリを書くことで、大規模なコードベースのコードパターンの識別と、脆弱性とバリアントの検索できるようになります。
Semmleはソフトウェア・システムの脆弱性を識別するための継続的なコード分析プラットフォームとしてLGTMを作成した。LGTMの中心は、セキュリティ脆弱性を探して絶滅させるためのクエリ言語とコード検索エンジンであるSemmle QLである。
QLはセキュリティエンジニアが検索プロセスのはじめとして既知の脆弱性から脆弱性を識別するために常用するバリアント分析を使用する。言い換えれば、(ペンテストや他のテクニックで)一度脆弱性を識別したら、セキュリティ研究者は残りのコードベースを検査して、同様の問題を検出する。QLは、開発者が共有できて、再利用できるクエリを書ける、自動化して複数のコードベースを横断したプロセスである。Semmleによると、彼らのソリューションはオープンソースプロジェクトにおける100以上のVCEを含む数千の脆弱性を識別するために使用されている。
Semmle分析エンジンの重要な機能の1つは、正規表現を使ったテキストの操作ではなく、ASTレベルでコードをデータとして処理することである。 これは引数に配列を渡して繰り返し処理しており、各呼び出しで十分な長さの配列が渡されているC関数を分析する例である:
import cpp
from Function f, FunctionCall c, int i, int a, int b
where f = c.getTarget()
and a = c.getArgument(i).getType().(ArrayType).getArraySize()
and b = f.getParameter(i).getType().(ArrayType).getArraySize()
and a < b
select c.getArgument(i), "Array of size " + a
+ " passed to $@, which expects an array of size " + b + ".",
f, f.getName()
上記のコードではf
は関数で、c
は関数呼び出し、i
は引数の繰り返しに使われる整数で、a
とb
は期待される配列サイズと実際の配列サイズを保存するために使われている。以下のコードは、クラス内の全てのpublicフィールドがfinalとして宣言されていることを確認している:
from Field f
where f.hasModifier("public")
and
not(f.hasModifier("final"))
select f.getDeclaringType().getPackage(),
f.getDeclaringType(),
f
ご覧の通りQL構文は宣言的でありSQLに似ており、オブジェクト指向である。Semmleは現在、CとC++, C#, COBOL, Java, JavaScript, TypeScript, Pythonをサポートしている。Goはまもなくサポートする。
Semmle QLは新しいい製品ではなく、Uber, NASA, Microsoft, Googleを含む多くの大企業で使われているとSemmleは話す。これはQLクエリの巨大なライブラリの構築に貢献している。Semmleによると、開発者は数千ものオープンソースクエリを再利用して、新しいpull requestを送信するたびに彼らのCI自動化パイプラインの一部として実行できる。
現在Semmle QLはGitHubアカウントを接続してLGTM経由で利用できるが、GitHubはGitHub Actionsを通じてCI/CDサービスの一部として統合を計画している。