📰
SecurityTutorialEN → JA
51

zenn · 204日前

【GitHub Actions】スクリプトインジェクションの実践例

要約

GitHub Actionsの `run` ステップで `${{ github.event.pull_request.title }}` や `${{ github.head_ref }}` を直接展開すると、攻撃者は細工したPRタイトル・ブランチ名に任意のシェルコマンドを埋め込める。例えばPRタイトルを `"; echo INJECTED"` とするだけで、ワークフロー実行時にそのコマンドが実行される。ブランチ名にはスペースが使えないため `${IFS}` で代替するテクニックも紹介されている。根本原因は、`${{ }}` の値がシェルスクリプトとして文字列展開される前にサニタイズされないことにある。修正策は `env:` ブロックで環境変数に値を渡し、シェル変数として参照する方法に統一することである。

📌

Key Points

  • •`run` ステップ内で `${{ github.event.pull_request.title }}` や `${{ github.head_ref }}` を直接使うと、PRタイトル・ブランチ名を介して任意コードが実行できる
  • •ブランチ名にスペースが使えない場合でも `${IFS}` を利用することでインジェクションが可能であり、制約を回避する手法が存在する
  • •対策は `env:` ブロックで値を環境変数に渡し、シェル内では `$ENV_VAR` 形式で参照することで、直接展開を避けること

Why it matters

外部コントリビューターが作成したPRによってCIパイプラインで任意コードが実行されると、シークレットの漏洩やサプライチェーン攻撃につながる危険があるため、オープンソースプロジェクトを含む多くのリポジトリで影響を受ける可能性がある。

関連エンティティ
github/actions/github-scriptZenn.devGitHub ActionsZenn