使い捨てブランチへの push で CI のシークレットを抜く手口に備える(LiteLLM 侵害の教訓)
LiteLLM の侵害では、攻撃者が数分で消す一時ブランチにワークフローを push し、on: push で組織と Environment のシークレットを外部へ送っていた。Environment の保護ルール、ワークフロー変更の制限、デプロイ記録と監査ログの監視、漏れたキーの即時失効で防ぐ。
何が起きたか
- 2026-10-21、
BerriAI/litellmのリリースパイプラインが悪用され、悪意あるlitellm==1.107.0(PyPI の wheel とコンテナイメージ)が公開された。C2 はwww[.]litellm[.]dev。 - Socket の調査で、その 11 日前(10/10)からシークレット窃取ワークフローが動いていたことが分かった。
- 正規の直近コミットを起点に
ci-tmp-xxxxxxという一時ブランチを作る。 .github/workflows/cache.ymlを追加するコミット(件名はci: bump cache config)を push。on: [push]で即座に実行され、secrets.*を/tmp/c.envに書いて base64 化し、webhook.siteへcurlで送信。|| trueで必ず成功扱いにする。- 数分でブランチを削除。
mainには何も残らない。
- 正規の直近コミットを起点に
- 2 回目はジョブを 6 つに増やし、5 つの Environment を指定して Environment スコープのシークレット(DB 接続文字列、Redis パスワード、Playwright のセッション状態など)まで取っていた。計 20 種類。
- 起点は、5 月に公開リポジトリへ誤コミットされたまま失効されていなかったマスターキー。そこから組織オーナーのトークン、さらに他メンテナーの認証情報へ広がり、10/10 に盗まれた
GH_TOKENが悪意あるリリースの承認に使われた。
防御のポイント
1. Environment のシークレットは「どのブランチから使えるか」を絞る
- GitHub の Environment 設定で Deployment branches and tags を
mainやリリースタグに限定する。任意ブランチからのon: pushで Environment を指定しても、シークレットが渡らなくなる。 - 本番・リリース系の Environment には Required reviewers を付ける。承認者のトークンが盗まれた場合に備え、承認者は複数にする。
2. ワークフローファイルの追加・変更を制限する
- ルールセットで、誰でも任意の名前のブランチを作れる状態をやめる(ブランチ作成の制限、
.github/workflows/**の変更に CODEOWNERS レビューを必須にする)。 - 組織・リポジトリのシークレットは必要なワークフローだけに渡し、長期の PAT や GitHub App の秘密鍵を CI に置かない(OIDC などの短期トークンに置き換える)。
3. 痕跡が残る場所を監視する
- ブランチやファイルを消しても、Environment のデプロイ記録(ref 名・コミット件名付きで残る)と Actions performance metrics、組織の監査ログには残る。
- 次をアラート対象にする:
main以外の ref からの Environment デプロイ、作成から数分で消えたブランチ、新規ワークフローファイルの初回実行、実行時間が数秒でチェックアウトのないジョブ。 - コミットの author は自己申告なので信用しない。誰が操作したかは監査ログ(送信元 IP、User-Agent、直前に作られたトークンや SSH 鍵)で見る。
4. 漏れたキーはすぐ失効させる
- 公開リポジトリに誤コミットしたキーは、履歴から消すだけでなくその場で失効・再発行する。今回は 5 か月放置されたキーが入口になった。
- シークレットスキャンのキー自体(今回は
GITGUARDIAN_API_KEY)も盗まれ得る。検知側の認証情報を CI に置かない。
自分たちが LiteLLM を使っていた場合
litellm==1.107.0を入れた環境は侵害前提で扱い、環境変数・設定ファイルにあった LLM API キー、クラウド認証情報をすべて失効する。www[.]litellm[.]devやwebhook[.]siteへの通信を、プロキシ・DNS ログで遡って探す。
関連
出典
- @SocketSecurity · 2026-10-24
- Socket「New Evidence Shows LiteLLM Secret-Stealing Workflows Ran 11 Days Before Supply Chain Attack」: socket.dev
- @lmt_swallow · 2026-10-21
- @flatt_security · 2026-10-21