CI/CD脆弱性チェックツールのRavenを試してみた
ご縁があり、Cyber-sec+で記事をかかせて頂くことになりましたshnmorimotoと申します。
普段は事業会社でSRE業務の傍ら、セキュリティ業務を担当しています。
早速ですが、皆さんはCI/CDにGitHub Actionsを利用していますか?
私は業務でもプライベートでもメインで利用しています。
GitHub Actionsは便利がゆえ、ビルド・リリース・デプロイをはじめ、その他の自動化等、色々な工程に依存される重要なコンポーネントになっています。
昨今はCI/CDパイプラインを狙ったサプライチェーン攻撃も報告されており、よりセキュアなworkflowを構築することが重要になっています。
とはいえ、構築したworkflowに脆弱性があるかどうか見つけるのは、中々難しい面もあります。
今回は、GitHub Actionsに利用できる脆弱性チェックツール Raven を紹介したいと思います。
Ravenとは
RavenはASPM(Application Security Posture Management)サービスを提供しているCycode社が開発しているGitHub Actionsの脆弱性チェックツールです。
RavenはOSSとして開発されており、workflowを解析し、コードインジェクションや秘密情報の漏洩などのworkflowの脆弱性を発見することができます。
上記のCycode社による紹介記事やGitHubのRepository上でRavenによって脆弱性を発見したRepository一覧を確認することができます。
Ravenのインストールから実行までを簡単に試したので、下記に紹介します。
インストール
Ravenのコンポーネント
Ravenの実行の流れは大きく3つに分かれます。
- Download: チェック対象のRepositoryのworkflow定義ファイルをダウンロード
- Index: ダウンロードした情報を牽引、関連付け、保存
- Report: 脆弱性があるworkflowを出力
1. Download
にはRedis、2 Index
にはNeo4jを利用します。
https://github.com/CycodeLabs/raven より
前提条件
RedisとNeo4jはdocker-composeとして用意されているため、事前にDockerがインストールされている必要があります。また本体のコードはPython3で書かれているため、Python3もインストールされている必要があります。事前にインストールが必要なものは下記の通りとなります。
- Python 3.9+
- Docker Compose v2.1.0+
- Docker Engine v1.13.0+
- Make
インストール方法
まずはgitからrepositoryをcloneします。
git clone https://github.com/CycodeLabs/raven.git
cd raven
pythonで仮想環境を作って、有効化します。こちらは環境を汚さないためなので、必須ではありません。
python3 -m venv .venv
source .venv/bin/activate
pipからインストールします。
pip3 install raven-cycode
makeファイルが用意されているので、実行します。makeファイルの内容はRedisとNeo4Jを起動するだけなので、READMEの通り、makeコマンドの代わりに手動で起動しても問題ないです。
make setup
以上でインストールは完了です。
その他の事前準備
Ravenの実行にはGitHubのPAT(Personal Access Token)が必要なため、settings -> Developer settings -> Personal Access TokensからPATを作成しましょう。
テスト目的ならPublicなRepositoryのダウンロードのみで良いため、Fine-gained tokensでPermissionもPublic Repository(read-only)で良いと思います。
PATを作成したら、環境変数にセットしておきましょう。
export GITHUB_TOKEN=<作成したPAT>
Ravenの実行
上記で説明したとおり、実行は下記の3つのパート分かれます。
- Download: チェック対象のRepositoryのworkflow定義ファイルをダウンロード
- Index: ダウンロードした情報を牽引、関連付け、保存
- Report: 脆弱性があるworkflowを出力
Download
Repositoryからworkflowファイルをダウンロードし、Redisにキャッシュします。
対象とするRepositoryは以下の2つのモードから選べます。
- Organization Mode:対象とするOrganizationを指定し、Organization配下の全てのRepositoryを対象とします。PATのアクセス権限がある場合はPrivate Repositoryも対象となります。
- Crawl Mode: GitHubのスターのRatingを指定して、その範囲のRepositoryを調査します。
試してみましたが、現在はOrganizationを利用していない個人のRepositoryや特定のRepositoryを指定しての実行はできないようです。
microsoftをOrganizationに指定して、実行してみます。
raven download org --token $GITHUB_TOKEN --org-name microsoft
Repository数が多いためか、私の環境では実行完了までは1時間半ほどかかりました。
Index
RedisのデータをNeo4jに挿入し、牽引と関連付けを行います。
raven index
こちらは私の環境では7分程度で完了しました。
この時点で、Neo4jでのIndexは完了しているため、localhost:7474
にアクセスすると、Neo4jのWebインターフェースから検索を行うことができます。
Report
Neo4jに保存したデータについて、重大度や脆弱性の種類で、レポートを作成できます。
重大度は
- info
- low
- medium
- high
- critical
脆弱性の種類は
- injection
- unauthenticated
- fixed
- priv-esc
- supply-chain
を利用できます。
重大度をcritical
、脆弱性の種類をinjection
で結果を出力してみます。
raven report --severity critical --tag injection
出力結果は下記のようになります。[1]
Name: Title Context Injection
Severity: critical
Description: Title Injection is caused by using title variables in inline scripts
Tags: ['injection', 'unauthenticated']
Workflow URLS:
- https://github.com/xxxxxxxxxxxx
- https://github.com/xxxxxxxxxxxx
Name: Body Context Injection
Severity: critical
Description: Body Injection is caused by using body variables in inline scripts
Tags: ['injection', 'unauthenticated']
Workflow URLS:
- https://github.com/xxxxxxxxxxxx
Description
に脆弱性の内容が記載されています。上記では伏せていますが、対象のGitHubのWorkflowも記載されていますので、これらを元に適宜確認し、必要であれば、修正する形になります。
Reportの結果をslackに通知することもできます。
raven report --severity critical --tag injection slack --slack-token <slack token> --channel-id <channel-id>
Reportファイルを添付する形でSlackに送信されます。
当初、送信に必要なSlack Tokenの権限が分からなかったため、Issueで質問したところ、現在はfiles:read
とfiles:write
が必要とのことです。今後必要となる権限もドキュメントに記載するとのことでした。
まとめ
Ravenについてインストールから実行まで簡単に紹介しました。
Ravenは比較的簡単にセットアップでき、利用を開始するまでのハードルが低く、すぐに利用できるのが良い点かなと思いました。
実際のユースケースとしては、自社のOrganizationに対してGithub Actionsで定期的に実行し、レポートを確認する形になるのかなと思います。
近年、サプライチェーン攻撃が注目されていることもあり、CI/CDのセキュリティにも注意が必要になっています。またCI/CDとして、GitHub Actionsを利用している企業は多いのではないかと思います。そのため、CI/CDのセキュリティに不安がある方は、脆弱性チェックの第1歩として利用してみてはいかがでしょうか。
-
対象となったRepository名は伏せています。 ↩︎
Discussion