Кликни раз — и твой Github токен утек

03.06.2026 · 5 мин

Знаешь, что меня бесит в безопасности? Когда баг выглядит как небольшая досада, а последствия — катастрофа.

Кликни раз — и твой 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.dev, GitHub передаёт ему OAuth токен. И этот токен не ограничен одним репозиторием — он даёт доступ ко всем репозиториям твоего аккаунта.

Изоляция через iframe и её подвох

VSCode использует вебвью (webview) для безопасности: код расширений и превью файлов запускается в изолированном iframe с другим origin (vscode-webview://...). Это не даёт скриптам из вебвью получить доступ к основному приложению.

Но есть нюанс: пользователи хотят нормально работать с клавиатурой внутри вебвью. Например, Ctrl+Shift+P для командной палитры должен работать везде.

Решение? VSCode перехватывает нажатия клавиш через postMessage — специальный API для общения между разными origins:

ОСНОВНОЕ ОКНО VSCode ◄─── postMessage ───► ВЕБВЮ (iframe)
         ▲                                        ▲
    keydown events                          handleInnerKeydown()
Передача событий между изолированными контекстами

Казалось бы, безобидно. Но вот подвох: вебвю может сама генерировать эти события.

Цепочка эксплуатации

Автор статьи показывает, как злоумышленник может это использовать:

Ctrl + Shift + P → command palette → install extension → Enter
ЦЕПОЧКА АТАКИ "ОДИН КЛИК"
─────────────────────────
Жертва кликает ссылку на repo.attacker.com
      
      ▼ Открывается github.dev с вредоносным контентом
      
┌─────────────────────────────────┐    ┌──────────────────────┐
│ Вебвю злоумышленника            │    │ Основное окно VSCode │
│ ─────────────────               │    │                      │
│ • Генерирует keydown events     │───▶│ • Выполняет команды  │
│ • Манипулирует UI               │    │ • Устанавливает      │
└─────────────────────────────────┘    └──────────────────────┘

Результат: произвольный код выполняется от имени жертвы,
токен GitHub украден.
Механизм эксплуатации уязвимости

Почему это серьёзно

Давай поймём масштаб:

Как проверить свой риск

Если ты разработчик и пользуешься github.dev:

В идеале — временно отключи авторизацию через OAuth для github.dev или используй отдельный аккаунт для экспериментов.

Что сделали правильно

Автор отмечает несколько моментов из практики responsible disclosure:

Это показывает, что команда VSCode серьёзно относится к безопасности даже в edge-кейсах.

Итог

Баг не космически сложный — просто цепочка из архитектурных решений, каждое из которых имеет смысл по отдельности:

Ничего революционного, но именно такие composed vulnerabilities часто становятся реальными проблемами в продакшене.

Мораль: один клик действительно может стоить тебе всех ключей доступа к коду.

Ссылки

Дмитрий Полухин — продуктовый дизайнер. Пишу про разработку, AI и дизайн интерфейсов. Обо мне, контакты и профили.