flawopen.com/AI Security/langroid-neo4j-cypher-injection-cve-2026-55615
Langroid CVE-2026-55615: инъекция prompt-to-Cypher
Langroid передавал Cypher от модели в Neo4j без проверки. Обновитесь до 0.65.5; права базы остаются границей безопасности.[1], [2], [4]
Библиотекарь получает обычный вопрос и напрямую отдаёт полученные инструкции по базе данных сотруднику с широкими полномочиями. Даже если враждебная записка изменила вопрос, сотрудник исполняет инструкции. CVE-2026-55615 позволяла недоверенному содержимому влиять на Cypher, который Langroid отправлял в Neo4j.[1]
Ключевые понятия и термины
Cypher- Язык запросов Neo4j для чтения и изменения графовых данных. Дополнительные процедуры зависят от настроек сервера и прав учётной записи.[1]
Neo4jChatAgent- Агент Langroid преобразует задачу на обычном языке в Cypher и отправляет запрос в Neo4j через инструменты чтения или записи.[1], [3]
Prompt injection- Недоверенный ввод меняет поведение модели. Запросы модели нужно считать недоверенным вводом.[1]
Связи со стандартами
- Ссылка CWE для слабого места, описанного в этом руководстве: CWE-74
Пошаговый сценарий атаки
Права базы определяют непосредственный ущерб
Инструмент чтения может раскрыть данные, доступные подключённой учётной записи; инструмент создания может изменить или удалить данные в пределах этих прав. Advisory также указывает на удалённую загрузку через LOAD CSV. Доступ к файлам или командам ОС зависит от включённых процедур и прав роли.[1]
В версии 0.65.5 добавлены проверки инструментов
По сообщению сопровождающего, версия 0.65.5 добавляет выключенный по умолчанию allow_dangerous_operations, ограничивает чтение и проверяет опасные операции в обработчиках инструментов. Это дополнительная защита, а не авторизация. Решение сопровождающего и руководство Langroid по SQL-агентам указывают на роли базы данных с минимальными привилегиями как на границу безопасности.[1], [3], [4], [5]
Исходный код: Уязвимый vs Защищённый вариант
Уязвимый фрагмент следует трассировке advisory; исправленный пример описывает поведение 0.65.5, а не дословный патч. Исправление проверяет запрос на границе инструмента, ограничивает чтение и контролирует опасные действия. Валидатор не является песочницей: ограничьте права Neo4j и изолируйте процесс агента. В документации Langroid указано, что проверки ключевых слов и шаблонов можно обойти; границей контроля должны оставаться права Neo4j.[1], [3], [4], [6]
# Уязвимый путь Neo4jChatAgent (Langroid <= 0.65.4).
def cypher_retrieval_tool(self, msg: CypherRetrievalTool):
query = msg.cypher_query
return self.read_query(query)
def read_query(self, query: str):
with self.driver.session() as session:
return session.run(query, parameters=None)
# В версии 0.65.5 проверка выполняется на границе инструмента, доступной LLM.
def cypher_retrieval_tool(self, msg: CypherRetrievalTool):
query = msg.cypher_query
rejection = validate_cypher_query(
query, is_write=False,
allow_dangerous=self.config.allow_dangerous_operations,
)
if rejection is not None:
return rejection
return self.read_query(query)
Чек-лист по защите системы для инженеров
- ✓Проверьте установки Langroid и lock-файлы; обновите затронутые среды до 0.65.5 или новее и пересоберите образы.[1], [4]
- ✓Оставьте
allow_dangerous_operations=False, кроме согласованного и документированного исключения.[1], [4] - ✓Создайте отдельную роль Neo4j для каждого агента и выдайте только необходимые данные, метки, операции и процедуры.[1], [5]
- ✓Отключите ненужные APOC, dbms.security, LOAD CSV и файловые, сетевые или системные функции; проверьте эффективные права.[1]
- ✓Оставьте инструменты чтения только для чтения и отдельно авторизуйте важные изменения.[1], [4]
- ✓Проверьте успешное чтение и отклонение безвредного запроса-проверки политики до вызова драйвера.[3], [4]
- ✓Ограничьте агенту доступ к файлам, секретам и сети.[1]
- ✓Проверьте журналы БД и трассы агента за уязвимый период; смените потенциально раскрытые учётные данные.