Практика конфиденциальности ·

После утечки переменных окружения в облаке новый ключ нельзя снова слать в чат

Отозвать старый ключ — только половина работы. Как только новый API-ключ попадает в Telegram, на скриншот или в тикет, остаётся открытая копия: её можно найти поиском, синхронизировать и выгрузить архивом. Ниже разбираем вторую утечку на публичном инциденте и границу передачи, которую можно проверить сразу. Это не инструкция к одноразовой ссылке.

Сверить следы в каналах Передача с локальным шифрованием Без регистрации
00 / Содержание

Сначала отличите, какой раунд утечки

Статья отвечает только на вопрос, почему после ротации новый ключ нельзя снова слать в окно чата. Это не обход формы Burn-Link и не полный разбор инцидента одной платформы.

01 / Два раунда

Опасен именно второй раунд

Первый раунд случается на стороне хостинга: старый ключ уже прочитали чужие. Второй — у вас в руках: новый ключ становится сообщением, которое останется.

В конце августа 2026 года облачная платформа деплоя Zeabur опубликовала инцидент «Unauthorized Access to Project Environment Variable Data». На официальной странице статуса сказано: злоумышленник воспользовался утёкшими внутренними административными учётными данными AWS, добрался до основной базы и точечно выгружал Variables проектов. Цель — API-ключи ИИ-сервисов и другие секреты, которыми можно пользоваться сразу.

Там же перечислены имена переменных: OPENAI_API_KEY, ANTHROPIC_API_KEY, OPENROUTER_API_KEY, DATABASE_URL, AWS_ACCESS_KEY_ID, а также типичные формы JWT, Stripe и GitHub. Пользовательские имена считались скомпрометированными, если значение совпадало с такими форматами. Zeabur просил отозвать и заменить перечисленные секреты и проверить расход у сторонних провайдеров. Скриншот «полный дамп в продаже» на странице статуса назван неподтверждённым: имеющихся у компании доказательств недостаточно. В этой статье его тоже не считаем фактом.

У таких инцидентов первая помощь почти всегда одна: отозвать старый ключ, сверить расход, выпустить новый. Первый раунд уже произошёл на стороне хостинга. Строку из чужих рук не вернёшь. Команды пропускают второй: консоль провайдера показала новый ключ, и его всё равно нужно отдать коллеге, вставить на другой машине или кинуть во временный тикет. Если этот шаг — окно чата, «только что ротированный открытый текст» оказывается в записи, которую можно найти поиском, синхронизировать и выгрузить с правами администратора.

Имя платформы здесь только якорит дату и открытый источник. Вывод годится для любой схемы «сначала ротация, потом передача»: пароль базы, токен CI, временный пароль SSH. Опасность не в том, что коллега увидит секрет. Опасность в том, что каждый прыжок может оставить полную открытую копию. Статья не чинит hardening хостинга и не продаёт UsePwd как сейф, который мог бы остановить чтение на стороне платформы.

02 / Следы

Что оставляет окно чата

Мессенджер сделан так, чтобы сказанное можно было найти снова. Для повседневной работы это плюс, для API-ключа — дыра.

Вставьте в канал строку, которая начинается с sk-, и сразу появится несколько копий. Тело сообщения попадает в историю рабочего пространства. Десктоп и телефон держат свой кэш. Многие продукты ещё кладут текст в серверный поисковый индекс, чтобы через три месяца по слову «openai» вытащить его обратно. Выгрузка для админа, юридический hold и архив переписки при увольнении уносят тот же открытый текст. Удалить одно сообщение обычно недостаточно: пуш уже прочитан, клиент уже скачал историю, а утилита скриншотов уже сохранила кадр.

