[GitHub] code scanning(CodeQL)を使用したコード分析を試してみた

2023.04.27

こんにちは、CX事業本部 Delivery部の若槻です。

code scanning は、GitHub リポジトリ内のコードを分析して、セキュリティの脆弱性とコーディングエラーを検出ことができる機能です。

この code scanning をなんだかんだで触ってこなかったので、今回実際に試してみました。

code scanning の課金と利用条件

code scanning は GitHub Actison で動作するため、スキャン実行ごとに GitHub Actison の実行料金が発生します。

また、利用できるリポジトリの利用条件は下記の通りとなります。

  • GitHub.com のすべてのパブリックリポジトリ
  • GitHub Enterprise Cloud を使用していて GitHub Advanced Security のライセンスを持つ Organization によって所有されるプライベート リポジトリ

code scanning に使用される CodeQL とは

CodeQL は、code scanning でセキュリティチェックを自動化するために GitHub が開発したコード分析エンジンです。 CodeQL を使用してコードを分析し、結果を code scanning アラートとして表示することができます。code scanning で既定で使用されます。

CodeQL では現在下記の言語で記述されたコードの解析が可能です。

  • C/C++
  • C#
  • Go
  • Java
  • Kotlin(Beta)
  • JavaScript/TypeScript
  • Python
  • Ruby

サポートされていない言語のコードがリポジトリに含まれている場合は、後述の設定メニューで下記のようになり code scanning は有効化できません。

Languages on this repository are not compatible with this feature.

ちなみに今回は試しませんが、CodeQL の他にもサードパーティのコード分析エンジンを code scanning で使用することも可能です。

試してみた

設定、初回スキャン

次のクロスサイトスクリプティング(XSS)の脆弱性のある JavaScript コードサンプルを使用します。このサンプルでは、ユーザーからの入力(req.query.comment)をサニタイズせずに HTML に埋め込んでいます。これにより、悪意のあるスクリプトを埋め込むことができ、XSS 攻撃が可能になります。

client.js

const express = require('express');
const app = express();

app.get('/', (req, res) => {
  const userComment = req.query.comment || '';
  res.send(`<html><body><h1>User comment: ${userComment}</h1></body></html>`);
});

app.listen(3000, () => {
  console.log('Server listening on port 3000');
});

このサンプルを GitHub リポジトリにプッシュします。

code scanning の構成メニューは、[Settings > Security > Code security and analysis > Code scanning] よりアクセスできます。

[Set up]をクリックすると、Default または Advanced を選択できます。今回は Default を選択してみます。

[CodeQL default configuration] ダイアログが表示されます。分析される言語として JavaScript が検出されており、またスキャンが行われるイベントは「プッシュ時」および「main ブランチへのプルリクエスト」となっています。[Enable codeQL] をクリックして、code scanning を有効にします。

構成が開始されました。

1分ほど待つと構成が完了し、初回スキャンが行われました。

アラートの確認

[Security > Vulnerability alerts > Code scanning] を見ると、アラートが1つオープンしていますね。開いてみます。

XSS の脆弱性が検出され、ユーザー入力を適切にサニタイズする必要がある旨が示されています。

また [Show more] をクリックして開くと、ただ修正例が示されるだけでなく良い修正例と悪い修正例が示されており、また OWASP や CWE などの参考リンクも示されています。

アラートページ右上部の [Dismiss alert] をクリックすると、「Won't fix(修正しない)」「False positive(偽陽)」「Used in tests(プロダクトコードには含まれない)」などの理由を選択し、アラートをクロースすることができます。

またその右の [Create issue] をクリックすると、アラートに対応する GitHub Issue を作成することができます。

脆弱性を修正するとアラートは自動クローズされる

脆弱性のあるコードで該当行をコメントアウトしてmainブランチにプッシュしてみます。

少し待つとアラートが自動でクローズされました。

コードを修正すると自動で脆弱性解消判定をしてくれるのは便利ですね。

おわりに

GitHub で code scanning を使用したコード分析を試してみました。

利用条件に一致する場合はセキュリティのために是非とも有効化したい機能です。

以上