
43分間に61リポジトリで攻撃を確認
Radwareの研究者は、GitHubの公開リポジトリ61件で、悪意あるコードを含むissueやプルリクエストなど83件を確認しました。うち77件は9月1日の43分間に投稿され、残る6件もその後2分以内に見つかりました。
対象には、Google LangExtract、Trivy、Braveブラウザー、MLflowなどのプロジェクトが含まれます。攻撃者は74のGitHubアカウントを使い、その多くには正規の開発履歴があったと研究者はみています。
研究者らは、複数アカウントが同じ日に似たペイロードを同じインフラへ投稿したことから、活動は連携していたと評価しています。投稿内容が実際にワークフローを動かした証拠は2件で見つかりましたが、リポジトリの書き込み権限が奪われたり、ソースコードが改変されたりしたかは確認されていません。
HTMLコメントに隠した入力がシェルへ流れる
攻撃者はissue、プルリクエスト、コメントに悪意あるコマンドを埋め込み、HTMLコメント内に隠しました。表示画面では見えにくい内容でも、リポジトリの設定によっては該当イベントがGitHub Actionsのワークフローを自動起動します。
問題となるのは、ワークフローが外部入力をシェルスクリプトの一部として組み立て、そのまま実行する場合です。入力にシェルが特別な記号として解釈する文字列が含まれると、単なる文章のつもりで渡した値から別のコマンドが実行される可能性があります。
今回の攻撃では、実行されたコマンドが環境変数を集め、攻撃者の管理するサーバーへ送ろうとしました。ワークフローが外部イベントを受けてから攻撃が実行されるまでの時間は、研究者によると1秒未満です。
コマンドインジェクションとプロンプトインジェクション
コマンドインジェクションでは、issue本文などの入力がシェルのコードとして解釈され、CI/CD環境で任意のコマンドを動かす経路になります。プロンプトインジェクションは、AIに渡す入力を使ってモデルへの指示や動作を操ろうとするもので、攻撃の対象と実行の仕組みが異なります。
ただし、AIアシスタントをワークフローに組み込み、外部ユーザーがissueやプルリクエストから起動できるようにすると、プロンプトインジェクションも秘密情報の流出や不正操作につながり得ます。特に、そのワークフローが秘密情報や書き込み権限付きトークンを持つ場合、AIへの入力が実行権限と結び付く危険があります。
一方、今回報告された攻撃の実行経路は、AIへの指示操作ではなく、入力をシェルコードへ混ぜることです。GitHubは、イベント由来の値をインラインスクリプトへ直接埋め込まず、アクションへの引数として渡すか、中間環境変数に格納する方法を案内しています。
ワークフローの権限と入力の扱いを見直す
研究者は、外部イベントで起動する処理と、高い権限を持つジョブをできるだけ分離し、ワークフローに渡す秘密情報や環境変数を制限するよう勧めています。攻撃者はリポジトリのコードへ直接アクセスしなくても、脆弱なワークフローを起動できるためです。
GitHubは、GITHUB_TOKENの既定権限をリポジトリ内容の読み取りにとどめ、必要なジョブだけ権限を追加する方法を案内しています。また、秘密情報がログへ漏れた場合はログを削除し、漏えいした秘密情報をローテーションするよう求めています。
外部入力を環境変数に入れる場合は、シェル内で変数を引用符付きで扱うことも対策に含まれます。第三者アクションへ値を引数として渡す方法や、ワークフローを解析するCodeQLもあります。研究者は対象プロジェクトの保守担当者へ調査結果を伝えており、多くのリポジトリは閉鎖または修正されたとしています。








