Злоумышленник может украсть GitHub-токен с полным доступом к репозиториям (включая приватные), просто заставив жертву кликнуть по ссылке. Уязвимость связана с github.dev — лёгкой браузерной версией VSCode. Когда пользователь открывает репозиторий через github.dev, GitHub отправляет OAuth-токен этому веб-приложению. Токен не ограничен одним репозиторием и даёт доступ ко всем, к которым у пользователя есть права.
Атака работает через систему webview в VSCode. Webview — это <iframe> с отдельным origin, который изолирует опасный контент (например, HTML-вывод Jupyter-ноутбуков) от основного ядра редактора. Для связи между окнами используется API Window.postMessage(). Но webview по умолчанию пересылает все нажатия клавиш в основное окно через сообщение did-keydown. Это сделано, чтобы работали хоткеи, даже если фокус внутри iframe. Проблема в том, что скрипт внутри webview может сэмулировать любые нажатия.
Исследователь Аммар Аскар собрал цепочку. Репозиторий содержит Jupyter-ноутбук с вредоносным JavaScript в markdown-ячейке. Скрипт ждёт загрузки, затем эмулирует нажатие Ctrl+Shift+A — это хоткей для кнопки «Принять» на уведомлении. Уведомление появляется, потому что в .vscode/extensions.json прописана рекомендация установить расширение. Однако прямое расширение не устанавливается из-за системы доверия издателям. Поэтому на следующем шаге используется локальное расширение из папки .vscode/extensions (оно работает, так как workspace на github.dev считается доверенным). У этого локального расширения в package.json прописан кастомный хоткей Ctrl+F1, который вызывает команду workbench.extensions.installExtension с флагом skipPublisherTrust: true. Скрипт эмулирует Ctrl+F1, и уже настоящее расширение (из маркета) устанавливается и ворует токен.
Если вы никогда не использовали github.dev, вас встретит диалог — можно успеть закрыть страницу. Если же вы проходили его раньше и не чистили данные сайта, защититься нечем. Автор пошёл на полное раскрытие уязвимости из-за плохого опыта с MSRC: предыдущий баг VSCode починили молча и не засчитали.