Это другой вопрос, чем «я доверяю коллеге». Коллеге ключ нужен, чтобы сервис снова заработал. Канал по умолчанию хранит искомую рабочую запись, а не секрет, который должен жить только пока его читают. Написать «новый ключ ниже» — значит сообщить всем, кто когда-нибудь сможет искать по этому каналу: людям, которых добавят в следующем квартале, тем, у кого есть право на аудиторскую выгрузку, и тем, кто в будущем доберётся до бэкапа. Обзоры по поиску секретов давно называют это известным путём расползания; в рекомендациях GitGuardian по API-ключам прямо сказано: не передавайте секреты в открытом виде в мессенджерах вроде Slack. Журнал «Код» формулирует жёстче: любая передача токена через мессенджер, почту или демонстрацию экрана приравнивается к компрометации — контроль над строкой вы теряете в момент отправки.

Мессенджер
Искомый пузырь с открытым текстом

Telegram, Slack, Discord и Mattermost сохраняют тело. Отзыв сообщения не гарантирует, что кэш на другой стороне исчез.

Почта и документы
Полная копия, которую можно переслать

Тема, вложение и комментарий в облачном документе индексируются. Одно «переслать всё» снова дублирует файл.

Тикеты и скриншоты
Открытый текст в пикселях архива

Jira, YouTrack и Яндекс Трекер хранят картинки по номеру задачи. Бэкап альбома, проектор и запись созвона — отдельные каналы.

Проверка грубая и рабочая: откройте тот чат, которым команда реально пользуется, и поищите sk-, AKIA, ghp_, Bearer или BEGIN PRIVATE KEY. Каждый хит — прошлое «пока кину». Эти строки не становятся безвредными от того, что в консоли облака нажали Rotate. Старый ключ мёртв у провайдера. Копия в чате всё ещё лежит.

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

Граница

Удалить ключ из чата — не конец утечки. Собеседник мог уже скопировать, снять скриншот или положить строку в свой менеджер паролей. Статья о том, как не создавать новую открытую копию. Это не «удалил сообщение — секрет вернулся».

03 / Шаги

Где ротация снова даёт течь

Письмо об инциденте обычно говорит: «немедленно ротируйте и проверьте счёт». Течёт на самом деле двадцатиминутная передача после этого.

Разложите типичный аварийный runbook на стол: опасность не в клике «войти в консоль провайдера и выпустить новый ключ». Опасность — в шагах вокруг. Кто-то снимает старый ключ и спрашивает коллегу «это тот?». Кто-то захватывает всю страницу консоли, и в «Фото» вместе с ключом уезжают адресная строка, имена других проектов и цифра из биллинга. Кто-то выпускает новый ключ, коллеги нет на месте, и в канал летит «пока вот этим». Все три превращают открытый текст в объект, который будут хранить.

Общий диск и git пропускают ещё легче. Сырой .env в папке команды или коммит-пример, в котором ключ всё ещё есть, — ещё одна копия. Облачная синхронизация пишет файл на каждое вошедшее устройство: Яндекс Диск, Google Диск, общий каталог на NAS. Позже поменять файл недостаточно: строка остаётся в старых коммитах. Локальную копию одного файла до 5 ГБ лучше превратить в шифротекст в текущей вкладке, а не загружать открытый .env как обычный документ. Шифрование файлов UsePwd делает потоковое локальное шифрование AES-256-GCM и пишет .lock / .enc. Файл по умолчанию не загружается. Это «оставить себе файл с шифротекстом», а не «засунуть ключ в чат».

Сначала скриншот, потом ротация 01 Альбом, AirDrop и запись созвона сохранят старый ключ вместе с новым.
«Пока вот этим» в канале 02 История канала переживает инцидент. Кто вступит позже, всё равно найдёт поиском.
Открытый .env на общем диске 03 Синхронизированная папка — по копии на устройство. Удалить облачный файл недостаточно.
Полный ключ внутри тикета 04 Система поддержки архивирует по номеру. Подрядчик или следующий эскалационный тикет откроет его снова.

