← Блог

Токен на скриншоте: как API-ключи утекают без всяких хакеров

Чтобы слить API-ключ, хакер не нужен. Хватит созвона в четверг: вы показываете коллеге, что баг воспроизводится, а половину экрана занимает вкладка с заголовком Authorization: Bearer eyJhbGciOi… целиком.

В отчёте GitGuardian за 2026 год около 28 % инцидентов с секретами случились за пределами кода: в Slack, Jira и Confluence. Авторы отдельно отмечают, что такие ключи обычно пересылают во время срочной починки, когда думать о них некогда. (State of Secrets Sprawl 2026)

Пять бытовых сцен#

Скриншот в тикете. «Вот запрос, вот ошибка». На скриншоте заодно и заголовки, и в них токен. Тикет видят все, у кого есть доступ к проекту, включая подрядчиков.

Демонстрация экрана. На созвоне вы переключаетесь между вкладками, и где-то мелькает окружение с ключами. Созвон записывается, запись лежит в общей папке.

Экспорт коллеге. Коллекцию или окружение отправили файлом, чтобы у коллеги «всё сразу заработало». В файле значения лежат открытым текстом, а файл лежит в чате, пока чат существует.

Команда cURL в чате. Самый удобный способ показать запрос: скопировал, вставил, коллега повторил. Токен едет внутри команды, прямо в строке с -H "Authorization: …".

Публичная ссылка. Коллекцию выложили, чтобы показать партнёру, и забыли, что там живое окружение. В декабре 2024 года исследователи CloudSEK нашли больше 30 000 публичных рабочих пространств Postman, из которых утекали токены доступа, refresh-токены и ключи сторонних API. Одной из причин исследователи называют случайно открытые коллекции и окружения. (CloudSEK) Сейчас Postman по умолчанию проверяет публичные пространства сканером секретов и удаляет найденное, а ключи предлагает держать в локальном хранилище Postman Vault.

Ни в одной из этих сцен никто ничего не взламывал: ключ уходил вместе с тем, что человек хотел показать.

Ключ идёт по цепочке: поле пароля, скриншот, чат, задача в трекере, интернет. Под каждым шагом число людей, которые его видят: 1, 1, 12, 40 и бесконечность
Сколько людей видит ключ на каждом шаге. Обратно его уже не забрать

Секретные переменные: звёздочки прячут, но не запирают#

Многие API-клиенты умеют прятать значение переменной за точками или звёздочками: ••••••••. Полезная вещь, если помнить, от чего она защищает.

Точки скрывают значение на экране, и на созвоне или скриншоте его не видно. На диске оно остаётся открытым текстом и спокойно уезжает в экспорт, синхронизацию и бэкап. Получается шторка на окне: с улицы не видно, но дверь не заперта.

На экране точки, а в файле тот же токен целиком

Настоящую защиту дают другие вещи: шифрование, хранилище секретов и токены с коротким сроком жизни. Они помогают, даже если файл или его копия уже попали не к тому человеку. Проще всего из этого завести короткоживущий токен, о нём ниже.

В Tetiva так же. Флаг «секрет» у переменной влияет только на то, как значение выглядит на экране. Хранится оно как обычно: в локальной базе открытым текстом, и синхронизируется вместе с остальными переменными. На сервере данные зашифрованы, но сервис их читает, чтобы отдавать вашим устройствам. В документации так и написано: секретность нужна против случайного скриншота и демонстрации экрана, а не против доступа к вашему диску.

Маскировка при этом всё равно помогает: скриншот и созвон как раз две сцены из пяти.

Что инструмент может взять на себя#

Tetiva прячет или вырезает ключи в нескольких местах, где они обычно утекают.

Секретные значения скрыты точками в окне окружений, в подсказке при наведении на переменную и в автодополнении. AI-агентам, которые подключаются к приложению по MCP, секретные значения не отдаются вообще.

Если повторить запрос из истории кнопкой «Повторить», черновик приходит без авторизации: Authorization, Cookie и другие заголовки с учётными данными вырезаны.

Перед публикацией коллекции ссылкой снимок чистится прямо на вашем компьютере, а сканер ищет в описаниях, примерах и скриптах всё, что похоже на ключи. Пока есть предупреждения, кнопка «Опубликовать» ждёт галочку «Проверено». Зачем вообще публиковать коллекцию ссылкой, рассказано в статье про final_v2.

Если есть предупреждения, сначала отметьте «Проверено»

Сканер может пропустить ключ в переменной с именем x, особенно если значение похоже на обычное слово.

Привычки перед тем, как показать экран#

  1. Держите токены в переменных. Тогда в поле заголовка будет видно {{token}}, и сам ключ на скриншот не попадёт. Замок спрячет значение ещё и в окне окружений.
  2. Перед созвоном переключитесь на тестовое окружение. Заодно не отправите ничего в прод, об этом у нас есть отдельная история.
  3. Показывайте на созвоне только окно клиента.
  4. Если показываете ошибку 500, обрежьте скриншот до ответа: заголовки на нём не нужны.
  5. Для демо и обучения заведите отдельный токен с коротким сроком жизни.
  6. Перед тем как вставить команду cURL в чат, замените в ней токен на <TOKEN>.
  7. Перед тем как отправить экспорт окружения, откройте файл и посмотрите на него глазами.

Если уже утекло#

Удалить сообщение недостаточно: его успели прочитать, оно пришло кому-то уведомлением на почту, его могли процитировать в другом треде. Действуйте по порядку.

  1. Отзовите ключ и выпустите новый. Это главное: по данным того же отчёта GitGuardian, 64 % ключей, которые утекли в 2022 году и были действующими, работали и в январе 2026-го.
  2. Замените ключ везде, где он используется: в окружениях, в CI, в конфигах сервисов.
  3. Попросите владельца сервиса проверить журналы: не пользовался ли ключом кто-то ещё.
  4. Найдите копии и удалите их: тикеты, треды, записи созвонов, экспорты. Удалять стоит после отзыва ключа, а не вместо него.
  5. Разберитесь, через какую из пяти сцен ключ ушёл, и заведите для неё привычку из списка выше.

Если сейчас вспомнился конкретный скриншот, проверьте, работает ли ещё тот ключ. Если работает, отзовите.