1-Click GitHub Token Vulnerability Lets Attackers Steal Users’ OAuth Tokens
2026/06/03 CyberSecurityNews — Visual Studio Code の WebView 実装に存在する、深刻なセキュリティ脆弱性を悪用する攻撃者は、被害者に悪意のリンクを 1-Click させるだけで、GitHub OAuth トークンの窃取および、非公開リポジトリの Read/Write 権限を取得する可能性がある。 このバグは、2026年6月2日に、セキュリティ研究者 Ammar Askar により公表された。同氏は、Microsoft Security Response Center (MSRC) の過去の対応に対する不満や不愉快な経験を理由に、完全公開を選択した。

GitHub の github.dev において、ブラウザ・ベースの軽量 VSCode エディタが提供されている。ユーザーが github.com から github.dev の任意のリポジトリへ移動すると、github.com は OAuth トークンを github.dev セッションへ自動的に POST する。このトークンによるアクセスは、その時点で開いているリポジトリに限定されず、それぞれのユーザーが所有する、すべてのリポジトリに対する完全なアクセス権を付与する仕様となっている。
このスコープ制限のないトークンと、ブラウザ上で動作するほぼ完全な VSCode TypeScript コード・ベースの組み合わせは、攻撃者にとって極めて魅力的な標的となる。
VSCode の Webview セキュリティ・モデル
VSCode は、メイン・エディタの “vscode-file:/” オリジンとは異なる、独立した “vscode-webview:/” オリジンから提供される WebView を使用することで、信頼できない可能性のあるコンテンツを分離している。
このクロス・オリジン分離により、WebView 内の JavaScript は VSCode の Node.js API やエディタ API を直接呼び出せないため、Markdown プレビューや Jupyter Notebook 出力などの機能は、このサンドボックス化された iframe 内でレンダリングされる。
また、VSCode は Window.postMessage() API を使用し、分離された 2 つのオリジン間で構造化された JavaScript オブジェクトをやり取りすることで、Markdown プレビューをエディタの現在行と同期させる機能と、WebView 間の通信を可能にしている。
ユーザー・エクスペリエンスを向上させるために、WebView 内のすべてのキーボード・イベントを postMessage 経由でメイン・ウィンドウへ転送する did-keydown イベント・ハンドラが登録されている。これにより、Ctrl+Shift+P などのショートカットが WebView へのフォーカス時でも機能するよう設計されている。
しかし、WebView 内の信頼できない JavaScript が、偽の keydown イベントを生成してユーザーのキーボード入力を偽装できるため、危険な API と信頼できないユーザー・コンテンツを分離するセキュリティ境界が侵害される。利便性のための postMessage チャネルが、意図せず両者を結び付けてしまうという結果を招いている。

エクスプロイト・チェーン:クリックからトークン窃取まで
2026年6月2日に Ammar Askar は、VSCode の 5 つの挙動を連鎖的に利用して成立する、トークン窃取エクスプロイト・チェーンを実証する PoC を公開した。
最初に攻撃者は、悪意の “.ipynb” ファイルを利用し、onerror ハンドラを含む HTML の image タグを通じて WebView の iframe 内で任意の JavaScript を実行する。それに加えて、”.vscode/extensions.json” を利用してエクステンション推奨通知を表示させる。
VSCode の推奨通知を待機した後のペイロードは、”Notifications: Accept Notification Primary Action” に対応する Ctrl+Shift+A の合成 keydown イベントを送信し、ユーザーに気付かれることなく悪意のエクステンションをインストールする。
本来は表示されるはずの発行元の信頼確認ダイアログは、Marketplace 経由のインストールにより回避され、攻撃者による悪意のエクステンションが “.vscode/extensions/” ディレクトリに配置される。つまり、”github.dev” のワークスペースが、信頼済みとして扱われる仕様が悪用されている。
Content Security Policy (CSP) の制約により、ローカル・エクステンションは “vscode-cdn.net” 以外からワーカー・スクリプトを読み込めないが、攻撃者は “package.json” に Ctrl+F1 などのカスタム・キーバインドを追加し、skipPublisherTrust=true を指定して workbench.extensions.installExtension を呼び出すことで、この制限を回避している。
この手順により、インストール後の悪意のエクステンションからの、事前にロードされた GitHub OAuth トークンへのアクセスが実行される。それにより、”https://api.github.com/user/repos” へのリクエストを通じて、すべてのアクセス可能な非公開リポジトリを列挙し、トークンと共に外部へ流出させる。この JavaScript ペイロードは 1 分未満で実行され、最初のリンク・クリック以外のユーザー操作を必要としない。
この脆弱性が影響を及ぼす範囲は、”github.dev”/ブラウザ版 VSCode/デスクトップ版 VSCode となる。デスクトップ版では、被害者が攻撃者のリポジトリを clone して開く必要があるが、エクステンションが child_process を含む Node.js API に無制限にアクセスできるため、攻撃が成功すると完全なリモート・コード実行 (RCE) に至る。
窃取された GitHub OAuth トークンは、単一のリポジトリに限定されない。したがって攻撃者は、被害者がアクセス権を持つすべての非公開リポジトリに対して読み取り/改竄/プッシュを実行できる。さらに、”github.dev” は CSRF トークンを実装していないため、任意の Web ページやインターネット上のリンクを介して、ユーザーを攻撃へと誘導できる。
緩和策
この脆弱性による被害を軽減するために、ユーザーには以下の対策が推奨される。
- ブラウザで “github.dev” のサイト・データを削除する (Chrome の場合:アドレスバーまたは URL バーのアイコン → Cookie とサイト・データ → デバイス上または端末上のサイトデータ管理 → github.dev を削除)。これにより、警告ダイアログが再表示される。
- Microsoft または GitHub による修正パッチが提供されるまで、不審な “github.dev” リンクをクリックしない。
- “github.dev” 上にインストールされているエクステンションを監査し、認識できないものを削除/アンインストールする。
なお、”github.dev” を一度も利用したことがないユーザーや、ローカル・ストレージを削除済みのユーザーは、初回の同意ダイアログにより保護される。
研究者は、VSCode の多層防御が被害範囲を限定したと評価している。厳格な Content Security Policy の script-src ‘none’ により、Markdown プレビューやエクステンションのプレビュー・ページでの任意 JavaScript 実行が防止されている。
また、DOMPurify を利用したレンダリング済み Markdown のサニタイズにより、クロスサイト・スクリプティング (XSS) ベクターも遮断されているため、単純な 1-Click RCE 攻撃経路が遮断されている。
なお、この脆弱性は Microsoft への事前調整や事前通知なしに公開されたが、Ammar Askar は公開の約 1 時間前に、GitHub のセキュリティ担当者へ通知したとしている。
訳者後書:今回の問題は、本来は分離されているはずの「信頼できないコンテンツ」と「重要な操作権限」が、利便性を追求した設計により、意図せず繋がってしまったことに原因があります。具体的には、操作性を高めるための通信機能 (did-keydown ハンドラ) が悪用され、偽のキー入力により悪意のエクステンションが自動的にインストールされてしまいました。さらに “github.dev” の仕様により、連携されたトークンが全リポジトリへの権限を持っていたことも被害を広げる要因となっています。ご利用のチームは、ご注意ください。よろしければ、VS Code での検索結果も、ご参照ください。



You must be logged in to post a comment.