В инциденте Zeabur многие сначала увидели не строку лога «переменные выгружены», а просьбу смотреть расход и счета у ИИ-провайдеров. Это рабочий сигнал: старым ключом, возможно, уже вызывали API. Если новый ключ затем поедет тем же чатом, которым команда пользуется всегда, второе вторжение на хостинг не нужно. Достаточно увидеть, как команда обычно передаёт секреты, и подождать следующий.

Новый пароль сам по себе должен быть достаточно случайным. Случайный режим — от 6 до 128 символов, по умолчанию 16; короче 8 инструмент предупреждает, что секрет слабый. Генерируйте в генераторе паролей в текущей вкладке — регистрироваться не нужно. После этого не «сохраняйте в браузере» и не снимайте строку менеджера паролей для коллеги. Это снова канал скриншота.

04 / Сравнение

Открытая вставка и локальное шифрование: что остаётся

Короткий секрет нужно отдать другому человеку, и вы не хотите, чтобы в истории канала осталась строка, которой можно пользоваться как есть. Сначала сравните, что остаётся, потом выбирайте инструмент.

Окно чата отдаёт открытый текст. Копировать удобно обеим сторонам. Цена — рабочее пространство, поисковый индекс и бэкапы держат по копии. Вложение в письме устроено так же: как только .env или блокнот ушёл вложением, почтовый сервер и оба клиента имеют полный файл.

Одноразовая зашифрованная ссылка отдаёт «номер шифротекста плюс материал расшифровки, который остаётся на устройстве». Burn-Link UsePwd шифрует текст в текущей вкладке через Web Crypto и AES-256-GCM, на сервер уходит только шифротекст. Ключ расшифровки дописывается после # в s.html?id={id}#{key}. Создать и прочитать можно сразу — ни одна сторона не регистрируется. Сервер хранит шифротекст, срок в часах и число прочтений. Открытый текст он не видит, и аккаунтов, по которым можно «восстановить по пользователю», нет.

Ключ после # закрывает слой журналов доступа хостинга и строки HTTP-запроса: браузер не отправляет фрагмент как часть запроса. Этот слой разобран в статье Почему фрагмент # в URL не попадает в логи сервера. Здесь — следующий слой. Даже если ключ не входит в строку запроса UsePwd, полная ссылка в чате всё равно сохраняется целиком в этом продукте. У кого есть полный URL, тот откроет страницу чтения и расшифрует, пока не исчерпан лимит прочтений. Burn-Link ограничивает срок жизни шифротекста на сервере и число чтений. Он не мешает получателю снять скриншот или переслать ссылку.

Открытый текст в чате
В канале лежит сам ключ

История ищется. После отзыва старого облачного ключа строка в чате всё ещё там.

Burn-Link
В канале лежит полный URL

Когда лимит прочтений исчерпан, сервер удаляет шифротекст. Мёртвая ссылка — не стёртая история чата.

Шифрование файлов
В канале лежит файл .lock

Файл с шифротекстом можно положить на диск. Пароль передайте другим каналом — не в том же сообщении.

Поэтому Burn-Link подходит для короткого секрета, который должен закончиться после прочтения: новый API-ключ, временный пароль базы, одноразовый код. Это чище, чем вставить sk- в канал: в истории больше нет строки, которой можно сразу вызвать API провайдера. Когда получатель открыл ссылку и счётчик дошёл до заданного числа, шифротекст на сервере удаляется, и поздний результат поиска не откроет открытый текст. Каналу отправки всё равно нужно доверять: полную ссылку не публикуйте в открытом канале и не кладите рядом скриншот пароля.

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

Не переворачивайте смысл

Передача с локальным шифрованием не откатывает ключи, которые уже выгрузили на стороне хостинга. Сначала отзовите старые. Статья только о том, как отдать коллеге новый ключ и не оставить вторую открытую копию.

05 / Проверка

Как проверить передачу сразу

