Один клик по ссылке github.dev — и злоумышленник получает твой токен ко всем репозиториям

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

Как ссылка на github.dev превращается в кражу токена ко всем репозиториям

Выпадающее меню перехода в github.dev из репозитория GitHub
Выпадающее меню перехода в github.dev из репозитория GitHub

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 обходится, потому что локальные расширения в доверенном воркспейсе доверяются автоматически.

Граница доверия postMessage между webview и редактором
Граница доверия postMessage между webview и редактором

Когда расширение установлено, оно работает с полными правами, достаёт токен из памяти и идёт в 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.

Следующая новость · 14 из 24 Читать дальше
📈Biz

Бьюри из «Игры на понижение»: ни SpaceX, ни Anthropic не стоят $1 трлн, спрос на ИИ — «ложный сигнал»

В S-1 SpaceX — выручка $18,7 млрд и убыток $4,9 млрд. «Ничто здесь не говорит про $1 трлн, тем более $2 трлн», — пишет Бьюри. В треде напоминают: он был прав в 2008-м и катастрофически неправ последние десять лет.

★ 128 · 💬 150 · businessinsider.com · 4 мин