Кликни раз — и твой Github токен утек
Знаешь, что меня бесит в безопасности? Когда баг выглядит как небольшая досада, а последствия — катастрофа.
Кликни раз — и твой Github токен утек: баг в vscode
Именно так работает уязвимость, которую недавно нашёл Ammaraskar. Один клик по ссылке — и злоумышленник получает токен с доступом ко всем твоим репозиториям, включая приватные.
Давай разберёмся, как это работает и почему это вообще возможно.
Как работает атака
Github.dev — дверь в твой аккаунт
У GitHub есть удобная фича: вместо github.com пишешь github.dev — и получаешь лёгкую версию VSCode прямо в браузере.
БРАУЗЕР ПОЛЬЗОВАТЕЛЯ
─────────────────────
┌─────────────────────────────────────────┐
│ github.dev/repos/your-project │
│ │
│ ┌───────────────────────────────┐ │
│ │ VSCode в браузере │ │
│ │ ─────────────────── │ │
│ │ Редактор файлов │ │
│ │ Терминал │ │
│ │ Git интеграция │ │
│ └───────────────────────────────┘ │
│ │
│ ▲ OAuth токен │
└─────────│───────────────────────────────┘
▼ github.com API
Токен имеет доступ ко ВСЕМ репозиториям,
не только к текущему.
Проблема начинается здесь: когда ты открываешь github.dev, GitHub передаёт ему OAuth токен. И этот токен не ограничен одним репозиторием — он даёт доступ ко всем репозиториям твоего аккаунта.
Изоляция через iframe и её подвох
VSCode использует вебвью (webview) для безопасности: код расширений и превью файлов запускается в изолированном iframe с другим origin (vscode-webview://...). Это не даёт скриптам из вебвью получить доступ к основному приложению.
Но есть нюанс: пользователи хотят нормально работать с клавиатурой внутри вебвью. Например, Ctrl+Shift+P для командной палитры должен работать везде.
Решение? VSCode перехватывает нажатия клавиш через postMessage — специальный API для общения между разными origins:
ОСНОВНОЕ ОКНО VSCode ◄─── postMessage ───► ВЕБВЮ (iframe)
▲ ▲
keydown events handleInnerKeydown()
Казалось бы, безобидно. Но вот подвох: вебвю может сама генерировать эти события.
Цепочка эксплуатации
Автор статьи показывает, как злоумышленник может это использовать:
- Создаёт репозиторий с файлом
.vscode/extensions.json, который рекомендует вредоносное расширение. - Пользователь открывает этот репозиторий на github.dev.
- Скрипт внутри вебвю симулирует нажатия:
Ctrl + Shift + P → command palette → install extension → Enter
- Расширение устанавливается в рабочую область без проверки издателя.
ЦЕПОЧКА АТАКИ "ОДИН КЛИК"
─────────────────────────
Жертва кликает ссылку на repo.attacker.com
▼ Открывается github.dev с вредоносным контентом
┌─────────────────────────────────┐ ┌──────────────────────┐
│ Вебвю злоумышленника │ │ Основное окно VSCode │
│ ───────────────── │ │ │
│ • Генерирует keydown events │───▶│ • Выполняет команды │
│ • Манипулирует UI │ │ • Устанавливает │
└─────────────────────────────────┘ └──────────────────────┘
Результат: произвольный код выполняется от имени жертвы,
токен GitHub украден.
Почему это серьёзно
Давай поймём масштаб:
- Токен = полный доступ. Это не read-only ключ — через github.dev можно читать приватные репы, пушить коммиты, создавать pull requests.
- Условия минимальны. Жертве достаточно просто открыть ссылку на github.dev с подготовленным репозиторием.
- Атака скрытая. Всё выглядит как обычная работа с редактором — никаких предупреждений браузера или антивируса.
Как проверить свой риск
Если ты разработчик и пользуешься github.dev:
- Открой DevTools (F12) в браузере при работе на github.dev.
- Проверь куки и localStorage — там может лежать токен
github-tokenили подобный. - Не кликай подозрительные ссылки на репозитории от незнакомцев.
В идеале — временно отключи авторизацию через OAuth для github.dev или используй отдельный аккаунт для экспериментов.
Что сделали правильно
Автор отмечает несколько моментов из практики responsible disclosure:
- Microsoft исправили баг относительно быстро после уведомления.
- Часть защитных механизмов уже была реализована (проверка издателей).
- Патч был выпущен без публичного раскрытия деталей до исправления.
Это показывает, что команда VSCode серьёзно относится к безопасности даже в edge-кейсах.
Итог
Баг не космически сложный — просто цепочка из архитектурных решений, каждое из которых имеет смысл по отдельности:
- Вебвю нужны клавиатурные события → значит нужен postMessage.
- postMessage позволяет слать любые events → значит можно симулировать input.
- OAuth токен даёт полный доступ → значит одна компрометация = все репозитории под угрозой.
Ничего революционного, но именно такие composed vulnerabilities часто становятся реальными проблемами в продакшене.
Мораль: один клик действительно может стоить тебе всех ключей доступа к коду.
Ссылки
- Оригинальная статья Ammaraskar — разбор уязвимости и цепочки атаки
Дмитрий Полухин — продуктовый дизайнер. Пишу про разработку, AI и дизайн интерфейсов. Обо мне, контакты и профили.