This commit is contained in:
2026-07-03 00:38:05 +09:00
parent 87eacd39b2
commit 86cad348b4
149 changed files with 24450 additions and 105 deletions
@@ -0,0 +1,286 @@
---
source_url: "https://zenn.dev/como/articles/draft_github-actions-ai-yaml_zenn"
ingested: 2026-07-02
sha256: 0d8be1eca1bbfe9a61b5159bf9816da9e77243c0d6b6d9e7e0b0eb3e702f7209
discovered_from:
platform: discord
channel_id: "1477793137064935675"
channel_name: "tw"
message_id: "1522079837672702046"
author_id: "1477793167486226708"
posted_at: "2026-07-02T03:21:52.177000000Z"
message_excerpt: "Important links shared: JAMSTEC regional climate LLM for municipal heat adaptation; Zenn GitHub Actions YAML security checks for AI-generated CI."
---
# AI生成のGitHub Actions YAMLで見落としがちなセキュリティチェック
## はじめに
GitHub Actionsまわりの2026年6月の変更を見たとき、正直なところ、最初から強い危機感があったわけではありません。
`pull_request_target`、`actions/checkout`、Actions cache、workflow trigger。どれもGitHub Actionsを使っていれば見かける言葉です。ただ、外部からリポジトリが攻撃されるとか、CI/CDの入口が悪用されるとか聞いても、どこかで「有名なOSSや大きな組織の話だろう」と思っていました。
自分は、誰かのプルリクエストを大量にレビューするというより、GitHub ActionsでCI/CDを組んだり、GitHubフローを回しやすくしたりする文脈でGitHubに触ることが多いです。最近はそこにAIも入ってきていて、「このプロジェクト用にActionsのYAMLを書いて」「push時にテストして、mainにマージされたらビルドして」のような下書きをAIに作ってもらう場面も増えました。
これはかなり便利です。YAMLの細かい構文やインデントを毎回調べずに済みますし、ゼロから書くより速いことも多いです。
ただ、今回の変更を追いかけてみて、自分はGitHub Actionsを少し「動けばOKの自動化」として見すぎていたなと思いました。AIが作ったYAMLが動くかどうかだけではなく、誰が起動できて、どのコードをcheckoutして、どの権限で実行されるのかを見る必要があります。
この記事は、AIにGitHub Actionsを書かせること自体を避けるためのものではありません。むしろ、AIにたたき台を作ってもらう前提で、人間がどこを確認すべきかを整理するためのメモです。
実際、GitHub ActionsのYAMLをAIに作ってもらう場面は増えています。
たとえば、次のような依頼です。
- push時にテストを実行する
- pull request作成時にLintとビルドを回す
- mainへマージされたらデプロイする
- リリースタグ作成時にパッケージを公開する
- Dependabotや外部PRに対して自動コメントを返す
AIは、この種のたたき台をかなり自然に作れます。構文やインデントを調べる手間も減ります。
ただし、GitHub ActionsのYAMLは単なる設定ファイルではありません。実行権限、シークレット、キャッシュ、アーティファクト、リリース、デプロイに関わるため、書き方を間違えるとリポジトリ全体のセキュリティに影響します。
この記事では、2026年6月のGitHub Actions関連アップデートを踏まえ、AIが生成したActions YAMLを見る時に確認したいポイントを整理します。
## 背景: 2026年6月のGitHub Actions関連変更
GitHubは2026年6月に、Actionsの信頼境界に関する変更を複数発表しています。
- `pull_request_target` と `actions/checkout` の組み合わせをより安全な既定値へ寄せる変更
- untrusted triggersからのActions cacheを読み取り専用にする変更
- 誰が、何をきっかけにworkflowを起動できるかを制御する方向のアップデート
これらは個別には小さな変更に見えますが、共通しているのは「外から来た入力を、どの権限で実行してよいか」という問題です。
GitHub Actionsでは、イベント、checkout対象、トークン権限、シークレット、キャッシュ、アーティファクトが組み合わさって動きます。AIが生成したYAMLを見る時も、「動くかどうか」だけでなく、この信頼境界を確認する必要があります。
## チェック1: `pull_request_target` を使っていないか
まず見るべきなのは、トリガーです。
```
on:
pull_request_target:
```
`pull_request_target` は、pull requestに反応して動くイベントですが、ベースリポジトリ側の文脈で実行されます。通常の `pull_request` より強い権限を扱えるため、ラベル付け、コメント、権限が必要な処理などには便利です。
ただし、外部PR側のコードをcheckoutして実行する用途には注意が必要です。
危険になりやすい形は、次のような組み合わせです。
```
on:
pull_request_target:
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
with:
ref: ${{ github.event.pull_request.head.sha }}
- run: npm test
```
この例では、`pull_request_target` の強い文脈で、PR側のコードをcheckoutして実行しています。外部から来たPRに悪意あるコードが含まれていた場合、そのコードを強い権限の環境で動かすことになります。
確認観点は次です。
- 本当に `pull_request_target` が必要か
- 通常の `pull_request` で足りないか
- `pull_request_target` 内でPR側のコードをcheckoutしていないか
- checkoutしたコードを `npm test`、`python script.py`、`bash script.sh` などで実行していないか
- 権限が必要な処理と、PR側コードを実行する処理を分離できないか
GitHub Security Labの「Preventing pwn requests」は、この問題を理解するために読んでおく価値があります。
## チェック2: `permissions` が最小限になっているか
AIが生成したYAMLでは、`permissions` が省略されることがあります。
省略時の挙動はリポジトリや組織の設定に依存するため、workflow側で明示しておく方が読みやすく、安全側に寄せやすくなります。
テストやLintだけなら、まずは読み取り専用を基本にします。
```
permissions:
contents: read
```
pull requestへコメントを書く場合は、必要な権限を明示します。
```
permissions:
contents: read
pull-requests: write
```
パッケージ公開やリリース作成が必要なworkflowでは、`contents: write` や `packages: write` が必要になることがあります。ただし、必要なjobだけに閉じることを検討します。
確認観点は次です。
- `permissions` が明示されているか
- テストだけのworkflowに書き込み権限が付いていないか
- job単位で権限を絞れるか
- デプロイやリリース用の権限が、PR由来のworkflowで使われていないか
- `id-token: write` を使う場合、OIDCの条件が適切か
AIが「動かすため」に強めの権限を出してきた場合、人間が引き算する必要があります。
## チェック3: checkoutしているコードがどこ由来か
Actionsでは、何をcheckoutしているかが重要です。
特にPRイベントでは、次の違いを意識します。
- ベースリポジトリ側のコード
- PRのマージ結果
- PR head側のコード
- fork元から来たコード
AIが生成したYAMLでは、`ref:` に `github.event.pull_request.head.sha` や `github.head_ref` を使うことがあります。
それ自体が常に悪いわけではありません。ただし、どの権限でそのコードを実行するかとセットで見ます。
確認観点は次です。
- `actions/checkout` の `ref` が何を指しているか
- fork元PRのコードをcheckoutしていないか
- checkoutしたコードを強い権限で実行していないか
- 権限が必要な処理の前に、外部由来コードを実行していないか
`pull_request_target` とPR headのcheckoutが組み合わさっている場合は、特に慎重に見ます。
## チェック4: cacheとartifactを書き込ませてよいか
Actions cacheはビルド高速化に便利です。
ただし、キャッシュは次回以降の実行に影響します。信頼できないトリガーからキャッシュを書き込めると、後続の信頼されたworkflowが汚染されたキャッシュを読む可能性があります。
GitHubは2026年6月、untrusted triggersからのActions cacheを読み取り専用にする変更を発表しました。これは、キャッシュも信頼境界の一部として扱う流れです。
確認観点は次です。
- 外部PRや自動生成PRからcacheを書き込ませていないか
- cache keyにPR由来の値を使っている場合、意図した分離になっているか
- artifactを後続jobや別workflowで信用しすぎていないか
- デプロイ用workflowが、信頼できない入力由来のcacheやartifactを使っていないか
キャッシュやアーティファクトは、単なる高速化や中間ファイルではありません。次の実行へ渡るものとして扱います。
## チェック5: サードパーティActionを丸呑みしていないか
AIは便利なサードパーティActionを提案することがあります。
```
steps:
- uses: some-user/some-action@v1
```
この時、少なくとも次を確認します。
- そのActionは実在するか
- 作者や組織は信頼できるか
- README、更新履歴、Issueの状態は妥当か
- 公式Actionで代替できないか
- タグ固定でよいか、コミットSHA固定が必要か
GitHubのセキュリティガイドでは、サードパーティActionの扱いや、信頼できるActionを使うことの重要性が説明されています。
すべてのActionを毎回SHA固定するかは、チームの運用やリスク次第です。ただし、少なくともAIが出してきた `uses:` を確認せずに通すのは避けた方がよいです。
## チェック6: workflowを誰が起動できるか
GitHub Actionsでは、workflowがどのイベントで起動するかも重要です。
```
on:
pull_request:
workflow_dispatch:
push:
branches:
- main
```
見るべきなのは、イベントの種類だけではありません。
- forkからのPRで動くのか
- 初回コントリビューターのPRで自動実行されるのか
- `workflow_dispatch` を誰が実行できるのか
- `push` 対象ブランチは適切に絞られているか
- デプロイworkflowがPRイベントから起動しないか
特にデプロイ、リリース、パッケージ公開、クラウド操作を含むworkflowでは、起動条件を狭くします。
```
on:
push:
tags:
- "v*.*.*"
```
あるいは、環境保護ルールや手動承認を組み合わせることも検討します。
## AI生成YAMLを見るための短いチェックリスト
AIがGitHub Actions YAMLを生成したら、まず次を見ます。
- `pull_request_target` を使っているか
- PR側のコードをcheckoutして実行していないか
- `permissions` が明示され、最小限になっているか
- `GITHUB_TOKEN` やsecretsがPR由来の処理に渡っていないか
- cacheやartifactを信頼できない実行元から書き込ませていないか
- `uses:` のActionが信頼できるものか
- デプロイやリリースがPRイベントから起動しないか
- `workflow_dispatch` やbranch/tag条件が広すぎないか
このチェックは、AIを使わないためのものではありません。
AIにたたき台を書いてもらい、人間が信頼境界を見るためのものです。
## まとめ
GitHub ActionsのYAMLは、見た目は小さな設定ファイルです。
しかし実際には、コードをcheckoutし、シェルを実行し、シークレットやトークンに触れ、リリースやデプロイにつながる実行環境です。
AIはそのYAMLを短時間で作れます。これは便利です。
ただし、AIが生成したYAMLを確認する時は、「動くかどうか」だけではなく、次を見ます。
- 誰が起動するのか
- 何をcheckoutするのか
- どの権限で動くのか
- 何を書き込めるのか
- その結果がどこへ渡るのか
GitHub Actionsの2026年6月の変更は、CI/CDの入口を安全側に寄せる流れとして読めます。
AIにYAMLを作ってもらう時代だからこそ、人間はYAMLの構文よりも、信頼境界を見る力を持っておきたいところです。
## 参考
- GitHub Changelog: Safer pull_request_target defaults for GitHub Actions checkout
https://github.blog/changelog/2026-06-18-safer-pull_request_target-defaults-for-github-actions-checkout/ (https://github.blog/changelog/2026-06-18-safer-pull_request_target-defaults-for-github-actions-checkout/)
- GitHub Changelog: Read-only Actions cache for untrusted triggers
https://github.blog/changelog/2026-06-26-read-only-actions-cache-for-untrusted-triggers/ (https://github.blog/changelog/2026-06-26-read-only-actions-cache-for-untrusted-triggers/)
- GitHub Changelog: Control who and what triggers GitHub Actions workflows
https://github.blog/changelog/2026-06-18-control-who-and-what-triggers-github-actions-workflows/ (https://github.blog/changelog/2026-06-18-control-who-and-what-triggers-github-actions-workflows/)
- GitHub Security Lab: Preventing pwn requests
https://securitylab.github.com/resources/github-actions-preventing-pwn-requests/ (https://securitylab.github.com/resources/github-actions-preventing-pwn-requests/)
- GitHub Docs: Security hardening for GitHub Actions
https://docs.github.com/en/actions/security-for-github-actions/security-guides/security-hardening-for-github-actions (https://docs.github.com/en/actions/security-for-github-actions/security-guides/security-hardening-for-github-actions)
tikomo (/como)
AIがシステム開発する時代、「人間の開発日誌って意味があるの?」と悩み中... 確かに「作る」は速くなったけど「理解する」のは...やっぱり時間がかかります。 「本当に理解するって必要なの」とに問いかけながら「ヤル」そういうものと信じるw AIとはバランスをもって付き合いたいw
バッジを贈って著者を応援しよう
バッジを受け取った著者にはZennから現金やAmazonギフトカードが還元されます。