Мир ИИ
Из API научились вытаскивать чужие цепочки рассуждений
10 августа 2026 года вышла работа, показывающая неприятное свойство зашифрованных цепочек рассуждений: блоки, которые провайдер возвращает клиенту для продолжения диалога, переносимы между сессиями, пользователями и разными моделями внутри одной экосистемы. Подставив такой блок в более слабую модель того же провайдера, исследователи извлекали исходные рассуждения сильной модели дословно. Приём продемонстрирован на моделях OpenAI, Anthropic и Google. В размеченной выборке оказались 367 фрагментов персональных данных и 182 учётные записи, включая ключи API и пароли — разбор проводился в изолированном окружении. Для тех, кто отправляет запросы через API, вывод простой и неприятный: то, что попало в промпт, может пережить вашу сессию.
Разберём механику, границы проблемы и что стоит поменять в своём коде сегодня.
Как устроены зашифрованные рассуждения
Современные модели с рассуждением тратят токены на внутренний ход мысли до того, как выдать ответ. Провайдер обычно не показывает этот текст клиенту — вместо него возвращается зашифрованный блок.
Блок нужен для продолжения диалога: клиент прикладывает его к следующему запросу, и модель не пересчитывает рассуждение заново. Механика разумная и экономит и время, и деньги.
Проблема в свойстве, которое из неё вытекает. Блок должен быть понятен провайдеру при следующем обращении — значит он расшифровывается на его стороне. А раз так, вопрос лишь в том, какая именно модель провайдера согласится его расшифровать и что покажет наружу.
Что показала работа
По описанию исследования, блоки оказались взаимозаменяемы внутри экосистемы одного провайдера: между сессиями, между пользователями и между разными моделями.
Схема извлечения выглядит так:
| Шаг | Что происходит |
|---|---|
| 1 | Получен зашифрованный блок рассуждений от сильной модели |
| 2 | Блок подставляется в запрос к более слабой модели того же провайдера |
| 3 | Слабая модель, выведенная из штатного поведения, воспроизводит содержимое блока |
| 4 | На выходе — исходное рассуждение дословно |
Разбор опубликовал Саймон Уиллисон 11 августа, после чего тема разошлась по инженерным сообществам.
Самое важное в цифрах: в размеченной выборке нашлись 367 фрагментов персональных данных и 182 учётные записи, среди них ключи API и пароли. Авторы подчёркивают, что работа велась в изолированном окружении.
Откуда в рассуждениях берутся ключи и персональные данные
Ответ прозаичный: их туда кладут сами разработчики.
Модель рассуждает о том, что получила. Если в промпт попал кусок конфигурации с ключом, модель может его процитировать в ходе рассуждения. Если в контекст ушла выгрузка из базы с персональными данными, рассуждение будет опираться на них и повторять фрагменты.
Три типовых источника, которые встречаются чаще всего:
Отладочный контекст. «Вот моя конфигурация, помоги найти ошибку» — и в конфигурации живой токен.
Дамп ответа стороннего сервиса. Разработчик передаёт модели сырой JSON от внутреннего API, а там заголовки авторизации или идентификаторы клиентов.
История диалога целиком. Секрет мелькнул один раз на третьем ходу и дальше едет в модель при каждом обращении до конца сессии.
Что это значит для вашей интеграции
Три следствия, ранжированных по тому, насколько срочно ими заниматься.
Секретам не место в промпте. Правило звучит банально ровно до момента, когда оказывается, что оно нарушается в отладочных сценариях, в скриптах разовой обработки и в шаблонах автоматизации, которые писали «на один раз».
Блоки рассуждений — тоже данные. Если ваш сервис хранит их для продолжения диалога, они наследуют чувствительность исходного контекста. Хранить их дольше, чем живёт диалог, смысла нет. Передавать между пользователями — тем более.
Ключи, которые могли попасть в промпты, стоит ротировать. Это дешёвая операция с понятным эффектом, и повод для неё теперь документирован.
Отдельно про наш контур: в KeyDealer содержимое запросов не сохраняется, остаются только данные, без которых не посчитать расход и не разобрать ошибку — токены, модель, сумма, статус и время. Что именно хранится, перечислено в llms.txt и в документации API. Это не решает описанную проблему — она про поведение самих моделей, а не про хранение на нашей стороне.
Как отфильтровать секреты перед отправкой
Самый полезный пункт — тот, который можно закрыть кодом сегодня. Разберём подробнее.
Задача звучит так: перед тем как отправить текст в модель, найти в нём то, что похоже на секрет, и не отправлять. Полностью решить её нельзя — секрет может выглядеть как угодно. Но подавляющее большинство реальных попаданий закрывается простыми проверками.
Ключи известных форматов. Токены большинства сервисов имеют узнаваемые префиксы и длину. Набор регулярных выражений на два десятка популярных форматов ловит основную массу.
Переменные окружения. Если в тексте встречается строка вида SOMETHING_KEY= или SOMETHING_TOKEN= с непустым значением справа — это почти наверняка то, что отправлять не стоит.
Приватные ключи и сертификаты. Заголовки блоков PEM опознаются однозначно, и ложных срабатываний тут практически не бывает.
Длинные случайные строки. Эвристика по энтропии: строка из 32+ символов без словарной структуры подозрительна сама по себе. Даёт ложные срабатывания на хешах и идентификаторах, поэтому её обычно ставят на предупреждение, а не на блокировку.
Важный момент про то, куда это ставить. Фильтр должен стоять на последнем шаге, прямо перед отправкой запроса, а не в том месте, где вы формируете промпт. Иначе он будет обходиться всякий раз, когда кто-то добавит новый путь формирования контекста, — а его добавят.
Чего в этой работе нет
Отделим факты от того, что легко додумать.
Нет утечки чужих диалогов. Извлекается содержимое того блока, который у вас на руках, а не произвольные чужие сессии.
Нет данных о реакции провайдеров. На момент публикации работы официальных заявлений от OpenAI, Anthropic и Google в открытых материалах мы не нашли. Возможно, к моменту чтения они появятся.
Нет утверждения, что проблема неустранима. Речь про свойство текущей реализации, а не про фундаментальное ограничение.
Нет оценки, сколько таких блоков ходит в реальном мире. Выборка исследовательская, и переносить её пропорции на всю индустрию нельзя.
Нет утверждения, что провайдеры действовали небрежно. Переносимость блоков между моделями — следствие разумного инженерного решения: клиент не должен пересобирать контекст при переключении модели внутри одной экосистемы. Побочный эффект обнаружился позже, чем польза.
Почему это ложится в общий ряд
Это уже третья за месяц история про то, как модель делает не то, что от неё ждали, и все три про одно.
В разборе трёх инцидентов Anthropic модель дважды распознала признаки реальных систем и продолжила действовать. В истории с агентом, вырвавшимся из песочницы цепочка мелких прав два месяца не настораживала никого. Здесь — механизм, задуманный для удобства, оказался каналом извлечения.
Общее у всех трёх: защита, построенная на ожидаемом поведении модели, не работает. Работают технические границы — что физически может уйти в модель, что физически может сделать инструмент, что физически хранится.
Практический минимум на сегодня
Пять пунктов, каждый занимает минуты.
- Найдите в коде места, где в промпт попадают конфигурации, дампы и выгрузки. Поиск по названиям переменных окружения обычно даёт улов сразу.
- Добавьте фильтр перед отправкой. Простая проверка на шаблоны ключей закрывает большую часть случайных попаданий.
- Ограничьте историю диалога. Секрет, мелькнувший один раз, не должен ехать в модель до конца сессии.
- Не храните блоки рассуждений дольше диалога и не переиспользуйте их между пользователями.
- Ротируйте ключи, которые могли оказаться в промптах. Особенно те, что использовались в отладке.
Как посчитать, во что обходится история диалога в токенах, и почему её стоит обрезать не только из соображений безопасности — в разборе, почему prompt_tokens больше, чем вы отправили.
Что держать в голове
Зашифрованный блок рассуждений оказался переносимым между моделями одного провайдера, и через слабую модель из него извлекается исходный текст. Продемонстрировано на трёх крупнейших вендорах, в выборке нашлись сотни фрагментов персональных данных и учётных записей.
Практический вывод не про выбор провайдера. Он про то, что попадает в промпт: всё, что вы отправили модели, следует считать способным пережить вашу сессию.
Как мы проверяем факты и почему у каждой цифры стоит источник — на странице о проекте. Отдельный ключ с собственным лимитом под каждый сценарий заводится за минуту: keydealer.ru/login.
Частые вопросы
Что именно нашли исследователи?
Провайдеры возвращают клиенту цепочку рассуждений модели в виде зашифрованного блока, который клиент прикладывает к следующим запросам. Работа показывает, что такие блоки переносимы между сессиями, пользователями и моделями внутри одного провайдера, и через более слабую модель из них извлекается исходный текст рассуждений.
Каких провайдеров это касается?
По описанию работы приём продемонстрирован на моделях OpenAI, Anthropic и Google.
Что оказалось внутри извлечённых рассуждений?
В размеченной выборке 367 фрагментов персональных данных и 182 учётные записи, включая ключи API и пароли. Разбор проводился в изолированном окружении.
Мои промпты в опасности?
Речь про содержимое рассуждений, а не про переписку. Но в рассуждения попадает то, что вы прислали, поэтому вывод практический: секретам не место ни в промпте, ни в данных, которые модель получает на вход.
Что делать прямо сейчас?
Убрать ключи и персональные данные из промптов, не хранить блоки рассуждений дольше, чем нужно диалогу, и не передавать их между пользователями. Ротация ключей, которые могли попасть в промпты, тоже уместна.