GitHub Actionsワークフローに対するインジェクション攻撃と、checkovを利用した脆弱なワークフローの検出

GitHub Actionsワークフローに対するインジェクション攻撃と、checkovを利用した脆弱なワークフローの検出

概要

GitHub は多くの企業で利用されており、 GitHub に統合された CI/CD 基盤である GitHub Actions も広く活用されています。 GitHub Actions は非常に便利ですが、誤った設定をすることで、ワークフローが脆弱なものになってしまいます。 この記事では、 GitHub Actions のワークフローに対する攻撃の中でも、インジェクション攻撃に焦点を当てて解説するとともに、 checkov というツールを利用して脆弱なワークフローを機械的に検出する方法を説明します。

目次

目的

  • GitHub Actions のワークフローに対するインジェクション攻撃とそれを防ぐ方法について理解する
  • ワークフローの脆弱性を機械的に検出する

対象読者

  • GitHub Actions を利用している開発者
  • セキュリティ・エンジニア

PR

UZUMAKIではアジャイル開発で新規事業の開発から、大規模Webアプリケーションのアーキテクチャ更新などの開発をしています。

お問い合わせはUZUMAKIのHPのお問合せフォームから

本文

インジェクション攻撃とは

インジェクション攻撃とは、攻撃者がプログラムの不備を突くデータを入力することで、不正な命令を実行する攻撃方法です。

WEB プログラミングの分野では SQL インジェクションや XSS (= クロスサイトスクリプティング) などが広く知られています。

GitHub Actions のワークフローに対するインジェクション攻撃

攻撃を受けるリスク

リポジトリやワークフローの設定によっては以下のようなリスクが考えられます。

  • リポジトリに不正なコードが混入される
  • 運用中のサービスに不正なコードがデプロイされる
  • リポジトリの内容やワークフロー内で利用している認証情報が外部に流出する

実際に攻撃が可能だった例としては、 RyotaK (@ryotkak) さんが報告された microsoft/vscode-github-triage-actions (VSCode の CI 用スクリプトを管理するリポジトリ) の脆弱性があります。

microsoft/vscode-github-triage-actions というリポジトリへのインジェクションを通して認証情報 (GitHub Access Token) を取得。

取得した認証情報を使用して、microsoft/vscode のリリース・ブランチに任意のコミットが追加可能だったことを報告されています。

インジェクション攻撃の仕組み

GitHub Actions のワークフローでは、コンテキストという仕組みを利用して実行中のアクションの情報を取得します。

一部のコンテキストには、攻撃者が任意の値を入力することが可能です。

(例: PR のタイトルや本文、ブランチ名など)

ワークフローの 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

image

攻撃が成功した様子

image

インジェクション攻撃を防ぐ方法

GitHub の公式ドキュメントでインジェクション攻撃を防ぐ方法がいくつか紹介されています。

ここでは、最小限の修正で攻撃を防ぐことができる、中間環境変数を使用する方法を採用してワークフローの設定を修正します。

中間環境変数を使用する

インライン スクリプトの場合、信頼されない入力を処理するための推奨される方法は、式の値を中間環境変数に設定することです。

次の例では、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 }}

攻撃を防いだ様子

image

checkov を利用して脆弱性を検出する

ツールを利用してワークフローの脆弱性を検出する

組織の規模やコードベースの大きさによっては、全てのワークフローをレビューすることが難しいケースがあります。

さらに、ワークフローの設定はコードの修正に伴い日々更新される可能性もあるため、脆弱性スキャンツールを開発プロセスに組み込んで、機械的に脆弱性を検出することが望ましいです。

ここでは、 checkov というツールを紹介します。

checkov とは

Infrastructure as Code (IaC) を対象とした脆弱性スキャンツールです。

bridgecrew 社がオープンソースで開発しています。

GitHub Actions のワークフローの設定をスキャンして、インジェクション攻撃を含む、複数種類の脆弱性を検出することが可能です。

また、 GitHub Actions 以外にも、 Terraform や Kubernetes などにも対応しているようです。

脆弱性の検出

以下の出力は、脆弱性があるワークフローを 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 のようですが、折を見て試してみたいと思います。

PR

XではUZUMAKIの新しい働き方や日常の様子を紹介!ぜひフォローをお願いします!

noteではUZUMAKIのメンバー・クライアントインタビュー、福利厚生を紹介!

UZUMAKIではRailsエンジニアを絶賛募集中です。

↓の記事を読んでご興味を持っていただいた方は、ぜひ応募よろしくお願いします!

是非応募宜しくおねがいします!