FlawOpen

flawopen.com/Teardowns/cve-2026-106032-bedrock-agentcore-openapi-reference-ssrf

● CVE-2026-106032 · CVSS v4 5.7 · Средний
Исследования · FlawOpen

CVE-2026-106032: уязвимость SSRF в импортёре OpenAPI AgentCore

В версиях Starter Toolkit до 0.3.14 включительно при импорте агента разрешались внешние ссылки OpenAPI. Данные группы действий могли вызвать исходящие запросы или чтение локальных файлов. Обновите пакет, повторно импортируйте затронутых агентов и замените созданные артефакты.[1], [2], [3]

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

Представьте импортёр как сотрудника, который собирает папку по ссылкам из документа. Уязвимый сотрудник переходил по любой ссылке, даже за пределы папки или к локальному файлу. Поэтому доверенный на вид агент мог заставить компьютер получать или читать данные во время сборки. Исправление разрешает ссылки только на страницы внутри того же документа.[2], [7], [8]

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

OpenAPI $ref
Указатель на схему или описание OpenAPI. Фрагмент указывает внутрь текущего документа, внешняя ссылка может вести к другому ресурсу.[1]
Prance ResolvingParser
Парсер Starter Toolkit, который загружает и разрешает ссылки OpenAPI при импорте агента.[2]
SSRF
Server-side request forgery: недоверенные данные заставляют программу отправлять запросы из её сетевого окружения.[7], [8]
CWE-918
Основной структурированный cweId в записи CVE — CWE-918 (Server-Side Request Forgery). В описании также указана CWE-73 для аспекта внешнего управления путем к файлу.[2], [3], [5]
CWE-73: External Control of File Name or Path
В той же записи CVE указана CWE-73 — внешнее управление именем файла или путем — для аспекта чтения локальных файлов. CWE-73 приведена в описании типа проблемы, а CWE-918 является основным структурированным cweId.[3], [9]

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

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

В версии 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]

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

Шаг 1

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

Аутентифицированный субъект в той же учетной записи AWS должен иметь возможность изменить схему OpenAPI группы действий Bedrock Agent, чтобы поместить туда специально сформированное внешнее значение ссылки. Это не интернет-атака без аутентификации.[2]

Шаг 2

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

Пользователь запускает затронутый сценарий импорта Starter Toolkit. Уязвимые версии обрабатывают OpenAPI группы действий в ходе импорта.[1], [2]

Шаг 3

Парсер разрешает внешнюю ссылку

Версия 0.3.13 передавала документ в ResolvingParser без ограничения внутренними ссылками. Подготовленная внешняя ссылка могла вызвать исходящие запросы или доступ к локальным файлам в среде импорта.[7], [2]

Шаг 4

Обновите пакет, повторите импорт и замените артефакты

Установите 0.3.14 или новее, повторно импортируйте агентов, обработанных уязвимыми версиями, и замените локальные и развёрнутые артефакты. По возможности перейдите с устаревшего Starter Toolkit на @aws/agentcore.[1], [8]

Исходный код: Уязвимый 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}]")

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

Источники