Один клик по ссылке github.dev — и злоумышленник получает твой токен ко всем репозиториям
Исследователь Аммар Аскар собрал цепочку из обычных функций VSCode — обработки клавиш в webview, локальных расширений и доверия к воркспейсу — и показал: достаточно открыть вредоносный github.dev-блокнот, чтобы отдать GitHub-токен с полным доступом ко всем приватным репозиториям.
Как ссылка на github.dev превращается в кражу токена ко всем репозиториям

github.dev — это веб-версия VSCode, в которую можно попасть прямо из любого репозитория, нажав точку. Удобно: редактируешь код в браузере, и редактор уже залогинен в твой GitHub. Именно эта залогиненность, как показал в подробном разборе исследователь Аммар Аскар, и оказывается «первородным грехом»: в памяти вкладки лежит OAuth-токен, и весь вопрос — как до него дотянуться чужому коду.
Что именно нашёл Аскар: атака не ломает песочницу, а пользуется штатной фичей
VSCode рендерит webview через кросс-доменные iframe — это изоляция: код внутри предпросмотра не должен дотягиваться до самого редактора. Но ради удобства нажатия клавиш из webview пробрасываются в основное приложение через postMessage, чтобы работали горячие клавиши. Аскар формулирует дыру прямо:
«Ничто не мешает нашему скрипту, запущенному в недоверенном webview, притвориться пользователем и нажать за него кучу клавиш» — Аммар Аскар, автор разбора
Дальше — цепочка из легальных кирпичиков. Злоумышленник готовит репозиторий, в котором лежат:
- Jupyter-блокнот с markdown-ячейкой, содержащей
<img src="data:foobar" onerror="...">— обработчикonerrorсрабатывает раньше, чем CSP успевает всё заблокировать; - файл
.vscode/extensions.json, рекомендующий «вредоносное» расширение; - локальное воркспейс-расширение прямо в каталоге
.vscode/extensions/.
Полезная нагрузка ждёт ~10 секунд, пока редактор покажет уведомление о рекомендованном расширении, затем «нажимает» Ctrl+Shift+A (принять основное действие уведомления), ждёт полсекунды и жмёт кастомную горячую клавишу. Ключевой трюк — в package.json локального расширения прописана команда установки с параметром "skipPublisherTrust": true. Новая система доверия к издателям из VSCode 1.97 обходится, потому что локальные расширения в доверенном воркспейсе доверяются автоматически.

Когда расширение установлено, оно работает с полными правами, достаёт токен из памяти и идёт в GitHub API. И вот деталь, ради которой всё затевалось:
«Токен не привязан к конкретному репозиторию, с которым ты взаимодействовал, — а значит, имеет полный доступ ко всем остальным репозиториям, к которым у тебя есть доступ» — Аммар Аскар
Чтение приватного кода, пуш вредоносных коммитов, удаление репозиториев, доступ к данным организации. Хуже того: расширение остаётся жить и в следующих сессиях github.dev. Диалог авторизации github.dev показывается только при первом заходе — «если ты хоть раз прошёл его и не чистил local storage браузера, ты полностью попал».
Тред: «это та же проблема, что и плагины из маркетплейса»
В обсуждении разбор хвалят, но разворачивают мысль шире. Инженер, поднявший вопрос модели доверия, указывает, что расширения VSCode и так работают на уровне доверия самого редактора:
«Поверхность атаки тут особенно неприятна тем, что расширения VSCode исполняются с тем же уровнем доверия, что и редактор, а у большинства разработчиков их десятки и они не проверяли выданные разрешения. Вредоносное или скомпрометированное расширение, тихо сливающее GitHub-токены, невозможно заметить без мониторинга сети» — инженер из треда
Нашёлся и пострадавший: участник, у которого недавно увели токены, пишет, что у него увели и GitHub-, и Cloudflare-токены, и вывод у него фаталистский:
«Даже если ты серьёзно относишься к безопасности, на достаточно длинном горизонте тебя всё равно достанут. Лучшее, что можно сделать, — сегментировать и ограничивать ущерб. Не доверяй никому и ничему, всегда исходи из того, что твой токен рано или поздно утечёт» — участник, у которого украли токены
Отдельная ветка — про реакцию Microsoft. Аскар в посте объясняет, почему пошёл на полное публичное раскрытие: в прошлый раз MSRC, по его словам, молча починили его баг без упоминания авторства и пометили как «не имеющий влияния на безопасность». Скептик из треда реагирует едко:
«Классический MSRC. Они поняли, что исследователи всё равно репортят бесплатно. Зачем что-то менять?» — скептик из треда
Звучит и закономерный вопрос про разработческую гигиену в целом. Сторонник минимального сетапа предлагает радикальное:
«Не понимаю, почему больше разработчиков не пробуют Neovim. Мне нравится небольшой сетап, где я знаю, что установлено и что запущено. С VSCode, браузерными IDE, расширениями, синхронизацией, токенами и случайными плагинами становится трудно понять, у чего вообще к чему есть доступ» — сторонник минимального сетапа
Что делать прямо сейчас, если ты пользовался github.dev
Практический вывод простой и неприятный: одна проверенная фича (проброс клавиш ради доступности) пробила насквозь три слоя защиты — изоляцию iframe, строгий CSP и DOMPurify. Не потому что их обошли, а потому что атака не пыталась сбежать из песочницы, а воспользовалась легальным мостом наружу. Если ты заходил на github.dev — очисти cookies и local storage для этого домена и не открывай github.dev-ссылки на незнакомые репозитории. А на уровень выше — это лишний аргумент держать токены сегментированными и не считать «у меня же песочница» гарантией.
Получайте такие разборы каждый день
Главные истории Hacker News — на email, в Telegram или RSS.
Бьюри из «Игры на понижение»: ни SpaceX, ни Anthropic не стоят $1 трлн, спрос на ИИ — «ложный сигнал»
В S-1 SpaceX — выручка $18,7 млрд и убыток $4,9 млрд. «Ничто здесь не говорит про $1 трлн, тем более $2 трлн», — пишет Бьюри. В треде напоминают: он был прав в 2008-м и катастрофически неправ последние десять лет.