ИИ стал предателем: LangChain взламывают через ответы самой модели — она сама крадёт ваши секреты

ИИ стал предателем: LangChain взламывают через ответы самой модели — она сама крадёт ваши секреты

Нейросеть послушно выполняет и сливает всё: токены, ключи, переменные окружения.

image

В экосистеме LangChain обнаружили критическую уязвимость, которая позволяет атакующему красть секретные данные и даже влиять на ответы больших языковых моделей через промпт-инъекции. Проблема затрагивает пакет LangChain Core (langchain-core) — базовую Python-библиотеку, на которой строятся приложения с LLM и которая отвечает за общие интерфейсы и механизм сериализации объектов.

Уязвимость получила идентификатор CVE-2025-68664 и оценку 9,3 балла по CVSS. О проблеме 4 декабря 2025 года сообщил исследователь Ярден Порат, а внутри проекта она получила неофициальное название LangGrinch.

Суть уязвимости связана с ошибкой сериализации. Функции dumps() и dumpd() в LangChain некорректно обрабатывают словари, содержащие ключ lc. Этот ключ LangChain использует внутри себя для пометки собственных сериализованных объектов. Если такие структуры попадают в данные, контролируемые пользователем, библиотека при последующей десериализации воспринимает их не как обычный ввод, а как легитимные внутренние объекты LangChain.

По словам Пората, это открывает широкое поле для атак. Если злоумышленник добьётся того, чтобы в процессе работы LangChain данные с ключом lc были сначала сериализованы, а затем десериализованы, в системе может быть создан произвольный небезопасный объект. В зависимости от настроек это может привести к утечке секретов из переменных окружения (при включённой опции secrets_from_env), созданию экземпляров классов из доверенных пространств имён вроде langchain_core, langchain или langchain_community, а в отдельных сценариях — даже к выполнению произвольного кода через шаблоны Jinja2.

Отдельно подчёркивается, что ошибка позволяет внедрять структуры LangChain через поля, которые часто формируются на основе ответа модели, — например, metadata, additional_kwargs или response_metadata. Это означает, что LLM-ответ, сформированный под влиянием инъекции, может стать полноценным вектором атаки при последующей сериализации и десериализации.

Разработчики LangChain выпустили обновление, которое заметно ужесточает поведение библиотеки по умолчанию. В функциях load() и loads() появился параметр allowed_objects, позволяющий явно указать, какие классы допустимо сериализовать и восстанавливать. Кроме того, шаблоны Jinja2 теперь заблокированы по умолчанию, а автоматическая загрузка секретов из окружения (secrets_from_env) отключена.

Уязвимость затрагивает следующие версии langchain-core:

  • версии 1.0.0 – 1.2.4 (исправлено в 1.2.5);
  • версии ниже 0.3.81 (исправлено в 0.3.81).

Помимо Python-версии, исследователи обратили внимание на аналогичную проблему в LangChain.js. Там уязвимость также связана с некорректной обработкой объектов с ключом lc и позволяет извлекать секреты и проводить промпт-инъекции. Для неё зарегистрирован отдельный идентификатор CVE-2025-68665 с оценкой 8,6 балла. Она затрагивает пакеты:

  • @langchain/core версий 1.0.0 – 1.1.7 и ниже 0.3.80;
  • langchain версий 1.0.0 – 1.2.2 и ниже 0.3.37.

Во всех случаях уже выпущены исправленные релизы.

С учётом серьёзности проблемы пользователям LangChain настоятельно рекомендуют как можно скорее обновиться до безопасных версий. По словам Пората, наиболее распространённый сценарий атаки проходит именно через поля ответа LLM, которые затем участвуют в потоковой сериализации. Это наглядный пример того, как классические уязвимости проявляются в системах на базе ИИ, где вывод модели по-прежнему остаётся недоверенным вводом, даже если выглядит безобидно.