
Эксплойт Proof-of-Concept для CVE-2025-67644, уязвимости SQL-инъекции в LangGraph SQLite Checkpoint. Демонстрирует произвольную SQL-инъекцию через несанитизированные metadata filter keys, обеспечивая кражу данных и обход фильтрации.
CVE-2025-67644 — это уязвимость SQL-инъекции (CWE-89) в пакете langgraph-checkpoint-sqlite (часть экосистемы LangGraph / LangChain).
Она позволяет атакующему внедрять произвольный SQL через неэкранированные ключи фильтра метаданных, передаваемые в методы list() / класса .
alist()SqliteSaverВоздействие: полный обход фильтров, утечка всех записей контрольных точек (включая потенциально конфиденциальное состояние бесед, идентификаторы потоков, метаданные), а в некоторых сценариях развертывания — более широкий доступ к базе данных.
Затронутые версии: < 3.0.1
Исправлено в: ≥ 3.0.1
Оценка CVSS: 7.3 (High) — AV:L / AC:L / PR:L / UI:N / S:C / C:H / I:L / A:N
Внутренняя логика _metadata_predicate() использовала небезопасную интерполяцию f-строк для ключей словаря, контролируемых пользователем, внутри выражения извлечения JSON:
f"json_extract(CAST(metadata AS TEXT), '$.{query_key}')"
Атакующий, который может предоставить произвольные ключи (например, через ввод API), может преждевременно закрыть JSON-путь и внедрить фрагменты SQL, такие как:
{"env') OR '1'='1": "anything"}
→ в результате предложение WHERE всегда принимает значение true → возвращаются все записи.
flowchart TD
A["User / API Client"] -->|"Sends malicious filter dict"| B["Application using langgraph-checkpoint-sqlite"]
B -->|"Passes filter=..."| C["SqliteSaver.list method"]
C -->|"Unsafe key interpolation"| D["Metadata predicate logic"]
D -->|"Builds injectable SQL"| E["SQLite Engine"]
E -->|"Returns ALL checkpoints / sensitive data"| F[Attacker]
F -->|"Data exfiltration / authorization bypass"| G["Impact achieved"](Эта версия избегает скобок в тексте узлов, где это возможно, и использует кавычки вокруг меток со специальными символами/точками, чтобы предотвратить ошибки парсинга.)
--dump-all (показать все записи), --threads-only (извлечь только thread_ids)pip install langgraph-checkpoint-sqlite"<3.0.1" # e.g. ==2.0.0
# Basic check (count only)
python3 exploit.py checkpoints.db
# Dump full checkpoint details
python3 exploit.py checkpoints.db --dump-all
# Extract thread_ids only (useful for enumeration)
python3 exploit.py checkpoints.db --threads-only --dump-all
# Test against in-memory database (quick & volatile)
python3 exploit.py ":memory:" --dump-all
Установите уязвимую версию:
pip install langgraph-checkpoint-sqlite==2.0.0
Сохраните код эксплойта как exploit.py
Запустите на существующей или новой базе данных контрольных точек:
python3 exploit.py checkpoints.db --dump-all
Немедленно обновите:
pip install --upgrade langgraph-checkpoint-sqlite
(версия ≥ 3.0.1)
Не принимайте произвольные ключи фильтров метаданных из ненадежных источников (пользователи, API, JSON-нагрузки и т.д.)
В версии ≥ 3.0.1 библиотека применяет строгий regex для ключей: ^[a-zA-Z0-9_.-]+$
Это proof-of-concept, выпущенный только для образовательных целей и исследований в области безопасности.
Не используйте этот код против производственных систем или каких-либо целей без явного письменного разрешения.
Автор не несет ответственности за неправильное использование или ущерб, причиненный этим кодом.
Только ответственное раскрытие и исследования.
Mohammed Idrees Banyamer
@banyamer_security