Критическая уязвимость в LangChain угрожает миллионам развертываний ИИ

vulnerability

Специалисты по кибербезопасности обнаружили критическую уязвимость в популярном фреймворке для разработки приложений с искусственным интеллектом LangChain. Проблема, получившая идентификатор CVE-2025-68664, позволяет злоумышленникам извлекать конфиденциальные данные, такие как секреты из переменных окружения, и потенциально выполнять произвольный код в уязвимых системах.

Детали уязвимости

Уязвимость была публично раскрыта 25 декабря 2024 года исследователем Ярденом Поратом (Yarden Porat) из компании Cyata. Она затрагивает фундаментальную библиотеку "langchain-core", лежащую в основе одного из самых распространенных в мире ИИ-фреймворков. Общий счетчик загрузок LangChain приближается к 850 миллионам, из которых 98 миллионов пришлись только на последний месяц, что подчеркивает масштаб потенциальной угрозы.

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

Проблема затрагивает приложения, использующие стандартные функции LangChain, включая "astream_events(version="v1")", "Runnable.astream_log()", "RunnableWithMessageHistory" и различные механизмы кэширования. Наиболее опасный вектор атаки связан с инъекцией через поля ответов языковых моделей, такие как "additional_kwargs" или "response_metadata". Эти данные могут быть сериализованы и десериализованы в рамках стандартных потоковых операций.

В случае успешной эксплуатации злоумышленники могут извлекать секреты из переменных окружения. Для этого достаточно внедрить специально сформированную структуру данных, например, "{"lc": 1, "type": "secret", "id": ["ENV_VAR"]}", в процессе десериализации при активированной настройке "secrets_from_env=True". Ранее эта настройка была включена по умолчанию, что повышало риски. Более того, атакующие могут инстанцировать классы с контролируемыми параметрами внутри доверенных пространств имен. Эта возможность потенциально позволяет инициировать сетевые вызовы, операции с файлами или даже выполнение кода через механизм рендеринга шаблонов Jinja2.

Критичность уязвимости подтверждается ее оценкой по шкале CVSS (Common Vulnerability Scoring System) - 9.3 балла. Разработчики LangChain оперативно отреагировали на угрозу. Патчи, устраняющие ошибку и ужесточающие политики безопасности по умолчанию, выпущены в версиях 1.2.5 и 0.3.81. Ключевые изменения включают в себя исправление бага с экранированием, а также пересмотр конфигураций по умолчанию.

Теперь параметр "allowed_objects" по умолчанию установлен в значение "'core'", что ограничивает десериализацию только основными объектами фреймворка. Настройка "secrets_from_env" изменена с "True" на "False", чтобы предотвратить утечку секретов. Кроме того, использование шаблонов Jinja2 по умолчанию блокируется новым параметром "init_validator". Разработчики утверждают, что для большинства пользователей, работающих со стандартными типами LangChain, обновление пройдет без сбоев. Однако кастомные реализации, возможно, потребуют дополнительной адаптации кода.

Важность обнаружения уязвимости подчеркивается рекордным размером вознаграждения, выплаченного командой LangChain. За данный инцидент исследователь получил максимальную в истории проекта сумму баунти - 4000 долларов. Эксперты настоятельно рекомендуют всем организациям, использующим LangChain в продакшн-среде, немедленно обновить библиотеки до исправленных версий. В условиях массового распространения фреймворка промедление с установкой патчей создает значительные риски для безопасности ИИ-приложений по всему миру.

Ссылки

Комментарии: 0