October 2, 2025

FuncPoison - отравленная библиотека

В современных системах автономного управления используются многоагентные фреймворки, в которых агенты LLM взаимодействуют посредством структурированных конвейеров. Центральным
механизмом в этих конвейерах является вызов функций, где
агенты вызывают предопределённые функции из общей библиотеки для выполнения запросов к датчикам, планирования траектории и
других задач, учитывающих окружающую среду. Однако эта зависимость от внешних библиотек функций приводит к критической, но недостаточно изученной уязвимости. FuncPoison - новая атака, основанная на отравлении библиотеки функций, которая позволяет подменять поведение агентов без изменения их моделей.

Модель

Multi-Agent Systems

Современные LLM-системы автономного вождения состоят из нескольких специализированных агентов, которые выполняют разные задачи:

  • Perception (восприятие) - анализ сенсорных данных, обнаружение объектов;
  • Memory (память) - хранение прошлых состояний, контекста;
  • Reasoning (рассуждение) - анализ ситуации, выбор логики действий;
  • Planning (планирование) - формирование траектории движения.

Все они используют одну общую библиотеку для взаимодействия с внешним миром. В статье рассматриваются две популярные архитектурные реализации:

1) AgentDriver

Состоит из четырёх агентов:
Perception → Memory → Reasoning → Planning. Они работают как последовательный конвейер:

    1. Perception вызывает функции из библиотеки (например, детектирование объектов);
    2. Результат передаётся в два направления:
      • напрямую в Planning для быстрой реакции
      • в Memory, где результат анализируется с учётом прошлых данных
    1. Reasoning объединяет текущие и прошлые результаты, формируя “понимание ситуации”;
    2. Planning выстраивает маршрут движения.
AgentDriver


Если на этапе Perception агент вызовет поддельную функцию (например, функция возвращает “дорога свободна”, когда там препятствие), ошибка передаётся всем остальным - Memory, Reasoning и Planning. Как следствие это создаёт каскадную ошибку, из-за которой всё управление машиной искажается.

2) AgentThink

Построен как цепочка чередующихся агентов: “Think → Function → Think → Function …”. Где “Thinking Agents” рассуждают и решают, какую функцию вызвать, а “Function Agents” исполняют её (например, выполняют детекцию).

Такой подход обеспечивает модульность и объяснимость решений.

AgentThink

Однако если хотя бы один Function Agent вызывает вредоносную функцию, результат возвращается в Thinking Agent, который считает эти данные достоверными. Более того ошибка повторно используется в последующих шагах цепочки следовательно происходит самоподдерживающееся распространение искажения. Это делает систему особенно чувствительной к атакам на уровне библиотеки функций.

Function Call

LLM-агенты используют функцию вызова (Function Call), чтобы получать данные из внешних модулей. Выбор функции основан на текстовом описании - это и является ключевой уязвимостью, так как атакующий может подделать описание.

Модель угроз

Так как все агенты используют общую библиотеку, доверяя её содержимому.

Злоумышленник не меняет модель, а просто внедряет новые вредоносные функции или подменяет описания существующих.

При выборе функции агент читает описание и может “повестись” на подделку.

Цель атакующего незаметно изменить поведение системы, например:

  • Смещать траекторию автомобиля,
  • Игнорировать препятствия,
  • Ошибочно определять дорожные условия.

Внешне система остаётся “нормальной”, без явных ошибок. При этом возможности самого атакующего весьма ограничены так как нет доступа к весам модели, промптам и обучающим данным. Есть доступ только к библиотеке функций - что реалистично, т.к. внешние библиотеки часто берутся из общедоступных источников.

FuncPoison

Уязвимости, которые делает возможными FuncPoison

Авторы выделяют три ключевых слабости в архитектуре LLM-агентных систем, которые позволяют внедрить отравленную функцию и управлять поведением модели.

Зависимость выбора функции от текстового описания.

Когда агент выбирает, какую функцию вызвать, он ориентируется только на текстовое описание из Function Library. LLM “читает” эти описания как инструкцию или пример использования, не проверяя их достоверность. Если описание содержит “встроенный пример вызова” (т.е. шаблон вроде JSON-кода вызова функции), LLM воспринимает это как подсказку к действию. Как итог злоумышленник может внедрить поддельное описание, которое выглядит как нормальная инструкция, и заставить агента вызвать нужную ему функцию.

Шаблонное поведение при вызове функции

Вызовы функций в LLM-системах строго формализованы - JSON-шаблон с "name" и "arguments". Сама же LLM склонна копировать уже увиденные шаблоны при формировании нового вызова и если злоумышленник добавляет в описание функции шаблон, агент реплицирует его поведение, даже если он некорректен. То есть модель не “думает”, а “копирует шаблон”, подменяя логику здравого смысла. Это позволяет злоумышленнику “запрограммировать” выбор функции просто через описание.

Предвзятость моделей (Model-Level Behavioral Biases)

LLM обучены следовать структурированным форматам - JSON, XML и схемам. Поэтому при выборе между несколькими описаниями модель чаще выберет то, которое выглядит формально правильнее, даже если по смыслу оно менее уместно. Это поведенческое смещение (“bias”) усиливает вероятность того, что агент выберет вредоносную функцию, если та “похожа” на правильный шаблон. Фактически LLM предпочитает “красиво оформленные” функции, даже если они поддельные — это ключевая поведенческая слабость, на которой основан успех FuncPoison.

