flawopen.com/Teardowns/cve-2026-106032-bedrock-agentcore-openapi-reference-ssrf
CVE-2026-106032: уязвимость SSRF в импортёре OpenAPI AgentCore
В версиях Starter Toolkit до 0.3.14 включительно при импорте агента разрешались внешние ссылки OpenAPI. Данные группы действий могли вызвать исходящие запросы или чтение локальных файлов. Обновите пакет, повторно импортируйте затронутых агентов и замените созданные артефакты.[1], [2], [3]
Представьте импортёр как сотрудника, который собирает папку по ссылкам из документа. Уязвимый сотрудник переходил по любой ссылке, даже за пределы папки или к локальному файлу. Поэтому доверенный на вид агент мог заставить компьютер получать или читать данные во время сборки. Исправление разрешает ссылки только на страницы внутри того же документа.[2], [7], [8]
Ключевые понятия и термины
OpenAPI $ref- Указатель на схему или описание OpenAPI. Фрагмент указывает внутрь текущего документа, внешняя ссылка может вести к другому ресурсу.[1]
Prance ResolvingParser- Парсер Starter Toolkit, который загружает и разрешает ссылки OpenAPI при импорте агента.[2]
SSRF- Server-side request forgery: недоверенные данные заставляют программу отправлять запросы из её сетевого окружения.[7], [8]
Связи со стандартами
- Ссылка CWE для слабого места, описанного в этом руководстве: CWE-918
- OWASP Top 10:2025 — A01:2025 Broken Access Control
Анализ первопричины
В версии 0.3.13 функция get_agent_info() напрямую передавала OpenAPI-документ группы действий в prance.ResolvingParser без ограничения типов разрешения ссылок. В 0.3.14 импортёр сначала вызывает assert_local_references_only(): рекурсивная проверка отклоняет строковые значения $ref, не начинающиеся с префикса внутреннего фрагмента #/, а затем задаётся resolve_types=RESOLVE_INTERNAL. Благодаря этому парсер не загружает внешние OpenAPI-ссылки по этому пути импорта. Тесты сопровождающих проверяют отказ до вызова парсера для ссылок HTTP, file, абсолютных и сетевых путей и подтверждают разрешение внутренних фрагментов. Не переносите вывод на другие пути импортёра и не утверждайте, что процесс вообще лишён доступа к сети или файлам. Поддерживаемое исправление — обновление; сравнение показывает границу upstream, а не способ эксплуатации. В уведомлении GitHub репортёром указан @seankohjs; AWS благодарит Koh Jun Sheng за участие в координированном раскрытии уязвимости.[2], [7], [8], [1]
Пошаговый сценарий атаки
Участник той же учётной записи меняет данные агента
Аутентифицированный субъект в той же учетной записи AWS должен иметь возможность изменить схему OpenAPI группы действий Bedrock Agent, чтобы поместить туда специально сформированное внешнее значение ссылки. Это не интернет-атака без аутентификации.[2]
Исходный код: Уязвимый vs Защищённый вариант
Фрагменты взяты из официальных исходных дистрибутивов 0.3.13 и 0.3.14. Исправление отклоняет внешние $ref до вызова Prance и ограничивает обработку внутренними ссылками. Тесты upstream проверяют отказ до парсера и разрешение внутренних фрагментов. Это целевое сравнение исходного кода, а не пример запроса; обновите пакет вместо копирования фрагментов.[7], [8], [2]
Фрагмент исходного кода: Фрагменты импортёра AgentCore из версий 0.3.13 и 0.3.14
# 0.3.13: парсер разрешает ссылки из документа OpenAPI.
parser = ResolvingParser(
spec_string=json.dumps(action_group["apiSchema"]["payload"])
)
action_group["apiSchema"]["payload"] = parser.specification
# 0.3.14: отклонять внешние ссылки до разбора.
assert_local_references_only(action_group["apiSchema"]["payload"])
parser = ResolvingParser(
spec_string=json.dumps(action_group["apiSchema"]["payload"]),
resolve_types=RESOLVE_INTERNAL,
)
def assert_local_references_only(node, path: str = "$") -> None:
if isinstance(node, dict):
reference = node.get("$ref")
if isinstance(reference, str) and not reference.startswith("#/"):
raise ValueError(
f"External OpenAPI references are not supported: {reference!r} at {path}."
)
for key, child in node.items():
assert_local_references_only(child, f"{path}.{key}")
elif isinstance(node, list):
for index, child in enumerate(node):
assert_local_references_only(child, f"{path}[{index}]")
Чек-лист по защите системы для инженеров
- ✓Найдите среды с bedrock-agentcore-starter-toolkit: затронуты версии 0.1.4–0.3.13.[2]
- ✓Обновитесь до 0.3.14 или новее либо перейдите на рекомендуемый AWS CLI @aws/agentcore: Starter Toolkit объявлен устаревшим.[1], [2]
- ✓Повторно импортируйте агентов, ранее обработанных затронутыми версиями, и замените локальные и развёрнутые артефакты; обновление пакета не исправляет старые результаты.[1]
- ✓На период миграции ограничьте bedrock:CreateAgentActionGroup, bedrock:UpdateAgentActionGroup и bedrock:AssociateAgentCollaborator доверенными участниками.[2]
- ✓Не импортируйте агентов, если OpenAPI-схему группы действий или связанные поля мог изменить недоверенный участник того же аккаунта.[2]
- ✓В собственных импортёрах отклоняйте внешние ссылки OpenAPI до вызова резолвера и проверяйте, что отказ происходит до запуска парсера.[8]
- ✓Разделяйте эту CVE и
CVE-2026-105812: здесь проблема в разрешении ссылок при импорте, там — в небезопасном Python-коде.[6], [2]
Источники
- Бюллетень AWS 2026-127
- Уведомление сопровождающих GHSA-5xmr-2rcp-3j75
- Запись CVE-2026-106032
- NVD: CVE-2026-106032
- MITRE CWE-918
- PyPI source distribution 0.3.13 (SHA-256: 6dc3df3719ce64f7e996fca63baedd15c922066271ce18f7a66cd7c24599bf8c)
- PyPI source distribution 0.3.14 (SHA-256: 2632c456926596061c3f4079b85d39be1b0aec95b2882048501517e5c3695c85)
- MITRE CWE-73: Внешнее управление именем файла или путем