Pydantic AI — это платформа агентов Python для создания приложений и рабочих процессов с помощью генеративного ИИ. В версиях от 1.88.0 до 1.107.1, но не включая, и 2.0.0b1 до 2.5.0, но не включая, адаптеры пользовательского интерфейса (AG-UI через Agent.to_ag_ui()/AGUIAdapter и Vercel AI через VercelAIAdapter) используют sanitize_messages для удаления неразрешенных («висячих») вызовов инструментов, отправленных клиентом, из истории ненадежных сообщений до того, как они достигнут агента, по умолчанию глубокоэшелонированная защита, которая не позволяет агенту выполнять вызовы инструментов, которые модель никогда не отправляла. Однако полоса привязана к индексу сообщения, вычисленному до запуска очистки, поэтому, когда завершающее клиентское сообщение очищается до пустого значения и удаляется (например, системное сообщение клиента с именем по умолчанию Manage_system_prompt='server'), предыдущий ответ помощника, несущий неразрешенный вызов инструмента, становится новым хвостом и отправляется без проверки.
В результате удаленный клиент может вызвать запуск зарегистрированного инструмента сервера без одобрения с аргументами, предоставленными клиентом, а не с аргументами, созданными моделью. Влияние ограничено тем, что делают затронутые инструменты, и наиболее значимо для приложений, которые блокируют выполнение инструмента в перехватчике запроса модели (before_model_request / after_model_request), поскольку поддельный вызов пропускает поворот модели и обходит это ограждение; Инструменты, требующие утверждения (requires_approval=True), не выполняются автоматически по этому пути. Эта проблема исправлена в версиях 1.107.1 и 2.5.0.
Показать оригинальное описание (EN)
Pydantic AI is a Python agent framework for building applications and workflows with Generative AI. In versions 1.88.0 up to but not including 1.107.1 and 2.0.0b1 up to but not including 2.5.0, the UI adapters (AG-UI via Agent.to_ag_ui()/AGUIAdapter, and Vercel AI via VercelAIAdapter) use sanitize_messages to strip unresolved ("dangling") client-submitted tool calls from untrusted message history before it reaches the agent, a defense-in-depth default that prevents the agent from executing tool calls the model never emitted. However, the strip anchored to a message index computed before sanitization ran, so when a trailing client message sanitized to empty and was dropped (for example a client system message under the default manage_system_prompt='server'), a preceding assistant response carrying an unresolved tool call became the new tail and was dispatched without inspection. As a result, a remote client could cause a registered, non-approval server tool to run with client-supplied arguments rather than arguments the model produced. The impact is bounded by what the affected tools do and is most significant for applications that gate tool execution in a model-request hook (before_model_request / after_model_request), since a forged call skips the model turn and bypasses that guardrail; approval-gated tools (requires_approval=True) are not auto-executed by this path. This issue has been fixed in versions 1.107.1 and 2.5.0.
Характеристики атаки
Последствия
Строка CVSS v3.1
Тип уязвимости (CWE)
Уязвимые продукты 2
| Конфигурация | От (включительно) | До (исключительно) |
|---|---|---|
|
Pydantic Pydantic_Ai
cpe:2.3:a:pydantic:pydantic_ai:*:*:*:*:*:python:*:*
|
1.88.0
|
1.107.1
|
|
Pydantic Pydantic_Ai
cpe:2.3:a:pydantic:pydantic_ai:*:*:*:*:*:python:*:*
|
2.0.0
|
2.5.0
|