Цель — не доказать, что «никто в мире не увидит». Цель — доказать: в этой передаче в истории чата не осталось открытого текста, которым можно пользоваться.

  1. 01
    Сначала отзовите старый ключ, потом выпускайте новый

    В консоли провайдера отзовите всё, что уже утекло. Для упражнения ниже не берите боевой ключ. Достаточно строки, которую вы сами узнаете, например demo-not-a-real-key-2026.

  2. 02
    Откройте Burn-Link раньше, чем чат

    Перейдите на Burn-Link. Страница работает сразу — без входа. Зашифруйте пример в ссылку. Форма должна быть s.html?id={id}#{key}: в query только номер, ключ только после #.

  3. 03
    Отправьте ссылку. Пример ещё раз не вставляйте

    В окне чата должен быть только полный URL. Если написать «ключ такой-то, ссылка ниже», вы оставляете открытый текст и ссылку одновременно, и одноразовый материал теряет смысл.

  4. 04
    Когда получатель открыл, поищите по каналу

    Ищите саму строку примера. В теле сообщений её быть не должно — только ссылка. Затем ищите s.html?id= и убедитесь, что URL не обрезан до #. Без фрагмента собеседник заберёт шифротекст и не расшифрует его локально.

  5. 05
    Если нужно, посмотрите запрос в панели Network

    Тело POST при создании — шифротекст и два числа, не текст примера. В последующих GET в пути должен быть только id. Это проверка «попал ли ключ в HTTP», она дополняет страницу О безопасности. В проде на /tj/ могут уходить имена страниц и кнопок для аналитики. Это не открытый текст.

Для тикетов нужен ещё один проход. На скриншоте, который собираетесь отправить в поддержку, откройте очистку конфиденциальности и проверьте, не виден ли токен целиком. Очистка идёт в текущей вкладке; исходный текст в аналитику не пишется. Вы проверяете «остался ли в пикселях ключ, который можно вставить и использовать», а не «безопасна ли система тикетов».

06 / Выбор

Когда ссылка тоже не подходит

Одноразовая ссылка уменьшает «открытый ключ в истории канала». Она не уменьшает «всех, кто видит экран».

Если секрет нужно хранить долго, синхронизировать между устройствами или когда-нибудь восстановить, не используйте Burn-Link и не держите историю чата как сейф. Это работа менеджера паролей. У UsePwd нет аккаунтов и хранилища. Когда лимит прочтений исчерпан или ссылка потеряна, вернуть секрет за вас нельзя.

Если секрет — ценный мастер-ключ, корневой сертификат или сид кошелька, которым можно перевести деньги, ни ссылки, ни чата недостаточно. Скажите лично, используйте офлайн-носитель или оставайтесь внутри уже установленного сквозного канала. Схема с фрагментом не останавливает уже захваченное устройство, расширение браузера, которое читает текущую страницу, и полный URL на стене переговорки.

Резервная копия файла — другой путь: открытый .env превратите в .lock / .enc на этой машине, затем положите шифротекст на диск. Пароль разблокировки передайте каналом, который не является самим файлом. Не склеивайте два инструмента в одно обещание. Burn-Link задаёт, сколько раз можно прочитать короткий секрет. Шифрование файлов задаёт файл с шифротекстом, который вы оставляете себе.

Вернёмся к вопросу. После того как переменные окружения в облаке утащили, старые ключи нужно отозвать. Короткого пути нет. Новый ключ нельзя снова слать в окно чата, потому что чат по умолчанию хранит искомый открытый текст, а смысл ротации — сразу умертвить старую строку. Не стоит в ту же минуту делать копию, которая проживёт дольше. Когда коллеге нужно один раз — Burn-Link: локальное шифрование, открывается сразу. Когда бэкап оставляете себе — шифрование файлов. На обеих страницах, как и в этой статье, справа в шапке только переключатель языка. Входа нет.

07 / Дальше

Дочитали — проверьте канал

Статья отвечает, почему новый ключ нельзя снова слать в окно чата. Чтобы создать одноразовую зашифрованную ссылку, откройте Burn-Link — регистрироваться не нужно.