FlawOpen

flawopen.com/Teardowns/cve-2026-105812-bedrock-agentcore-generated-code-injection

● CVE-2026-105812 · CVSS v4 8.8 · Высокий
Исследования · FlawOpen

CVE-2026-105812: внедрение кода при импорте AgentCore

В версиях Bedrock AgentCore Starter Toolkit до 0.3.14 конфигурация агента могла попадать в сгенерированный Python-код без безопасного кодирования. Другой пользователь, импортировавший, а затем запустивший или развернувший агента, мог выполнить код с локальными правами или ролью выполнения AgentCore Runtime. Обновление пакета не исправляет уже созданные артефакты.[1], [2], [3]

💡 Простыми словами (ELI5)

Импортёр похож на принтер этикеток, который превращает настройки агента в инструкции Python. До исправления некоторые значения вставлялись между кавычками без безопасного экранирования. Кавычка в значении могла преждевременно завершить строку, и остаток текста становился синтаксисом Python. Исправление кодирует значение как строковый литерал Python, сохраняя его данными.[2], [5]

Ключевые понятия и термины

Импорт агента
Процесс Starter Toolkit, который читает конфигурацию агента Bedrock и создаёт локальный проект Python для фреймворка, например Strands или LangChain.[2], [5]
Генерация кода
Создание исходного кода путём объединения шаблонов программы со значениями конфигурации и другими входными данными.[2], [5]
Строковый литерал Python
Запись в исходном коде, представляющая текст как данные. repr() возвращает заключённое в кавычки представление с экранированными символами, чтобы они не стали синтаксисом Python.[5]
CWE-94
Недостаточный контроль генерации кода: входные данные были помещены в исходный код без безопасного кодирования.[2], [3]
Сгенерированный артефакт
Локальный или развёрнутый код, созданный при импорте агента. AWS указывает, что затронутые артефакты нужно заменить; обновления одного импортёра недостаточно.[1], [2]

Связи со стандартами

  • Ссылка CWE для слабого места, описанного в этом руководстве: CWE-94

Анализ первопричины

Уязвимый преобразователь при импорте формировал Python-код с помощью f-строк и шаблонов, напрямую подставляя значения Bedrock-агента, включая промпты и другие поля конфигурации. Значения с разделителями строк Python могли выйти из предусмотренного текстового контекста. В исправлении 0.3.14 добавлены python_string_literal() на основе repr(str(value)) и python_data_literal() для нормализации JSON-совместимых данных; сгенерированные строки проходят через эти кодировщики. Согласно уведомлению сопровождающего, цепочка требует, чтобы аутентифицированный участник той же учётной записи мог менять данные агента; затем другой пользователь импортирует агента и запускает или развёртывает созданный проект. Код выполняется с локальными правами импортирующего пользователя или ролью выполнения AgentCore Runtime. AWS подчёркивает, что обновление не исправляет артефакты из уязвимых версий: нужно повторить импорт с 0.3.14 или новее и заменить локальные и развёрнутые результаты. Отдельная CVE-2026-106032 относится к внешним ссылкам OpenAPI при импорте, а не к этой генерации кода.

Условия эксплуатации уязвимости генерации кода

ГраницаДокументированное условиеЗащитное действие
Версия toolkitВерсии до 0.3.14 включали некоторые значения в генерируемый Python без безопасного кодирования строковых литералов.Обновите toolkit до версии 0.3.14 или новее либо перейдите на @aws/agentcore.
Кто может изменить данныеАутентифицированный субъект в той же учётной записи AWS может изменять соответствующие поля Bedrock Agent.Ограничьте права записи данных агента доверенными субъектами.
Импорт другим пользователемДругой пользователь импортирует изменённого агента через уязвимый процесс Starter Toolkit.Считайте данные агента от других субъектов недоверенными и проверяйте их происхождение перед импортом.
Условие выполненияИмпортирующий пользователь запускает или развёртывает созданный проект; код выполняется с его локальными правами или ролью AgentCore Runtime.Импортируйте и тестируйте с изолированными учётными данными и ролями runtime с минимальными правами.
Ранее созданные артефактыОбновление пакета не исправляет проекты, созданные уязвимыми версиями ранее.Повторно импортируйте агента с исправленной версией и замените локальные и развёрнутые артефакты.

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

Шаг 1

Участник той же учётной записи может изменить данные агента

Необходимое условие: аутентифицированный участник учётной записи AWS имеет право менять соответствующие поля Bedrock Agent, например схемы групп действий, инструкции совместной работы или переопределения промптов.[2]

Шаг 2

Другой пользователь импортирует агента

Уязвимый процесс Starter Toolkit читает изменённые данные и генерирует проект Python. Ошибка находится на границе генерации исходного кода; обычный импорт сам по себе не запускает результат немедленно.[2], [5]

Шаг 3

Некодированные значения попадают в исходный код Python

В версиях до 0.3.14 некоторые свободные значения конфигурации подставлялись в текст шаблона Python в кавычках без безопасного кодирования литерала.[2], [5]

Шаг 4

Сгенерированный проект запускают или развёртывают

При запуске или развёртывании импортированного агента созданный код может выполняться с локальными правами пользователя или ролью AgentCore Runtime.[1], [2]

Шаг 5

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

В версии 0.3.14 добавлено кодирование литералов Python. Повторите импорт с исправленной версией и замените локальные и развёрнутые результаты; AWS рекомендует перейти с устаревшего Starter Toolkit на @aws/agentcore.[1], [5]

Исходный код: Уязвимый vs Защищённый вариант

Этот фрагмент исправления в upstream-коде показывает, что уязвимый преобразователь напрямую подставлял конфигурацию в строку Python с тройными кавычками. Исправление передаёт готовый текст в python_string_literal(), которая использует repr() и экранирует его как данные. В версии 0.3.14 тот же принцип применяется к другим сгенерированным строкам и JSON-совместимым данным; регрессионные тесты разбирают результат и проверяют, что маркер остаётся строковой константой. Это анализ исходного кода, а не внедрённое значение или исполняемый эксплойт.[2], [5]

Фрагмент исходного кода: services/import_agent/scripts/base_bedrock_translate.py и services/import_agent/utils.py — фрагмент шаблона PRE_PROCESSING

УЯЗВИМАЯ РЕАЛИЗАЦИЯ
# До исправления в 0.3.14 значение шаблона напрямую вставлялось в исходный код Python с тройными кавычками.
self.prompts_code += f"""
    PRE_PROCESSING_TEMPLATE=\"""\n
    {config["basePromptTemplate"]["system"]}
    \"""
"""
БЕЗОПАСНЫЙ ИСПРАВЛЕННЫЙ ВАРИАНТ
# 0.3.14: кодировать всё значение как строковый литерал Python
prompt = f"\n\n    {config['basePromptTemplate']['system']}\n    "
self.prompts_code += f"\n    PRE_PROCESSING_TEMPLATE={python_string_literal(prompt)}\n"

# services/import_agent/utils.py
def python_string_literal(value: Any) -> str:
    return repr(str(value))

Чек-лист по защите системы для инженеров

Источники