VSCode 拡張ひとつで GitHub 内部 3,800 リポが盗まれた話
🐛 朝、GitHub が認めた話
今朝のテックニュースで、なかなか重たい話が出ていました。
TeamPCP を名乗るハッカーグループが「GitHub の内部リポジトリ(=ソースコードを保管しておくプロジェクト単位の入れ物)約 3,800 件を盗んだ」と主張。GitHub も自社の調査結果と整合的だと認めた。原因は社員のパソコンに入っていた VSCode 拡張機能ひとつ。
報道は BleepingComputer(=海外のセキュリティ専門ニュースサイト)の Sergiu Gatlan 記者。脅迫犯は最低でも 5万ドル(約 750 万円) を要求しているそうです。GitHub は問題の拡張機能名を伏せたままマーケットプレイス(=拡張機能を配布しているお店)から引っ込め、感染した端末を隔離した、と説明しています。社内リポの"外"にあるお客さんのデータへの影響は確認されていない——ただし、社内リポの中身には、業務上の必要で顧客に関する情報が一部含まれている可能性は否定されていません。
ここまで聞いて「怖い話だけど、自分には関係ないな」と思った方。少し聞いてください。この事件、AI で仕事を回し始めた人ほど他人事ではないんです。
🧩 VSCode 拡張ってなんだっけ
技術職じゃない方のために、最初に整理します。
VSCode(=マイクロソフトが配っている無料のテキストエディタ、今いちばん使われている開発ツール)には、後から機能を足せる 拡張機能(=ブラウザの拡張機能のようなもの。便利機能を追加する小さなアプリ)という仕組みがあります。Slack の絵文字スタンプを足すような気軽さで、たとえば「コードを綺麗に整形してくれる」「Git(=コードの変更履歴を管理する仕組み)の操作を楽にする」「AI に質問できる」みたいな機能をワンクリックで追加できます。
便利です。便利すぎて、開発者はだいたい 10〜30 個くらい入れている のが普通です。私もそうです。
問題は、この拡張機能がパソコンの中で何をやっているか、ほとんど誰も中身を見ていないことです。マーケットプレイスの☆の数と、ダウンロード数と、説明文だけを見て「便利そう」で入れている。これが、攻撃する側にとっては完璧な侵入経路になっています。
💣 何が起きていたか — 「便利そうな拡張」が情報を吸い上げる
GitHub の件で起きていたことを噛み砕くと、こうなります。
- 🦹 攻撃者が便利そうな拡張機能を作る(あるいは既存の拡張を乗っ取る)
- 😇 一見、宣伝通りの機能をちゃんと提供する
- 🕵️ 裏側で、開発者のパソコンの中にある「鍵」を盗む
- 📤 盗んだ鍵で会社のソースコードに侵入し、3,800 個のリポジトリを丸ごとコピーして外に持ち出す
ここで言う「鍵」というのは、開発者なら必ず持っている API トークン(=「これは本人ですよ」と証明する文字列。家の鍵のデジタル版)や SSH 鍵(=サーバーにログインするための鍵)のことです。一度盗まれると、相手はあなたとして 会社のシステムに入れます。パスワードも 2 要素認証(=パスワードに加えて、スマホに届くコードなどでもう一度確認する仕組み)も意味がない。
🌀 数日前にも、似た事件が起きていました
実はこれ、今週 2 件目です。
5月19日、もうひとつ別の攻撃が発覚しました。atool という npm(=エヌピーエム、JavaScript で使う部品の配布所)のアカウントが乗っ取られて、わずか 22 分の間に 317 個の人気パッケージ・637 バージョンが汚染された事件です。被害規模で言うと、月間 420 万ダウンロードの size-sensor を筆頭に、合計で月数千万ダウンロード級。
そして、この攻撃が特に新しかったのは——攻撃者が"裏口を残す場所"(=次にツールが起動した時にもう一度自分の命令を走らせるための仕掛けを仕込む場所。専門用語で"永続化先"といいます)として .claude/settings.json を使っていたことです。
.claude/settings.json というのは、私もよくお話している Claude Code(=Anthropic 社製の AI コーディングアシスタント、ターミナルから Claude に指示を出して開発作業をやってもらうツール)の設定ファイルです。普通のテキストファイルなので、悪いプログラムにとっては書き換え放題。ここに 「Claude Code が起動するたびに、こっそりこの命令を実行しろ」 という仕掛けを書き込まれていました。一度パッケージを消しても、Claude Code を立ち上げるたびに復活する、というわけです。
セキュリティ研究者はこの攻撃を Shai-Hulud(=シャイ・フルード、SF 小説『デューン』に出てくる砂漠の巨大な蟲)と呼んでいます。砂の中に潜んで、近づいたものを丸ごと飲み込む——という比喩なんでしょう。
🎯 なぜ今、エディタ周りが狙われるのか
ここからが、AI 時代に固有の話です。エディタ周りが攻撃対象として「美味しく」なった理由は、はっきりしています。
1. 鍵の置き場所が、エディタの近くに集まりました
クラウド全盛時代になって、開発者はありとあらゆるサービスのトークンをパソコン内に置くようになりました。AWS(=アマゾンのクラウドサービス)、GitHub、Cloudflare(=世界中にサーバーを持つクラウド屋)、各種 SaaS(=サース、ネット経由で使うソフトサービス全般)——。そのトークンを使うのは、ほぼ全部エディタやその周辺ツールです。鍵を盗むなら、鍵の近くで盗むのが効率がいい。攻撃者からすれば自然な選択です。
2. AI コーディングで「自動実行される面積」がさらに広がりました
これがいちばん大きい変化です。Claude Code や Cursor(=AI が組み込まれたエディタ、VSCode の親戚)は、「AI が勝手にコマンドを実行していい」前提で作られています(コードの編集だけでなく、ターミナルでコマンドを叩く・ファイルを書き換える、まで AI がやる)。GitHub Copilot(=ギットハブ・コパイロット、コードを書きながら AI が補完してくれるツール)はもう少し補完寄りですが、最近の "Copilot Workspace" 系は実行に踏み込んでいます。
ところが攻撃者から見ると、これは「自分が書いた命令を、人間の許可なしに実行してくれる装置」が、開発者のパソコンの中にいる状態です。設定ファイル(.claude/settings.json や .vscode/tasks.json)を 1 行書き換えるだけで、その AI が次の起動時に自分の指示通り動く。
ここで注意したいのは、「自動で何かを実行する」仕組み自体は AI 以前からあったということです。npm の preinstall(=プレインストール、パッケージを入れるだけで自動で走る命令)や .vscode/tasks.json も、AI ブームの前から自動で動いていました。AI で変わったのは、自動で走る面積がさらに広がったこと——エディタやその設定ファイルを経由して、勝手にコマンドが動く"層"が桁違いに増えました。攻撃者から見れば、潜り込める自動の層がボーナス的に増えたわけです。
3. 配布の仕組みが性善説のままです
VSCode 拡張機能も npm パッケージも、基本は作者を信用する仕組みで動いています。マイクロソフトや npm 社が「全部の中身を毎回チェック」しているわけではない。世界中で毎日、何千個も新しいバージョンが出ているので、そもそも全部見るのは無理です。
ここに、AI で自動化を急ぐ風潮が重なりました。便利な道具を、誰も中身を見ないまま、自動で動く仕組みに繋ぐ——攻撃者からするとボーナスタイムです。
🛡 では、私たちはどうするか
「全部やめろ」という話ではありません。それは現実的じゃない。閾値を一段上げるだけで、ほとんどの被害は避けられます。具体的に書きます。
✅ 拡張機能を入れる前に、3 秒だけ止まる
「便利そう」で入れていた拡張機能を、「本当に必要か?」と一度だけ問う習慣をつけます。3 秒でいい。
- 🌟 ☆の数より、作者と更新履歴を見る(無名・最近作られた・1度だけ更新、は要警戒)
- 📥 同じ機能の拡張が複数ある時は、ダウンロード数が桁違いに多いほうを選ぶ
- 🧹 入れている拡張の数が 20 個を超えていたら、半分使ってない可能性が高い。たまに棚卸しする
✅ AI ツールを使っている人は、設定ファイルを月1回チェック
Claude Code や Cursor を使っている方向けです。月に 1 回でいいので、.claude/settings.json や .vscode/tasks.json を開いて、自分が入れた覚えのない hook(=フック、特定のタイミングで自動的に実行される命令の塊)が紛れ込んでいないか見てください。Git(=コードの変更履歴を管理する仕組み)で管理している方は git diff(=ギット・ディフ、前と何が変わったか差分を見るコマンド)が早いです。自分が書き換えた覚えがないのに何かが追加されていたら、それは赤信号です。
Claude Code 本体には 権限プロンプト(=AI が何かやる前に「許可しますか?」と聞く仕組み)もあります。これを「全部許可」にしてしまうと意味がないので、少し面倒でも permissions.allow(=パーミッションズ・アロー、「自動で許可していい操作」のリスト)を絞っておくほうが安全です。
✅ もし「やられたかも」と思ったら、削除だけで終わらせない
万一、変な拡張を入れていたかも、と気づいた時の動き方も書いておきます。拡張を消して終わり、ではありません。
- 🔑 その端末から触っていた全部のトークンを発行し直す(=ローテーション)。AWS、GitHub、Cloudflare、SaaS、なんでも。盗まれた前提で動かす
- ⚙️
.claude/settings.jsonと.vscode/tasks.jsonを開いて、見覚えのない hook が残っていないか確認。あれば削除する(=永続化先の掃除) - 📋 GitHub と npm の自分の公開履歴を遡って、覚えのない commit や package 公開が混じっていないか見る。混じっていたら即削除して、各プラットフォームに報告
✅ 組織で開発している方向けに、もう一段
会社・チームで開発している場合は、個人より一段強い手も打てます。
- 🏢 拡張機能の allowlist(=アロウリスト、「承認した拡張だけ入れていい」運用)を社内で決める。VSCode は管理者向けの強制設定で配れます
- 📌 lockfile(=ロックファイル、依存パッケージのバージョンを固定するファイル。
package-lock.json等)を必ずコミットしておく。これで「今日変なバージョンが出荷された」を後から拾える - ⏳ 新しく公開された npm パッケージは数日〜1 週間置いてから採用(=fresh publish を即採用しない)。最初の数日は界隈が異変に気付くウィンドウなので、待つだけで多くを避けられます
✅ 一般の方が気をつけられるところ
開発者じゃない方も、関係なくはありません。
- 🌐 Chrome 拡張機能も同じ構造です。「便利そう」で入れたまま放置している拡張、棚卸ししてください。設定 → 拡張機能 で一覧が見られます
- 🤖 「これ新しく入れて」と Claude や ChatGPT に提案されたツールを、内容を読まずにそのままインストールしない。AI が提案するもの全部が安全とは限りません(AI 自体が攻撃対象になっているニュースも今週ありました)
🧭 構造として何が変わったのか
セキュリティの話を、最後にひとつだけ抽象化します。
これまで攻撃の入口は「ユーザーが手で開くもの」だった。 怪しいメール添付、怪しいリンク、怪しいダウンロード。今、攻撃の入口は「ユーザーがすでに信頼してしまっている、自動で動く仕組み」に重心を移している。
エディタの拡張機能、AI ツールの設定ファイル、勝手に引っ張られてくる依存パッケージ、AI 自身が「これ使うね」と呼んでくる外部ツール——どれも、一度入れたら後はノータッチで動く層です。攻撃する側からすると、ユーザーをクリックさせるよりも、この自動で動く層に紛れ込むほうが、はるかに歩留まりが良い。今週の 2 件は、その兆候です。
「クリックさせる攻撃」を疑う文化は、私たちはなんとか育てました(=「あの添付、本当に取引先からのもの?」と一拍置く習慣)。今、もうひとつ別の層に対して、似た文化を作り直す時期に来ています。「自分が信頼して、自動で動かしているものを、ときどき棚卸しする」——たぶんこれが、これからの基本姿勢になります。
幸い、難しい話ではありません。「便利そう」で入れない、月に 1 回 diff を見る、知らない変更を疑う。これだけです。
AI の時代になって、私たちは「信頼を寄せる対象が増えた」状態にあります。AI を信頼し、AI が呼ぶ拡張機能を信頼し、それを支える設定ファイルや依存関係を信頼している。便利のために増やした信頼の数だけ、攻撃面も増えている。便利は維持したまま、信頼に値するかどうかだけを、ときどき確認する——という、地味な習慣の話だと思います🛠
📮 infoHiroki ぼちぼち便り — 月1程度の不定期メールマガジンをやっています。AIで仕事を回したい中小企業の方向けに、今回のような「知っとくと損しない話」を書いています。よかったら登録してみてください