
GitHub Actionsワークフローに対するインジェクション攻撃と、checkovを利用した脆弱なワークフローの検出
概要
GitHub は多くの企業で利用されており、 GitHub に統合された CI/CD 基盤である GitHub Actions も広く活用されています。
GitHub Actions は非常に便利ですが、誤った設定をすることで、ワークフローが脆弱なものになってしまいます。
この記事では、 GitHub Actions のワークフローに対する攻撃の中でも、インジェクション攻撃に焦点を当てて解説するとともに、 checkov というツールを利用して脆弱なワークフローを機械的に検出する方法を説明します。
目的
- GitHub Actions のワークフローに対するインジェクション攻撃とそれを防ぐ方法について理解する
- ワークフローの脆弱性を機械的に検出する
対象読者
- GitHub Actions を利用している開発者
- セキュリティ・エンジニア
本文
インジェクション攻撃とは
インジェクション攻撃とは、攻撃者がプログラムの不備を突くデータを入力することで、不正な命令を実行する攻撃方法です。
WEB プログラミングの分野では SQL インジェクションや XSS (= クロスサイトスクリプティング) などが広く知られています。
インジェクション攻撃https://ja.wikipedia.org/wiki/インジェクション攻撃
GitHub Actions のワークフローに対するインジェクション攻撃
攻撃を受けるリスク
リポジトリやワークフローの設定によっては以下のようなリスクが考えられます。
- リポジトリに不正なコードが混入される
- 運用中のサービスに不正なコードがデプロイされる
- リポジトリの内容やワークフロー内で利用している認証情報が外部に流出する
実際に攻撃が可能だった例としては、 RyotaK (@ryotkak) さんが報告された microsoft/vscode-github-triage-actions (VSCode の CI 用スクリプトを管理するリポジトリ) の脆弱性があります。
VSCodeのGitHubリポジトリに対する不正なPushアクセスhttps://blog.ryotak.net/post/vscode-write-access/
microsoft/vscode-github-triage-actions というリポジトリへのインジェクションを通して認証情報 (GitHub Access Token) を取得。
取得した認証情報を使用して、microsoft/vscode のリリース・ブランチに任意のコミットが追加可能だったことを報告されています。
Test by Ry0taK · Pull Request #113596 · microsoft/vscodehttps://github.com/microsoft/vscode/pull/113596
インジェクション攻撃の仕組み
GitHub Actions のワークフローでは、コンテキストという仕組みを利用して実行中のアクションの情報を取得します。
一部のコンテキストには、攻撃者が任意の値を入力することが可能です。
(例: PR のタイトルや本文、ブランチ名など)
コンテキスト - GitHub Docshttps://docs.github.com/ja/actions/learn-github-actions/contexts#github-context
ワークフローの run ディレクティブでそのようなコンテキストを直接参照するとインジェクションされたコマンドが実行される恐れがあります。
以下に、脆弱なワークフローとそれを攻撃する PR の例を紹介します。
このワークフローは、リポジトリのコードをチェックアウトした後、 PR のタイトルを echo するだけの単純なものですが、任意のコードを実行することが可能です。
脆弱なワークフロー
name: hello
on:
pull_request:
branches: ["*"]
jobs:
hello:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- run: echo ${{ github.event.pull_request.title }}
PR

攻撃が成功した様子

インジェクション攻撃を防ぐ方法
GitHub の公式ドキュメントでインジェクション攻撃を防ぐ方法がいくつか紹介されています。
ここでは、最小限の修正で攻撃を防ぐことができる、中間環境変数を使用する方法を採用してワークフローの設定を修正します。
GitHub Actions のセキュリティ強化 - GitHub Docshttps://docs.github.com/ja/actions/security-guides/security-hardening-for-github-actions#understanding-the-risk-of-script-injections
インライン スクリプトの場合、信頼されない入力を処理するための推奨される方法は、式の値を中間環境変数に設定することです。
次の例では、Bash を使って `github.event.pull_request.title` の値を環境変数として処理しています。
…
中間変数を利用したワークフロー
name: hello
on:
pull_request:
branches: ["*"]
jobs:
hello:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- run: echo "${GITHUB_PR_TITLE}"
env:
GITHUB_PR_TITLE: ${{ github.event.pull_request.title }}
攻撃を防いだ様子

