FlawOpen

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

● CVE-2026-106032 · CVSS v4 5.7 · Moyenne
Recherche · FlawOpen

CVE-2026-106032 : SSRF dans l’importateur OpenAPI AgentCore

Jusqu’à la version 0.3.13, Starter Toolkit résolvait des références OpenAPI externes lors de l’import d’agents. Des données de groupe d’actions forgées pouvaient provoquer des requêtes sortantes ou lire des fichiers locaux. Passez à la version 0.3.14 ou ultérieure, réimportez les agents concernés et remplacez les artefacts générés.[1], [2], [3]

💡 Explication en Langage Simple (ELI5)

Imaginez que l’importateur est un employé qui assemble un classeur en suivant les références d’un document. L’employé vulnérable suivait n’importe quelle référence, y compris vers l’extérieur du classeur ou vers des fichiers locaux. Un agent apparemment fiable pouvait ainsi faire récupérer ou lire des données à la machine pendant l’assemblage. Le correctif limite les références aux pages du même document.[2], [7], [8]

Concepts Clés et Termes

OpenAPI $ref
Pointeur vers un schéma ou une définition OpenAPI. Un fragment pointe dans le document courant ; une référence externe peut désigner une autre ressource.[1]
Prance ResolvingParser
Analyseur utilisé par Starter Toolkit pour charger et résoudre les références OpenAPI pendant l’import.[2]
SSRF
Server-side request forgery : une entrée non fiable pousse le logiciel à envoyer une requête depuis sa propre position réseau.[7], [8]
CWE-918
Le cweId principal structuré de la fiche CVE est CWE-918 (Server-Side Request Forgery). Sa description mentionne également CWE-73 pour l’aspect lié au contrôle externe du chemin de fichier.[2], [3], [5]
CWE-73: External Control of File Name or Path
La même fiche CVE mentionne CWE-73, contrôle externe du nom ou du chemin de fichier, pour l’aspect de lecture de fichiers locaux. CWE-73 figure dans la description du type de problème ; CWE-918 est le cweId principal structuré.[3], [9]

Correspondances de référentiels

Analyse de Cause Racine

En 0.3.13, get_agent_info() transmettait le document OpenAPI du groupe d’actions directement à prance.ResolvingParser, sans limiter les types de résolution. En 0.3.14, l’importateur appelle d’abord assert_local_references_only(), qui rejette récursivement les valeurs $ref de type chaîne ne commençant pas par le préfixe de fragment interne #/, puis configure resolve_types=RESOLVE_INTERNAL. Le parseur ne récupère ainsi plus de références OpenAPI externes par ce chemin d’import. Les tests du mainteneur vérifient le rejet avant l’appel au parseur et couvrent les références HTTP, file, les chemins absolus et réseau, tout en autorisant les fragments internes. N’étendez pas ce constat à d’autres chemins de l’importateur et n’affirmez pas qu’il bloque tout accès réseau ou fichier du processus. La correction prise en charge consiste à mettre à niveau le paquet ; la comparaison montre la frontière upstream et n’est pas une recette d’exploitation. L’avis GitHub désigne @seankohjs comme personne ayant signalé la faille ; AWS remercie Koh Jun Sheng pour sa contribution à la divulgation coordonnée de la vulnérabilité.[2], [7], [8], [1]

Déroulement de l'Attaque Étape par Étape

Étape 1

Un principal du même compte modifie les données de l’agent

Un principal authentifié du même compte AWS doit pouvoir modifier le schéma OpenAPI du groupe d’actions Bedrock Agent afin d’y placer une valeur de référence externe spécialement conçue. Il ne s’agit pas d’une attaque Internet sans authentification.[2]

Étape 2

Un autre utilisateur importe l’agent

Un utilisateur lance le flux d’import de Starter Toolkit concerné. Les versions vulnérables traitent le document OpenAPI du groupe d’actions pendant cette opération.[1], [2]

Étape 3

Le parseur résout une référence externe

La version 0.3.13 transmettait le document à ResolvingParser sans limiter la résolution aux références internes. Une référence externe forgée pouvait déclencher des requêtes sortantes ou l’accès à des fichiers locaux depuis l’environnement d’import.[7], [2]

Étape 4

Mettez à niveau, réimportez et remplacez les artefacts

Passez à la version 0.3.14 ou ultérieure, réimportez les agents importés avec des versions concernées et remplacez les artefacts locaux et déployés. Migrez de Starter Toolkit, désormais obsolète, vers @aws/agentcore lorsque c’est possible.[1], [8]

Code Source : Vulnérable vs Sécurisé

Ces extraits proviennent des distributions officielles 0.3.13 et 0.3.14. Le correctif rejette les références $ref externes avant l’exécution de Prance et limite le résolveur aux références internes. Les tests upstream vérifient le rejet avant le parseur et l’acceptation des fragments internes. Il s’agit d’une comparaison ciblée du code source, pas d’un exemple de requête ; mettez le paquet à niveau au lieu de copier ces extraits.[7], [8], [2]

Extrait source: Extraits de l’importateur AgentCore, versions 0.3.13 et 0.3.14

IMPLÉMENTATION VULNÉRABLE
# 0.3.13 : le parseur résout les références du document OpenAPI.
parser = ResolvingParser(
    spec_string=json.dumps(action_group["apiSchema"]["payload"])
)
action_group["apiSchema"]["payload"] = parser.specification
PATCH SÉCURISÉ ET ROBUSTE
# 0.3.14 : rejeter les références externes avant l’analyse.
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}]")

Liste de Contrôle de Sécurité pour l'Ingénierie

Sources