VSCodeの脆弱性で1クリックのGitHubトークン盗難が可能に
リンククリックだけで、ユーザーの全リポジトリへの読み書きアクセス権を持つGitHubトークンを盗み出せるVSCodeの脆弱性が発見された。攻撃者は悪意あるJupyterノートブックとキーボードイベント送信を組み合わせて、拡張機能のインストールをトリガーし、任意のコード実行を可能にする。
Ammar Askarによって発見されたこの脆弱性は、VSCodeのウェブビュー(iframe)サンドボックスの設計とメッセージパッシング機構に起因する。攻撃はVSCodeのブラウザ版(github.dev)およびデスクトップ版の両方で機能する。発見者は公開開示の1時間前にGitHubセキュリティに報告した。
脆弱性の仕組み
VSCodeはwebviewをiframeで実装し、異なるオリジンを使用してコンテンツをサンドボックス化している。github.devはブラウザで完全に動作する軽量版VSCodeであり、GitHub POSTsするOAuthトークンは特定のリポジトリに限定されず、ユーザーがアクセス可能なすべてのリポジトリへのフルアクセス権を持つ。
VSCodeのウェブビューはWindow.postMessage() APIを使用してメインエディタとウェブビューフレーム間で通信を行う。特に、キーボードショートカット処理はdid-keydownイベントを介したメッセージパッシングで実装されている。
contentWindow.addEventListener('keydown', handleInnerKeydown);
VSCodeコード内では以下のようにキーボードイベントが処理される:
const handleInnerKeydown = (e) => {
// ...
hostMessaging.postMessage('did-keydown', {
key: e.key,
keyCode: e.keyCode,
code: e.code,
shiftKey: e.shiftKey,
altKey: e.altKey,
ctrlKey: e.ctrlKey,
metaKey: e.metaKey,
repeat: e.repeat
});
};
攻撃の手法
攻撃者は悪意あるJupyterノートブックを使用してJavaScriptペイロードを埋め込む。このペイロードはkeydownイベント(Ctrl+Shift+A と Ctrl+F1)を発生させ、VSCodeの拡張機能インストール機能をトリガーする。


VSCode 1.97では新しい拡張機能パブリッシャーに対する信頼システムが導入されたが、ローカルワークスペース拡張機能は信頼されたワークスペース内でインストールされると信頼できるパブリッシャーチェックをスキップする。攻撃フローは以下の通りである:
- 攻撃者が悪意あるJavaScriptペイロード付きのJupyterノートブックを含むGitHubリポジトリを作成する
- ユーザーがそのリポジトリへのリンクをクリックするとgithub.devで開かれる
- JavaScriptペイロードがkeydownイベントを発生させ、拡張機能インストールダイアログをトリガーする
- VSCodeがロードして通知がポップアップするまで約10秒待機し、その後拡張機能インストールまで500ミリ秒待機する
- インストール完了後、カスタム拡張機能はGitHub APIトークンを取得し、外部に流出させる
github.devにはCSRFトークンが存在しない。ユーザーが過去にそのダイアログを通過し、ブラウザのローカルストレージを削除していない場合、攻撃に対して無防備となる。ローカルストレージを削除することで、この攻撃から身を守ることができる。
概念実証が作成・テストされ、GitHubトークンの盗難とプライベートリポジトリへのクエリが可能であることが確認された。
筆者の見立て
- VSCode 100万行のTypeScriptコードベースがほぼ全体的にgithub.devで動作しているため、VSCodeバグを探索する者にとって優れたターゲットになる可能性がある
- MarkdownプレビューでJavaScriptを実行する方法があれば、厳密なCSPやDOMPurifyなどのVSCodeの防御層があってもさらに深刻な影響をもたらす可能性を示唆している
- この脆弱性を修正する際、UI/UXのバランスとセキュリティ上の懸念を考慮する必要がある
この記事は元記事の事実のみに基づいて自動生成されました。
出典
Ammar's Blog「1-Click GitHub Token Stealing via a VSCode Bug」 https://blog.ammaraskar.com/github-token-stealing/
(VSCode issue tracker の報道による)