Функция, созданная для удобства, открыла дорогу к чужим репозиториям.

Обычный переход по ссылке мог позволить злоумышленнику украсть доступ к приватным репозиториям GitHub. Уязвимость нашли в том, как Visual Studio Code обрабатывал нажатия клавиш внутри встроенных веб-окон. В случае с github.dev атака особенно опасна, потому что жертве достаточно открыть подготовленную ссылку.
github.dev позволяет открыть любой доступный пользователю репозиторий прямо в браузере, в облегчённой версии Visual Studio Code. Через такой редактор можно просматривать файлы, менять код, создавать запросы на слияние и делать коммиты. Для работы GitHub передаёт в github.dev токен OAuth, который позволяет действовать от имени пользователя.
Проблема в том, что токен не ограничен одним открытым репозиторием. Если у пользователя есть доступ к другим проектам, включая приватные, токен может дать доступ и к ним. При удачной атаке злоумышленник способен получить токен и запросить список приватных репозиториев через программный интерфейс GitHub.
Слабое место оказалось связано с веб-представлениями Visual Studio Code. Такой механизм используют, например, для предварительного просмотра Markdown-файлов и работы с блокнотами Jupyter. Содержимое веб-представления запускается в отдельной области браузера, чтобы изолировать его от основного окна редактора.
Для удобства Visual Studio Code всё же передаёт часть действий из веб-представления в основное окно. Иначе сочетания клавиш вроде вызова палитры команд не работали бы, когда курсор находится внутри встроенного окна. В реализации нашёлся опасный побочный эффект: сценарий внутри недоверенного содержимого мог имитировать нажатия клавиш и заставлять редактор выполнять действия от имени пользователя.
Прямо вводить произвольный текст через такую схему не получалось, но встроенных сочетаний клавиш оказалось достаточно. Автор проверки использовал уведомление с предложением установить рекомендуемое расширение, а затем задействовал локальное расширение рабочей области. Через него удалось добавить собственное сочетание клавиш и запустить установку другого расширения с обходом проверки доверия к издателю.
Демонстрация атаки строилась вокруг репозитория с блокнотом Jupyter и локальным расширением внутри каталога .vscode/extensions. При открытии подготовленного файла сценарий ждал появления уведомления, имитировал нажатие для принятия основного действия, затем запускал новое сочетание клавиш и устанавливал расширение, которое извлекало токен GitHub.
После установки вредоносное расширение обращалось к программному интерфейсу GitHub, получало список доступных приватных репозиториев и выводило украденный токен. Автор подчёркивает, что демонстрация не была скрытой атакой, но показала реальный путь к тому, чтобы украсть доступ через один переход по ссылке.
Уязвимость затрагивала не только github.dev, но и настольную версию Visual Studio Code. Правда, для настольного варианта злоумышленнику пришлось бы убедить жертву клонировать подготовленный репозиторий и открыть вредоносный блокнот. При наличии другой ошибки в веб-представлении последствия могли бы быть тяжелее, вплоть до выполнения кода на компьютере.
Снизить риск можно, очистив файлы cookie и локальные данные сайта github.dev. Если пользователь раньше не проходил начальный экран входа в github.dev, при открытии подозрительной ссылки появится дополнительный диалог, и страницу можно будет закрыть. Если данные сайта уже сохранены, github.dev может открыться без предупреждения.
Автор публикации отдельно отметил, что часть защит Visual Studio Code всё же сработала. Жёсткая политика безопасности содержимого и очистка HTML в некоторых местах помешали расширить атаку через другие сценарии. Ошибка, однако, показала, что механизм, который передаёт сочетания клавиш из изолированного окна в основной редактор, может стать опасным каналом управления.
Автор раскрыл уязвимость публично 2 июня 2026 года. За час до публикации он сообщил о проблеме своему старому контакту в службе безопасности GitHub, после чего выложил описание и создал обращение в баг-трекере Visual Studio Code.