セキュリティ研究者のアンマル・アスカル氏が、Microsoft Visual Studio Code を経由したワンクリック攻撃を公表した。
GitHub の Web ベースエディタである GitHub.dev では、github.com が OAuth トークンを github.dev へ POST する仕組みになっている。このトークンは特定のリポジトリに限定されず、ユーザーがアクセスできる全リポジトリへの読み書き権限を持つ。攻撃者は、VS Code のメインウィンドウと webview 間のメッセージパッシング機構を悪用し、悪意のある拡張機能をインストールしてトークンを窃取できる。手法では local workspace extensions 機能や package.json のキーバインドを利用し、発行元の信頼チェックを回避する。
脆弱性は2026年6月2日に GitHub へ通知され、その1時間後に詳細が公開された。Microsoft はパートナーソフトウェアエンジニアリングマネージャーのアレクサンドル・ディマ氏を通じ、VS Code Desktop には影響しないと述べた。記事公開後、Microsoft は問題は緩和済みで顧客側の対応は不要だと回答している。
From:
One-Click GitHub Dev Attack Lets Attackers Steal Full GitHub OAuth Tokens
【編集部解説】
今回の事案は、ひとことで言えば「便利さの裏口」が突かれた事例です。GitHub.dev は、ブラウザの URL を github.com から github.dev に変えるだけで VS Code がそのまま立ち上がる、開発者にとってきわめて快適な機能です。その快適さを支えていたのが、ユーザーに代わって GitHub を操作する OAuth トークンでした。問題は、このトークンが「いま開いているリポジトリ」だけでなく、その人がアクセス権を持つすべてのリポジトリ(個人のプライベートリポジトリや所属組織のコードを含む)への読み書き権限を持っていた点にあります。
技術的な核心は、VS Code の「webview」と本体ウィンドウの間でやり取りされるメッセージにあります。webview は本来、Markdown プレビューや Jupyter ノートブックを安全に表示するための隔離された領域です。ところが、キーボード操作を本体へ伝える仕組み(keydown イベントの転送)が、隔離された側から「ユーザーになりすまして」キー入力を送れる抜け道になっていました。
アスカル氏の実証コードは、この抜け道を巧みに連鎖させています。コマンドパレットを開く操作だけでは文字入力ができないため、VS Code に標準で備わる通知の承認ショートカットを使い、ワークスペースが推奨する拡張機能のインストールを「承認」させます。さらに、発行元の信頼確認をすり抜けるために local workspace extensions という機能と package.json のキーバインドを組み合わせる、という二段構えの工夫が施されていました。
ここで、元記事には載っていない重要な補正をしておきます。元記事は Microsoft の見解として「VS Code Desktop には影響しない」と伝えていますが、アスカル氏自身のブログでは、デスクトップ版にも同じ脆弱性は存在すると明言されています。ただし悪用は難しく、攻撃者のリポジトリを被害者にクローンさせて開かせる必要がある、という条件付きです。つまり「デスクトップは安全」ではなく「デスクトップは攻撃のハードルが高い」というのが正確な理解になります。
影響範囲は、過去に github.dev のサインイン/認可ダイアログを通過し、ブラウザの github.dev 関連の site data や local storage を削除していない利用者に及ぶ可能性があります。アスカル氏によれば、github.dev には CSRF トークンのような防御がなく、ネット上のどんなリンクからでもこの攻撃へ誘導できたためです。逆に言えば、過去に一度も github.dev を使ったことがない人や、site data を消した人は、誘導された時点で離脱できる余地が残されていました。
一方で、対応の速さは特筆に値します。アスカル氏が6月2日に公開した翌6月3日、Microsoft はまず応急的な修正(Web 版でノートブックを開く際の確認表示と、コマンドによる発行元信頼の回避禁止)を投入しました。さらに、ノートブックの webview で keydown イベントが本体へ伝播すること自体を止める、より踏み込んだ修正も続きます(アスカル氏のタイムラインでは6月3日とされますが、GitHub の PR 上では一部のマージ表示が6月4日となっており、タイムゾーンやブランチの差と見られます)。記事公開後には「サービス側で緩和済み、顧客の対応は不要」との回答も示されました。開示からの対応の速さは、本件の深刻度を物語っています。
この事案が問いかけるのは、技術そのものの是非だけではありません。アスカル氏は、過去に Microsoft のセキュリティ対応窓口(MSRC)へ報告した際、功績を認められないまま静かに修正された経験から、今回は通知のわずか1時間後に実証コードを全面公開する「フルディスクロージャー」を選びました。修正の猶予を十分に与えない開示は防御側を危険にさらす一方、研究者の貢献を軽視する企業文化への異議申し立てでもあります。この緊張関係は、セキュリティ業界が長年抱える難題そのものです。
長期的な視点で見れば、今回の一件は「クラウド開発環境の信頼の連鎖」に警鐘を鳴らすものです。ブラウザ上で完結する開発ツールは、生産性を飛躍的に高める反面、認証情報という最重要資産をブラウザのセッションに預けることを意味します。利便性と権限の最小化をどう両立させるか、開発の進化が新たな信頼設計を要求している構造を読み取るべき事案だと言えるでしょう。
【用語解説】
OAuth トークン
サービスがユーザーに代わって別のサービスを操作するための「代理権限の鍵」だ。パスワードを直接渡す代わりに発行され、その鍵を持つ者はユーザー本人として振る舞える。今回は、この鍵が特定のリポジトリに限定されず、全リポジトリに通用してしまう設計が問題となった。
webview
VS Code が Markdown プレビューや Jupyter ノートブックを表示するために用いる、隔離された描画領域である。本体とは別の「origin(生成元)」で動作し、内部の JavaScript が本体へ干渉できないよう設計されている。今回はこの境界を越えるメッセージの仕組みが悪用された。
postMessage(メッセージパッシング機構)
生成元の異なるウィンドウ同士が、許可された形で情報をやり取りするためのブラウザ標準の仕組みだ。本来は安全な協調手段だが、キー入力を本体へ転送する用途に使われていたため、なりすまし入力の経路となった。
keydown イベント
キーボードのキーが押された瞬間に発生する信号である。webview から本体へこの信号を転送する機能が、攻撃者の用意したスクリプトによって偽造された。
local workspace extensions
ワークスペース内の「.vscode/extensions」フォルダに置いた拡張機能を、発行元の信頼ダイアログなしで直接インストールできる VS Code の機能だ。信頼済みワークスペースであることが信頼の根拠とされるため、今回は信頼チェックの回避に利用された。
Jupyter ノートブック
コードと実行結果、説明文を一つの文書にまとめられる対話的な開発形式である。実証コードでは、このノートブック内に悪意ある JavaScript を仕込む起点として用いられた。
MSRC(Microsoft Security Response Center)
Microsoft のセキュリティ報告窓口・対応組織である。研究者からの脆弱性報告を受け付け、修正や公表の調整を担う。今回は、この窓口への不信が研究者の開示方針に影響した。
【参考リンク】
GitHub.dev(github/dev リポジトリ)(外部)
「.」キーまたは URL を github.dev に変えると起動する、ブラウザ完結型コードエディタの公式リポジトリだ。
The github.dev web-based editor(GitHub 公式ドキュメント)(外部)
github.dev の使い方や、ブラウザのサンドボックス内で動作する仕組みを解説する GitHub の公式ドキュメントだ。
Visual Studio Code Webviews(VS Code 公式 API ガイド)(外部)
VS Code の webview API の仕様を解説する公式ガイド。今回悪用された描画領域の設計思想を確認できる。
Window.postMessage()(MDN Web Docs)(外部)
生成元の異なるウィンドウ間の通信仕様を解説する技術リファレンス。攻撃の経路となった仕組みの一次的な技術文書だ。
microsoft/vscode Issue #319593(GitHub)(外部)
研究者が脆弱性を報告した VS Code の課題管理ページ。開示と Microsoft の対応経緯を追える。
【参考記事】
VS Code zero-day lets hackers steal GitHub tokens in one click(外部)
BleepingComputer の報道。webview のメッセージ機構を悪用し、悪意ある拡張機能で OAuth トークンを抜き、全プライベートリポジトリを列挙する流れを解説する。
VS Code Exploit Stole GitHub Tokens via github.dev(外部)
WinBuzzer の報道。Microsoft が6月3日にサービス側で緩和し、顧客の対応は不要と述べた最新ステータスを反映している。
Microsoft fixes severe VS Code vulnerability enabling GitHub token theft(外部)
Crypto Briefing の報道。6月3日の修正内容と、5月20日の GitHub 本体侵害(約3,800リポジトリ)との時系列に言及する。
1-Click GitHub Token Stealing via a VSCode Bug(外部)
発見者の一次情報。6月3日に応急修正とより完全な修正の2件が投入された経緯や、デスクトップ版の存在を明記する。
Another bug hunter leaks Microsoft exploits in defiance of company’s handling of vulnerability disclosures(外部)
The Register の報道。通知から約1時間後の公開と、その背景にある MSRC への不信を詳述している。
GitHub.dev flaw lets attackers steal OAuth tokens in one click(外部)
The Next Web の報道。悪意ある Jupyter ノートブックを起点に、OAuth トークンが自動で POST される流れを整理する。
【関連記事】
GitHub内部リポジトリ約3,800件が流出 — 悪意あるVS Code拡張機能から始まった侵害をTeamPCPが主張(内部)
本記事で触れた、約3,800件の内部リポジトリ流出事案を詳報。悪意ある拡張機能を起点とする侵害の実例として、今回の手法公開と地続きの背景を伝える。
BitLockerをUSB一本で破るPoC公開——CVD制度を「報復の道具」にした研究者と、沈黙するMicrosoft(内部)
研究者とMicrosoft(MSRC)の対立、フルディスクロージャーの是非を正面から扱う。今回の開示を読み解く文脈として論点が深く重なる一本だ。
Microsoft Defenderゼロデイ「BlueHammer」ら3件が悪用中(内部)
抗議的リークとMSRCの対応すれ違いを論じる記事。「責任ある開示」と「全面公開」のはざまにある研究者心理を考える手がかりになる。
VS Code拡張機能4つに深刻な脆弱性、CursorやWindsurfにも影響―累計1億2500万インストール(内部)
VS Codeの拡張機能エコシステムに潜む脆弱性を扱う。開発者の手元の環境こそ攻撃の接点だという、今回と共通する構造を浮き彫りにする。
【編集部後記】
私たちは普段、リンクをクリックしたり URL を少し書き換えたりする操作に、ほとんど意識を向けていません。今回の事案が静かに突きつけてきたのは、その「無意識の操作」と「強い権限を持つ鍵」が、思ったよりずっと近い場所にあったという事実です。みなさんは普段、どんなクラウドツールに「自分の代理」を任せているでしょうか。一度、手元のサービスがどこまでの権限を預かっているか確かめてみませんか。便利さの設計を知ることは、これからの開発と少し対等に向き合う一歩になる気がしています。

