SnowflakeのGitHub Actionsにコマンドインジェクションの脆弱性、細工したIssueからJira認証情報が流出可能に
要点
- セキュリティ企業Wizが、Snowflakeの公開リポジトリに存在したGitHub Actionsのコマンドインジェクション脆弱性を公表した。
- 公開Issueのタイトルや本文をワークフロー内のシェルに直接埋め込んでいたことなどが原因で、細工したIssueにより内部Jiraの認証情報が取得可能な状態だった。
- 取得可能だったトークンからは、エンジニアリングやセキュリティコンプライアンス、バグバウンティ追跡などのJiraプロジェクトの読み取りが可能だった。
- 報告を受けたSnowflakeは即日でワークフローを安全な記述に修正し、社内調査では不正アクセスの証拠は確認されなかったとしている。
- 脆弱性の発生要因としてAI支援機能の関与が言及されていたが、コミット履歴の精査ではコードの成立経緯に複数の段階があったことが示されている。
クラウドセキュリティ企業のWizは2026年8月17日、Snowflakeが公開しているリポジトリのCI/CD自動化設定に、コマンドインジェクション(プログラムの不備を突き、不正なシステムコマンドを実行させる攻撃手法)が可能となる脆弱性が存在していたことを明らかにした。
悪意を持って細工されたGitHub Issueを投稿することでワークフロー内で任意のコマンドが実行され、Snowflake社内で使用されているJiraのAPIトークンが外部に流出する恐れがあったという。報告を受けたSnowflakeは即座に修正を実施しており、同社の調査では不正なアクセスの痕跡は確認されていないと説明している。
脆弱性の概要とWizによる検証
脆弱性が発見されたのは、Snowflakeが公開している.NET向けコネクタのリポジトリ「snowflakedb/snowflake-connector-net」だ。影響はリポジトリのCI/CD(ソフトウェアのビルドやテストを自動化する仕組み)環境に限定されており、配布されているSnowflake Connector for .NETのソフトウェア自体に影響はない。
Wizは認可されたセキュリティテストにおいて、同社の検証システム「Red Agent」を用いて脆弱性の実証を行った。最初の攻撃ペイロードではシェルの構文エラーが発生したものの、アプローチを変更した結果、GitHub Actionsのランナーから外部へのコールバックを受信し、ワークフロー内に設定されていたJira APIトークンの取得に成功したという。
Wizによると、取得されたトークンは「qa@snowflake.net」に紐づくもので、snowflakecomputing.atlassian.net上でホストされているエンジニアリング、セキュリティコンプライアンス、バグバウンティ(脆弱性の発見者に報奨金を支払う制度)追跡などを扱うJiraプロジェクトへの読み取り権限を持っていた。
ワークフローに存在した不備の技術的詳細
問題が存在していたのは、リポジトリ内のワークフロー定義ファイル「.github/workflows/jira_issue.yml」である。このワークフローは公開リポジトリで新しいIssueが開かれた際に実行され、同じステップ内でJiraの接続先URL、ユーザーのメールアドレス、APIトークンを参照していた。
不備の主な原因は、攻撃者が自由に制御できるIssueのタイトルおよび本文の値が、シェルの「run:」ブロック内に直接展開される記述になっていたことにある。
さらに、イベントの実行条件にも不備が存在していた。当該ワークフローはIssue作成イベントによってトリガーされるにもかかわらず、プルリクエスト用のプロパティである「github.event.pull_request.user.login」をチェックしていた。GitHub Actionsの仕様上、存在しないプロパティは空文字列として評価されるため、ボットアカウントを除外するための判定が機能せず、一般ユーザーが投稿した通常のIssueであってもジョブの実行対象となっていた。
報告と修正のタイムライン
Wizは2026年6月23日、脆弱性報奨金プラットフォームのHackerOneを通じてSnowflakeに本件を報告した。Snowflakeは報告を受けた同日のうちにプルリクエスト #1402をマージし、脆弱性を修正した。
修正版では、GitHub式による直接的な文字列展開を廃止し、Issueの入力値を一度環境変数に代入した上で、JSON処理ツール「jq」の引数として安全に渡す方式へと変更された。
脆弱なワークフローは、6月18日にプルリクエスト #1218がマージされたことでデフォルトブランチに導入されていたため、外部から攻撃可能な状態にあった期間は約5日間だった。Snowflakeは声明の中で「調査の結果、不正アクセスの証拠は見つからなかった」と述べている。またWizによると、露出したJiraトークンは6月24日にローテーション(新しい鍵への切り替え作業)が行われ、5日間の露出期間中に外部から悪用された形跡も確認されなかったという。
コード履歴とAIツールの関与に関する背景
Wizはこの欠陥について、GitHubのコード自動修正機能「GitHub Copilot Autofix」による変更に起因するものと説明していた。しかし、リポジトリのコミット履歴を精査すると、Copilotが直接脆弱なコードを生成したと断定できる記録にはなっていない。
履歴上、Copilotが共同作成者(co-author)として明記されていたコミット「6d0e2fa」は、別のファイルである「jira_close.yml」を変更したものだった。一方で、問題となった「jira_issue.yml」の安全でないリファクタリングは、2025年8月25日に特定のアカウントによって作成されたコミット「094038e」に含まれていた。
これらの変更は最終的に2026年6月18日、スカッシュマージ(複数の変更を1つに集約して統合するGitの操作)コミット「4a1b8ce」によってまとめられ、そのマージコミットの共同作成者一覧にCopilot Autofixが含まれる形となっていた。