checkov を利用して脆弱性を検出する
ツールを利用してワークフローの脆弱性を検出する
組織の規模やコードベースの大きさによっては、全てのワークフローをレビューすることが難しいケースがあります。
さらに、ワークフローの設定はコードの修正に伴い日々更新される可能性もあるため、脆弱性スキャンツールを開発プロセスに組み込んで、機械的に脆弱性を検出することが望ましいです。
ここでは、 checkov というツールを紹介します。
checkov とは
Infrastructure as Code (IaC) を対象とした脆弱性スキャンツールです。
bridgecrew 社がオープンソースで開発しています。
GitHub Actions のワークフローの設定をスキャンして、インジェクション攻撃を含む、複数種類の脆弱性を検出することが可能です。
また、 GitHub Actions 以外にも、 Terraform や Kubernetes などにも対応しているようです。
GitHub - bridgecrewio/checkov: Prevent cloud misconfigurations and find vulnerabilities during build-time in infrastructure as code, container images and open source packages with Checkov by Bridgecrew.https://github.com/bridgecrewio/checkov
脆弱性の検出
以下の出力は、脆弱性があるワークフローを checkov でスキャンしたものです。CKV_GHA_2 のチェックが FAILED になっており、脆弱性が検出されていることがわかります。
## Homebrew で checkov をインストールする
$ brew install checkov
$ checkov --file .github/workflows/hello.yml
[ kubernetes framework ]: 100%|████████████████████|[1/1], Current File Scanned=.github/workflows/hello.yml
[ secrets framework ]: 100%|████████████████████|[1/1], Current File Scanned=.github/workflows/hello.ymlllo.yml
[ github_actions framework ]: 100%|████████████████████|[1/1], Current File Scanned=.github/workflows/hello.yml
_ _
___| |__ ___ ___| | _______ __
/ __| '_ \ / _ \/ __| |/ / _ \ \ / /
| (__| | | | __/ (__| < (_) \ V /
\___|_| |_|\___|\___|_|\_\___/ \_/
By bridgecrew.io | version: 2.3.225
Update available 2.3.225 -> 2.3.238
Run pip3 install -U checkov to update
github_actions scan results:
Passed checks: 14, Failed checks: 1, Skipped checks: 0
...
Check: CKV_GHA_4: "Suspicious use of netcat with IP address"
PASSED for resource: jobs(hello).steps[2]
File: /.github/workflows/hello.yml:12-14
Guide: https://docs.bridgecrew.io/docs/suspicious-use-of-netcat-with-ip-address
Check: CKV_GHA_2: "Ensure run commands are not vulnerable to shell injection"
FAILED for resource: jobs(hello).steps[2]
File: /.github/workflows/hello.yml:12-14
Guide: https://docs.bridgecrew.io/docs/ensure-run-commands-are-not-vulnerable-to-shell-injection
12 | - run: echo ${{ github.event.pull_request.title }}
まとめ
GitHub Actions のワークフローに対するインジェクション攻撃について説明しました。
記事内で紹介した GitHub の公式ドキュメントでは、インジェクション攻撃についてだけでなく、 GitHub Actions を安全に利用するためのプラクティスが紹介されているため、是非一読することをおすすめします。
また、この記事では checkov を紹介しましたが、上記のドキュメントには GitHub の提供する code scanning のスターターワークフローを使用して脆弱性を発見できる との記載がありました。こちらはまだステータスが beta のようですが、折を見て試してみたいと思います。
Security hardening for GitHub Actions - GitHub Docshttps://docs.github.com/en/actions/security-guides/security-hardening-for-github-actions#using-starter-workflows-for-code-scanning