🕌

CI/CD脆弱性チェックツールのRavenを試してみた

2023/12/04に公開

ご縁があり、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の脆弱性チェックツールです。

https://cycode.com/blog/introducing-raven/

RavenはOSSとして開発されており、workflowを解析し、コードインジェクションや秘密情報の漏洩などのworkflowの脆弱性を発見することができます。

上記のCycode社による紹介記事やGitHubのRepository上でRavenによって脆弱性を発見したRepository一覧を確認することができます。

https://github.com/CycodeLabs/raven

Ravenのインストールから実行までを簡単に試したので、下記に紹介します。

インストール

Ravenのコンポーネント

Ravenの実行の流れは大きく3つに分かれます。

  1. Download: チェック対象のRepositoryのworkflow定義ファイルをダウンロード
  2. Index: ダウンロードした情報を牽引、関連付け、保存
  3. 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つのパート分かれます。

  1. Download: チェック対象のRepositoryのworkflow定義ファイルをダウンロード
  2. Index: ダウンロードした情報を牽引、関連付け、保存
  3. 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:readfiles:writeが必要とのことです。今後必要となる権限もドキュメントに記載するとのことでした。

https://github.com/CycodeLabs/raven/issues/123#issuecomment-1794348680

まとめ

Ravenについてインストールから実行まで簡単に紹介しました。

Ravenは比較的簡単にセットアップでき、利用を開始するまでのハードルが低く、すぐに利用できるのが良い点かなと思いました。

実際のユースケースとしては、自社のOrganizationに対してGithub Actionsで定期的に実行し、レポートを確認する形になるのかなと思います。

近年、サプライチェーン攻撃が注目されていることもあり、CI/CDのセキュリティにも注意が必要になっています。またCI/CDとして、GitHub Actionsを利用している企業は多いのではないかと思います。そのため、CI/CDのセキュリティに不安がある方は、脆弱性チェックの第1歩として利用してみてはいかがでしょうか。

脚注
  1. 対象となったRepository名は伏せています。 ↩︎

Cyber-sec+

Discussion