Специалисты Check Point Research провели анализ LangGraph - открытого фреймворка для построения многоагентных AI-систем с сохранением состояния. В результате были выявлены три уязвимости в слое персистентности (persistence) этого решения. Две из них образуют цепочку, ведущую к удаленному выполнению кода (RCE): SQL-инъекция в модуле проверки точек сохранения SQLite (CVE‑2025‑67644) и небезопасная десериализация формата msgpack (CVE‑2026‑28277). Третья проблема (CVE‑2026‑27022) представляет собой аналогичную SQL-инъекцию, но уже в реализации для хранилища Redis. Все три уязвимости получили статус критических, и разработчики из LangChain уже выпустили соответствующие исправления.
Детали уязвимостей
LangGraph - это расширение фреймворка LangChain, предназначенное для построения агентов с памятью. По данным PyPI, его ежемесячно загружают более 50 миллионов раз. Базовым механизмом сохранения промежуточных состояний выступают так называемые checkpoint’ы (точки сохранения). Для их хранения LangGraph поддерживает две реализации: SQLite и PostgreSQL. Уязвимости затронули обе реализации, однако в случае PostgreSQL проблема не проявляется, поскольку этот сервер использует параметризованные запросы.
Первая уязвимость (CVE‑2025‑67644) связана с построением SQL-запроса в методе "list()" объекта "sqliteSaver". Внутренняя функция "_metadata_predicate" подставляет ключи из словаря "filter" напрямую в выражение "json_extract". Если злоумышленник передаёт в "filter" специально сформированное значение "query_key", содержащее символ кавычки, он может выйти за пределы JSON-пути и внедрить произвольный SQL-код. Так, через оператор "UNION SELECT" атакующий способен добавить в результат запроса поддельную строку с контролируемыми данными в колонке "checkpoint". Эта колонка хранит бинарный BLOB, который впоследствии десериализуется.
Вторая уязвимость (CVE‑2026‑28277) находится на этапе десериализации полученных данных. LangGraph использует формат msgpack (MessagePack) - компактный бинарный формат, альтернативный JSON. Для обработки типов данных, выходящих за рамки стандартных, реализован перехватчик "_msgpack_ext_hook". В случае, если код расширения равен "EXT_CONSTRUCTOR_SINGLE_ARG", перехватчик извлекает кортеж с тремя элементами: именем модуля, именем функции и аргументом. Затем выполняется "getattr(importlib.import_module(module), function)(argument)". Атакующий может задать модуль "os", функцию "system" и, например, команду оболочки. Это приводит к немедленному выполнению произвольных команд на сервере.
Цепочка атаки выглядит следующим образом. Исходная точка - вызов "get_state_history()" с внешним параметром "filter". Если разработчик не проверяет этот параметр, злоумышленник может передать в нём SQL-инъекцию. Инъекция вставляет в результирующий набор фиктивную запись с вредоносным msgpack-объектом в колонке "checkpoint". Когда приложение обрабатывает строки результата, оно десериализует эту запись. В процессе десериализации активируется перехватчик, который импортирует модуль "os" и вызывает "os.system()" с командой, переданной злоумышленником. Так атакующий получает полный контроль над сервером.
Третья уязвимость (CVE‑2026‑27022) затрагивает модуль "langgraph-checkpoint-redis". В нём ключи из словаря "filter" также интерполируются непосредственно в запрос без использования параметризации. Условия эксплуатации аналогичны: требуется, чтобы приложение вызывало "get_state_history()" с неочищенным пользовательским фильтром. Проблема исправлена в версии 1.0.2 библиотеки "langgraph-checkpoint-redis".
Помимо основных трёх уязвимостей, исследователи обнаружили дополнительные проблемы с SQL-инъекциями в том же слое, связанные с прямым интерполированием целочисленных значений (например, LIMIT или ttl) в SQL-запросы. Хотя Python не проверяет типы во время выполнения, эти параметры также могли быть подменены вредоносной строкой. В ходе координации с разработчиками все подобные случаи были устранены за счёт перехода на параметризованные запросы.
Время раскрытия уязвимостей: 19 ноября 2025 года Check Point Research уведомила команду LangChain о всех трёх CVE. 10 декабря 2025 года вышло исправление CVE‑2025‑67644 в версии "langgraph-checkpoint-sqlite 3.0.1". 20 февраля 2026 года закрыта уязвимость CVE‑2026‑27022 в версии "langgraph-checkpoint-redis 1.0.2". 5 марта 2026 года - CVE‑2026‑28277 в версии "langgraph-checkpoint 4.0.1". Разработчики отреагировали оперативно, и критическая SQL-инъекция была исправлена первой, что разорвало цепочку атаки. Работа над устранением msgpack-десериализации продолжалась дольше, но в итоге также завершена.
Организациям, использующим LangGraph с модулями SQLite или Redis для хранения точек восстановления, необходимо немедленно обновить компоненты до указанных версий. Если приложение передаёт пользовательский фильтр в "get_state_history()", без патча злоумышленник может получить полный доступ к серверу. Облачная версия LangSmith Deployment (ранее LangGraph Platform), работающая на PostgreSQL, уязвимостям не подвержена.
Ссылки
- https://www.cve.org/CVERecord?id=CVE-2025-67644
- https://www.cve.org/CVERecord?id=CVE-2026-27022
- https://www.cve.org/CVERecord?id=CVE-2026-28277
- https://research.checkpoint.com/2026/from-sqli-to-rce-exploiting-langgraphs-checkpointer/