VSCodeを使っている開発者なら、一度は github.dev を使ったことがあるかもしれません。リポジトリのURLを github.com から github.dev に変えるだけで、ブラウザ上で軽量なVSCodeが立ち上がるあの機能です。
今回、このgithub.devとVSCode本体に、たった1クリックでGitHubトークンを窃取できる深刻な脆弱性が公開されました。セキュリティ研究者のAmmar Askar氏がフルディスクロージャー(事前通知なしの完全公開)という異例の形で発表したこの問題、なかなか考えさせられる内容なんですよね。
何が起きたのか
github.devを開くと、GitHubはOAuthトークンをブラウザ上のVSCodeに渡します。このトークンは特定のリポジトリに限定されておらず、そのユーザーがアクセスできるすべてのリポジトリ(プライベート含む)への読み書き権限を持っています。
攻撃者は、細工されたJupyterノートブックを含むリポジトリを用意し、被害者にgithub.devでそのリポジトリを開かせるだけで、このトークンを盗み出せてしまいます。
攻撃の仕組み:3つのポイント
まず1つ目は、webviewのキーボードイベントのバブリングです。VSCodeはwebview内のコンテンツをiframeで隔離していますが、ユーザー体験のためにキーボードイベントをメインウィンドウに転送する仕組みがあります。攻撃者のスクリプトはこれを悪用して、あたかもユーザーがキーボードを操作しているかのように振る舞えます。
2つ目は、ローカルワークスペース拡張機能の信頼バイパスです。github.devのワークスペースは常に「信頼済み」として扱われるため、リポジトリの .vscode/extensions フォルダに置かれた拡張機能はパブリッシャー信頼チェックをスキップしてインストールされます。
3つ目は、カスタムキーバインドによるチェーン攻撃です。ローカル拡張機能のpackage.jsonでカスタムキーバインドを定義し、そこから別の悪意ある拡張機能を信頼チェックなしでインストールするコマンドを実行します。
これらを組み合わせると、ノートブックを開いた数秒後には、攻撃者の拡張機能がインストールされ、GitHubトークンを使ってプライベートリポジトリの一覧を取得・外部送信できてしまいます。
VSCodeが正しくやっていたこと
一方で、VSCodeのセキュリティ設計が適切に機能している部分もあります。厳格なContent Security Policy(script-src 'none')とDOMPurifyによるMarkdownサニタイズのおかげで、拡張機能ページのMarkdownプレビュー経由での攻撃は防がれています。もしこれがなければ、デスクトップ版で1クリックRCE(リモートコード実行)という、さらに深刻な事態になっていたと思います。
なぜフルディスクロージャーだったのか
Askar氏がMicrosoftのセキュリティ対応チーム(MSRC)への事前報告をせずに公開した背景には、過去の苦い経験があります。以前報告したVSCodeのバグはクレジットなしで修正され、セキュリティ上の影響なしと判定されたそうです。セキュリティ研究者の貢献が軽視される構造的な問題は、エコシステム全体の健全性に関わります。
私たちにできること
github.devを一度でも使ったことがある方は、ブラウザのgithub.devに関するサイトデータ(Cookie、ローカルストレージ)をクリアすることを強くお勧めします。クリアしておけば、次にgithub.devにアクセスした際にダイアログが表示され、攻撃に気づいて離脱する猶予が生まれます。
また、この件はより広い教訓を示しています。便利さとセキュリティのバランスは常にトレードオフであり、「信頼の境界線」をどこに引くかは永遠の課題です。webviewのキーボードイベント転送は優れたUXを提供しますが、それが攻撃面にもなり得る。私たちエンジニアは、こうした設計判断の裏にあるリスクを常に意識しておく必要があると思います。
← ブログ一覧に戻る