GitHub Actionsで非セキュアなコマンドが許可されている

GitHub Actionsで非セキュアなコマンドを許可する設定を削除し、環境ファイルを使用してください。

説明

ACTIONS_ALLOW_UNSECURE_COMMANDSをtrueにすると、非推奨のset-envとadd-pathコマンドが再び許可されます。信頼できない入力がステップの標準出力に含まれると、攻撃者が環境変数やPATHを操作するおそれがあります。

想定される影響

  • 意図しない環境変数や実行ファイルの検索パスが、後続ステップに影響する可能性があります。
  • 変更された環境を使うステップで、攻撃者が選んだコマンドが実行されるおそれがあります。影響はジョブの権限とシークレットへのアクセス範囲によって変わります。

対処方法

ACTIONS_ALLOW_UNSECURE_COMMANDS: trueを削除し、set-envとadd-pathをGITHUB_ENVとGITHUB_PATHの環境ファイルに置き換えてください。信頼できない値をスクリプトに直接埋め込まず、ワークフローの権限とシークレットへのアクセスも制限してください。

例

変更前の例は、非セキュアなコマンドを許可し、GitHubコンテキストをPythonコードに直接埋め込むため、そのまま使用しないでください。変更後は、このフラグを使わずに環境ファイルへ固定値を書き込みます。イベントを変えるだけで、外部入力によるすべてのリスクが解消されるわけではありません。

変更前

yaml
name: Vulnerable workflow

on:
  pull_request_target

env:
  ACTIONS_ALLOW_UNSECURE_COMMANDS: true
  ENVIRONMENT_NAME: prod

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - run: |
          print("""${{ toJSON(github) }}""")
        shell: python

変更後

yaml
name: Safe workflow
on:
  pull_request:
    types: [opened, synchronize, edited, reopened]
    branches:
      - master
jobs:
  review-comment:
    runs-on: ubuntu-latest
    steps:
      - name: Set review flag
        run: echo "REVIEW_STARTED=true" >> "$GITHUB_ENV"

GITHUB_ENVに書いた値は、同じジョブの後続ステップで使用できます。信頼できない複数行の値を環境ファイルに書く際も、公式の構文に従って処理してください。

参考資料