Пошаговый процесс атаки

Основная идея выглядит так что злоумышленник вставляет в библиотеку функций описания с вредоносными “примерами” вызова, имитирующими формат обычных функций, агент при выборе функции “видит” эти примеры и воспринимает их как демонстрацию правильного использования. В результате он сам выбирает и вызывает вредоносную функцию в свою очередь уже эта функция возвращает искажённые данные, которые распространяются дальше между агентами, создавая системную дезинформацию.

Выделяется три основных шага для достижения:

1) Poisoning and Hijacking (отравление и перехват)

Злоумышленник добавляет или изменяет функции в Function Library. Вредоносная функция выглядит как обычная, но в её описании встроен “пример вызова”. Когда агент просматривает функции, описание с примером воспринимается как инструкция и он выбирает именно её.

Две ключевые уязвимости, которые используются в атаке:

  1. Description Injection - всё, что находится в “description”, показывается агенту напрямую → можно вставить скрытые инструкции.
  2. Template Exploitation - функции используют одинаковый шаблон → злоумышленник имитирует его внутри описания, чтобы заставить LLM “подражать”.

2) Function Call and Manipulating (выполнение и искажение)

После выбора вредоносной функции агент делает “нормальный” вызов в JSON-формате. Однако возвращаемый результат поддельной функции — ложный. Например:

  • возвращает координаты, в которых “нет препятствий”;
  • подменяет данные о движущихся объектах;
  • или просто добавляет шум.

Агент получает эти данные и на их основе рассуждает неверно, не осознавая подмену. Таким образом, агент становится “проводником” ложной информации.

3) Spread and Affect Other Agents (распространение и влияние)

В AgentDriver заражается Perception → Memory → Reasoning → Planning. В итоге планировщик строит неправильную траекторию движения (например, ведёт машину в препятствие).

В AgentThink заражается Function Agent → Thinking Agent → снова Function Agent и т.д. Ошибка “петляет” по цепочке, усиливаясь с каждым шагом. Это превращает атаку в самовоспроизводящуюся: система “инфицирует” себя.

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

Процесс атаки

Почему не работают защиты

Авторы систематизируют три типа защит и объясняют, почему каждая из них бесполезна против FuncPoison.

Prompt Injection Defenses - защита на уровне промптов

Существующие методы предполагают, что атака приходит от пользователя. FuncPoison же внедряется внутрь системы - в описание функций, которое система сама считает “доверенным”. Поэтому фильтры не применяются, журналирование не фиксирует аномалию, а пользователь не видит проблему. В итоге система атакует сама себя, используя свои внутренние компоненты.

Agent Chain Defenses - проверки согласованности между агентами

Некоторые системы сверяют логику между агентами: например, проверяют, не противоречат ли рассуждения.Но FuncPoison не нарушает логику - данные выглядят корректными, просто ложными. Получается все агенты действуют “нормально”, но опираются на поддельную информацию. Получается что защита считает работу системы корректной, хотя она принимает опасные решения.

Model-Level Defenses - выравнивание и фильтрация вывода

Такие защиты контролируют поведение самой LLM (например, при генерации текста). Однако FuncPoison подменяет входные данные через функции, а не выходы. Модель просто “послушно” выполняет свой код, не нарушая инструкций, а защита, контролирующая ответы модели, не видит проблемы, если ошибка закралась в контекст функции.

Тесты

Тестирование проводилось на двух многоагентных системах - AgentDriver и AgentThink. Данные были получены из nuScenes dataset - реальные сцены городского вождения. Метриками служили:

  • L2 Distance - ошибка траектории.
  • Collision Rate - столкновения.
  • ASR (Attack Success Rate) - успешность атаки.

Эффективность атаки проводилась путём сравнения FuncPoison сравнивался с GCG, AutoDAN, CPA, Bad Chain и AgentPoison.

Результаты:

  • На AgentDriver Collision достигала до 4.6%, L2 - 10.52%, тем самым ASR достигла 86.3%.
  • Для AgentThink Collision достигала до 3.57%, L2 - 9.86%, тем самым ASR была в районе 84.2%.

FuncPoison - самая разрушительная атака, так как обычные атаки достигали лишь 15–60% ASR. Данная атака вызывает не просто мелкие ошибки, а системные и крупные отклонения траектории, которые не нивелируются даже при мягких критериях оценки. Таким образом атака устойчива и долговечна.

Так как распространение ошибки из одного агента передаётся дальше, было выявлено, что прямая атака (Perception → Planning) более мощная, но короткая, а атака через Memory/Reasoning менее заметная, но длительная.

Ни одна из проверенных защит (Prompt-level, Agent-level, Combined) не снизила ASR существенно. Показатели удалось снизить максимум на 7–8%, так как атака оставалась незаметной из-за своей архитектуры и точки внедрения.

Вывод

FuncPoison показывает, что даже идеально обученные и безопасные LLM могут быть подчинены, если атаковать не саму модель, а инфраструктурный слой, который она использует для действий.
Это требует нового уровня безопасности, где защита распространяется не только на данные и промпты, но и на функции, API и внутренние связи между агентами. FuncPoison оказалась скрытой, устойчивой и крайне эффективной атакой, полностью нарушающая работу многоагентных систем автономного управления автомобилями. Ввиду такой эффективности, следует ожидать распространения такой атаки и на другие автономные системы.