Безопасно ли сканировать QR-код экспорта Google Authenticator?
Только если вы сами его сгенерировали на своём старом телефоне и немедленно переносите данные на новый. Если кто-то другой показывает вам этот QR-код — не сканируйте его.
Google Authenticator и ряд совместимых приложений (Aegis, Raivo OTP, 2FAS) позволяют «экспортировать» сохранённые аккаунты 2FA для переноса на новое устройство. Экспорт представляет собой QR-код с URI, начинающимся на otpauth-migration://. Внутри этого URI находится единый пакет в формате protocol buffer (схема Google MigrationPayload), содержащий все аккаунты сразу: издателя, имя аккаунта, секретный ключ, алгоритм, количество цифр, тип (HOTP / TOTP) и счётчик.
Формат изначально не был задокументирован, но был реверс-инжинирован и реализован несколькими совместимыми приложениями. Google впоследствии опубликовал спецификацию protobuf.
Один QR-код может содержать десятки аккаунтов. Визуально он неотличим от любого другого QR-кода.
Почему один QR-код пакета уникально опасен
Обычный QR-код otpauth:// для настройки опасно сканировать без запроса, но радиус поражения — один аккаунт. Радиус поражения миграционного QR-кода — каждый аккаунт в вашем аутентификаторе. Если злоумышленник сфотографирует экран с этим QR-кодом — у вас за спиной в кофейне, через камеру видеонаблюдения, которую вы не заметили, через прозрачное стеклянное окно — он уйдёт с возможностью обойти 2FA во всех затронутых аккаунтах. Навсегда. До тех пор, пока вы вручную не смените каждый секрет, что большинство сервисов делать не упрощают.
Секреты в пакете не имеют срока действия. В отличие от токена сессии (который истекает), секреты 2FA постоянны — до тех пор пока вы сами их не смените. Кто получил пакет, может генерировать корректные коды годами.
Именно поэтому наш сканер показывает результат «подозрительный» для каждого otpauth-migration:// QR-кода — не потому что формат сломан, а потому что обладание таким QR — это обладание вашими 2FA-учётными данными.
secret — необработанные байты зерна. Это и есть ключевой материал.
name — метка аккаунта (например, alice@acme.com).
issuer — название сервиса (например, ACME, GitHub).
algorithm — SHA1 / SHA256 / SHA512 / MD5.
digits — 6 или 8 цифр в коде.
type — TOTP (на основе времени) или HOTP (на основе счётчика).
counter — текущее значение счётчика для записей HOTP.
Что показывает наш сканер, а что намеренно скрывает
✓ Отображается
Для каждой записи в пакете результат проверки показывает issuer (ACME, GitHub, AWS), account name (alice@example.com) и тип (TOTP/HOTP). Это идентифицирует учётные записи, не раскрывая их секретов.
Версия схемы, индекс пакета, размер пакета и идентификатор пакета также отображаются — полезно для проверки того, что все QR-коды многочастного экспорта захвачены корректно.
✗ Никогда не декодируется
Необработанные байты secret никогда не попадают в вывод результата проверки. Наш анализатор проверяет наличие и длину зерна, но не возвращает его значение.
Это гарантируется набором тестов: мы передаём анализатору вручную созданные protobuf-нагрузки, содержащие контрольные строки (SECRET_SEED_1, SECRET_SEED_2), и проверяем, что эти строки не появляются в сериализованном выводе вердикта. Регрессия в этом месте приводит к сбою CI.
Когда (и как) им пользоваться
Законный сценарий: вы переходите с одного телефона на другой. Старый телефон генерирует QR-код в Google Authenticator или совместимом приложении. Новый телефон сканирует его немедленно, в контролируемой среде, только вами.
Опасные сценарии использования:
Снимки экрана с QR-кодом. Скриншот, сохранённый в облачно синхронизируемых фотографиях (iCloud, Google Photos), становится доступен везде, где хранится ваш фотоальбом.
Отправка QR-кода через мессенджер. Даже ненадолго — любой с доступом к переписке, резервным копиям или снимкам экрана получает весь пакет.
Публикация QR-кода на форуме за помощью. Это случается чаще, чем можно подумать. Некоторые просят подтвердить, что «QR-код выглядит правильно».
Публичные плакаты / вывески, ошибочно принятые за QR-коды для настройки. Формат визуально неотличим от QR-кода для настройки одного аккаунта.
Если вы подозреваете, что QR-код миграции был скомпрометирован
Считайте это утечкой учётных данных для каждого аккаунта в пакете. Шаги по восстановлению:
Войдите в каждый затронутый сервис и смените секрет 2FA. Большинство сервисов позволяют это сделать в разделе Аккаунт → Безопасность → Двухфакторная аутентификация → Отключить, затем заново подключить.
Для сервисов, не поддерживающих смену секрета (редкость), удалите 2FA и добавьте заново через новый QR-код настройки.
Проверьте историю входов в каждый затронутый аккаунт.
Удалите оригинальный QR-код экспорта со всех устройств и из облачно синхронизируемых фотобиблиотек, где он мог сохраниться.
Злоумышленник с пакетом может генерировать корректные 2FA-коды годами — пока вы не смените секреты.
Загрузите изображение QR-кода или вставьте URI otpauth-migration://. Результат проверки покажет каждый аккаунт в пакете (без секретов) и подтвердит, что кодирование корректно.