GitHubは、機械学習技術をルールベースのセキュリティコードスキャン機能に適用し、既存のルールから新しいルールを自動的に推測することで、あまり一般的ではない脆弱性パターンにその機能を拡張できることを期待している。
GitHubコードスキャンは、慎重に定義されたCodeQL分析ルールを使って、ソースコードに潜む潜在的なセキュリティの脆弱性を特定する。
安全でないユーザデータが危険な場所に置かれる状況を検出するために、CodeQLクエリは、ユーザデータの潜在的なソース(Webフレームワークなど)の知識と共に、潜在的に危険なシンク(SQLクエリを実行するためのライブラリなど)をカプセル化しています。
これらのルールを手動で作成することは、セキュリティの専門家が既存のライブラリとプライベートコードを分析して既存の脆弱性パターンを特定することが必要となるタスクである。既存のライブラリの数が非常に多いため、これは明らかに気が遠くなるような作業である。機械学習は、多数のサンプルに基づいて脆弱なコードを認識するようにモデルをトレーニングできるようにすることで、役立つ可能性があるとGitHubは言っている。
GitHubの実験に基づいて、専門家が各コードスニペットに脆弱か安全かのラベル付けしている教師あり学習の方が、教師なし学習よりもうまく機能することがわかった。ただし、GitHubは、専門家に数百万のスニペットにラベルを付けるように依頼する代わりに、既存のCodeQLルールを、特定のコードスニペットが安全かどうかを判断するグラウンドトゥルースオラクルとして活用している。GitHubによると、これによって、10万を超える公開リポジトリから数千万のコードスニペットにわずかな労力で自動的にラベル付けすることができる。結果のデータは、予測モデルを構築するためのトレーニングセットとして使われる。
このモデルが、オラクルとして使用されるCodeQLルールによってすでにキャプチャされている脆弱性だけでなく、実際に新しい脆弱性を予測できるかどうかを評価できるようにするために、GitHubは巧みなソリューションも考案した。ここでは、古いCodeQLルールのセットを使って生成されたラベルでモデルをトレーニングし、新しいCodeQLルールのセットによって検出された脆弱性に対してテストが実施される。新しいルールセットによって正しく検出される脆弱性の数を増えると仮定すると、このアプローチでは、予測モデルが古いルールセットにまだ含まれていない脆弱性を検出できるように効果的に学習したかどうかを実際に示すことができる。
プロセス全体の重要な側面は、GitHubがコードスニペットの特徴を識別する方法にある。ここでも、GitHubは豊富な情報をカプセル化するCodeQLルールの力を活用している。したがって、NLP手法を使ってコードをテキストとして扱う代わりに、GitHubは、アクセスパス、API名、関数にネストされた関数の本体といった特徴を識別できる。さらにGitHubは、明らかに意味のある特徴に加えて、潜在的に興味深い特徴を探索できる。それは、関数呼び出しの引数インデックスなど、人が見たときにははっきりと有用とはわからないものである。
トレーニングデータから語彙を生成し、語彙のインデックスリストを非常に単純な深層学習分類器にフィードします。この分類器は、特徴ごとのいくつかの処理レイヤーと、それに続く特徴間の連結と、組み合わせた処理のいくつかのレイヤーを持ちます。
予測時に、コードスニペットはCodeQLを使って一連の特徴に変換され、次に、特定のコードスニペットが脆弱性を表す確率を返すために、MLモデルに送信される。
MLベースのコードスキャンの現在の実装は、JavaScriptとTypeScriptにおいて数多くの最も一般的な脆弱性に焦点を当てている。それには、クロスサイトスクリプティング(CWE-79)、パスインジェクション(CWE-22、CWE-23、CWE-36、CWE-73、CWE-99)、NoSQLインジェクション(CWE-943)、SQLインジェクション(CWE-89)が含まれる。現在のデータをベースにすると、GitHubによると、メトリックはクエリによって異なり、リコールは約80%で、精度は約60%となる。
この新機能は実験的に利用でき、GitHubアクションと統合できる。