FlawOpen

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

● CVE-2026-106032 · CVSS v4 5.7 · Média
Pesquisa · FlawOpen

CVE-2026-106032: SSRF no importador OpenAPI do AgentCore

Versões até 0.3.13 do Starter Toolkit resolviam referências OpenAPI externas ao importar agentes, permitindo que dados de grupo de ação causassem requisições de saída ou leitura de arquivos locais. Atualize para 0.3.14 ou posterior, reimporte os agentes afetados e substitua os artefatos gerados.[1], [2], [3]

💡 Explicação em Linguagem Simples (ELI5)

Pense no importador como um funcionário que monta uma pasta seguindo as referências de uma especificação. O funcionário vulnerável seguia qualquer referência, inclusive para fora da pasta ou para arquivos locais. Assim, um agente aparentemente confiável podia fazer a estação de trabalho buscar ou ler dados durante a montagem. A correção limita as referências às páginas que já estão no mesmo documento.[2], [7], [8]

Conceitos Centrais e Termos

OpenAPI $ref
Ponteiro para um esquema ou definição OpenAPI. Um fragmento aponta para dentro do documento atual; uma referência externa pode indicar outro recurso.[1]
Prance ResolvingParser
Parser usado pelo Starter Toolkit para carregar e resolver referências OpenAPI durante a importação.[2]
SSRF
Server-side request forgery: dados não confiáveis fazem o software enviar uma solicitação a partir da posição de rede do próprio software.[7], [8]
CWE-918
O cweId primário estruturado do registro CVE é CWE-918 (Server-Side Request Forgery). A descrição também cita CWE-73 pelo aspecto de controle externo do caminho de arquivo.[2], [3], [5]
CWE-73: External Control of File Name or Path
O mesmo registro CVE cita CWE-73, controle externo do nome ou caminho de arquivo, pelo aspecto de leitura de arquivos locais. CWE-73 aparece na descrição do tipo de problema; CWE-918 é o cweId primário estruturado.[3], [9]

Mapeamentos de frameworks

Análise de Causa Raiz

Na versão 0.3.13, get_agent_info() carregava o OpenAPI do grupo de ação e o passava diretamente a prance.ResolvingParser, sem restringir os tipos de resolução. Na versão 0.3.14, o importador chama assert_local_references_only() antes do parser e configura resolve_types=RESOLVE_INTERNAL. A verificação recursiva rejeita valores string de $ref que não começam com o prefixo de fragmento interno #/. Os testes do mantenedor verificam a rejeição antes da chamada ao parser e cobrem referências HTTP, file, caminhos absolutos e caminhos de rede, permitindo fragmentos internos. Não generalize isso para outros caminhos do importador nem afirme que bloqueia todo acesso à rede ou a arquivos do processo. A correção suportada é atualizar; o diff ilustra a fronteira upstream, não uma receita de exploração. O aviso do GitHub identifica @seankohjs como responsável pelo relato; a AWS agradece a Koh Jun Sheng pela colaboração na divulgação coordenada da vulnerabilidade.[2], [7], [8], [1]

Fluxo de Ataque Passo a Paso

Passo 1

Um principal da mesma conta altera dados do agente

Um principal autenticado na mesma conta AWS precisa poder modificar o esquema OpenAPI do grupo de ações do Bedrock Agent para inserir ali um valor externo de referência criado de forma maliciosa. Não se trata de um ataque pela internet sem autenticação.[2]

Passo 2

Outro usuário importa o agente

Um usuário executa o fluxo de importação do Starter Toolkit afetado. As versões vulneráveis processam o OpenAPI do grupo de ação nessa operação.[1], [2]

Passo 3

O parser resolve uma referência externa

A versão 0.3.13 passava o documento ao ResolvingParser sem limitar a resolução a referências internas. Uma referência externa criada para isso podia causar requisições de saída ou acesso a arquivos locais no ambiente de importação.[7], [2]

Passo 4

Atualize, reimporte e substitua artefatos

Atualize para 0.3.14 ou posterior, reimporte agentes trazidos por versões afetadas e substitua os artefatos locais e implantados. Migre do Starter Toolkit obsoleto para @aws/agentcore quando possível.[1], [8]

Código-Fonte: Vulnerável vs. Seguro

Os trechos são das distribuições oficiais 0.3.13 e 0.3.14. A correção rejeita referências $ref externas antes do Prance e limita também o resolver a referências internas. Testes upstream confirmam a rejeição antes do parser e a aceitação de fragmentos internos. É uma comparação focada do código-fonte, não um exemplo de requisição; atualize em vez de copiar os trechos para uma aplicação.[7], [8], [2]

Trecho de origem: Trechos do importador AgentCore, versões 0.3.13 e 0.3.14

IMPLEMENTAÇÃO VULNERÁVEL
# 0.3.13: o parser resolve referências do documento OpenAPI.
parser = ResolvingParser(
    spec_string=json.dumps(action_group["apiSchema"]["payload"])
)
action_group["apiSchema"]["payload"] = parser.specification
PATCH SEGURO E ROBUSTO
# 0.3.14: rejeite referências externas antes de analisar.
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}]")

Lista de Verificação de Segurança para Engenharia

Fontes