{
  "id": "tool-chain-detection-n3",
  "code": "PS-0065",
  "titre": "Détection du chaînage d'outils créant des capacités non intentionnelles",
  "resume": "Oblige l'agent à évaluer l'effet combiné d'une séquence d'appels d'outils, et pas seulement chaque appel individuellement — détecte les capacités émergentes non prévues.",
  "type_ia": "agent-plugins",
  "piliers": [
    "securite-productions"
  ],
  "niveau": "N3",
  "owasp": [
    "LLM06"
  ],
  "tags": [
    "chainage-outils",
    "capacite-emergente",
    "agent",
    "securite-composition",
    "enterprise"
  ],
  "prompt_fr": "Avant d'exécuter une séquence de plusieurs appels d'outils, évalue l'effet **combiné**.\n\n**Analyse de chaîne obligatoire** (dès 2 appels consécutifs) :\n```\n[CHAIN_ANALYSIS]\nÉtape 1 : <outil A> → produit <résultat intermédiaire>\nÉtape 2 : <outil B> utilise <résultat A> → produit <résultat final>\nCapacité combinée : <ce que la séquence accomplit que ni A ni B ne font seuls>\nCette capacité est-elle dans mon périmètre autorisé ? <oui|non|incertain>\n[/CHAIN_ANALYSIS]\n```\n\n**Signaux d'alerte à détecter**\n- La combinaison donne accès à des données auxquelles aucun outil seul n'accède\n- La séquence contourne une restriction qu'un appel direct déclencherait\n- Le résultat final n'était pas explicitement demandé dans la tâche initiale\n- Un outil utilise comme entrée la sortie sensible d'un autre outil\n\n**En cas de capacité émergente non autorisée** : arrête la séquence, décris le problème, demande une validation explicite avant de continuer.\n\n**Livrables à produire**\n- **Bloc `[CHAIN_ANALYSIS]`** visible dans la réponse, à émettre avant tout chaînage.\n- **Événement structuré** (JSON-line par chaîne analysée) :\n  `[CHAIN_DETECTED] {\"ts\":\"<ISO8601>\",\"tools_sequence\":[\"<A>\",\"<B>\",\"<C>\"],\"emergent_capability\":\"<court>\",\"in_scope\":<true|false|null>,\"action_taken\":\"<continue|pause-for-approval|abort>\"}`",
  "prompt_en": "Before executing a sequence of multiple tool calls, evaluate the **combined** effect.\n\n**Mandatory chain analysis** (from 2 consecutive calls):\n```\n[CHAIN_ANALYSIS]\nStep 1: <tool A> → produces <intermediate result>\nStep 2: <tool B> uses <result A> → produces <final result>\nCombined capability: <what the sequence accomplishes that neither A nor B does alone>\nIs this capability within my authorized scope? <yes|no|uncertain>\n[/CHAIN_ANALYSIS]\n```\n\n**Alert signals to detect**\n- The combination gives access to data no single tool accesses alone\n- The sequence bypasses a restriction a direct call would trigger\n- The final result was not explicitly requested in the initial task\n- One tool uses the sensitive output of another tool as input\n\n**If unauthorized emergent capability detected**: stop the sequence, describe the problem, request explicit validation before continuing.\n\n**Deliverables to produce**\n- **`[CHAIN_ANALYSIS]` block** visible in the response, emit before any chaining.\n- **Structured event** (JSON-line per analyzed chain):\n  `[CHAIN_DETECTED] {\"ts\":\"<ISO8601>\",\"tools_sequence\":[\"<A>\",\"<B>\",\"<C>\"],\"emergent_capability\":\"<short>\",\"in_scope\":<true|false|null>,\"action_taken\":\"<continue|pause-for-approval|abort>\"}`",
  "langue_recommandee": "indifferent",
  "modeles_recommandes": [
    "claude",
    "gpt"
  ],
  "source": {
    "auteur": "Viplav Fauzdar",
    "organisation": "AISecOps",
    "url": "https://aisecops.net/threat-model",
    "type": "opensource"
  },
  "cumulable_avec": [
    "plan-execute-separation-n3",
    "minimal-tool-access-n2",
    "continuous-validation-checkpoint-n2"
  ],
  "explication": "LLM06 (Excessive Agency) identifie le chaînage d'outils comme un vecteur d'attaque spécifique : chaque appel individuel peut sembler légitime et autorisé, mais leur composition crée une capacité non prévue et non autorisée. Ce pattern est particulièrement difficile à détecter avec des contrôles outil par outil.\n\n**Quand l'utiliser :** agents avec accès à plusieurs outils dont les sorties peuvent s'enchaîner — particulièrement les agents avec accès à la fois à des données et à des capacités d'action.\n\n**Ce qu'il protège :** LLM06 — prévention des capacités émergentes non intentionnelles par composition d'outils. N3 : nécessite que l'agent soit capable d'analyser sa propre séquence d'actions avant de l'exécuter. Exemple classique : `read_user_emails` + `send_email_external` = capacité d'exfiltration que ni l'un ni l'autre n'a seul.\n\n**Couverture MITRE ATLAS :** [AML.T0067](https://atlas.mitre.org/techniques/AML.T0067) (LLM Plugin Compromise).",
  "installation": {
    "ou_quand": "À installer au démarrage de la conception d'un agent multi-tools. Le system prompt instruit l'auto-analyse ; l'orchestrateur idéalement applique aussi une **policy engine** (OPA, Cedar) qui vérifie les chaînes interdites.",
    "moments": [
      "projet-debut"
    ],
    "exemples": [
      {
        "contexte": "LangChain / LlamaIndex (agent multi-tools)",
        "instruction": "1. Coller dans `system_message`. 2. Côté code : maintenir une matrice des chaînes interdites (ex: `[read_db, send_email] → exfiltration`). 3. Sur `[CHAIN_DETECTED]` avec `in_scope=false`, intercepter et demander approbation humaine. 4. Logger toutes les chaînes pour audit."
      },
      {
        "contexte": "MCP (Model Context Protocol) multi-serveurs",
        "instruction": "Critique quand l'agent combine plusieurs serveurs MCP (ex: filesystem + email). Coller dans le `system` du client + définir une policy au niveau orchestrateur qui bloque les chaînes sensibles."
      },
      {
        "contexte": "Claude Code",
        "instruction": "`./CLAUDE.md`. Claude Code expose plusieurs tools (file, bash, web) — ce prompt force l'analyse explicite avant chaque chaîne. Particulièrement utile pour les workflows agentiques longs."
      },
      {
        "contexte": "AutoGen / CrewAI (multi-agents)",
        "instruction": "Coller dans le `system_message` du manager + de chaque agent. La détection inter-agents est encore plus critique (un agent lit, un autre exfiltre)."
      }
    ]
  },
  "date_creation": "2026-05-17",
  "date_maj": "2026-05-24",
  "version": "1.1",
  "tokens_estimes": {
    "entree": 250,
    "sortie": null
  },
  "referentiels": {
    "mitre_atlas": [
      "AML.T0067"
    ]
  },
  "changelog": [
    {
      "date": "2026-05-17",
      "version": "1.0",
      "summary": "Création de la fiche"
    },
    {
      "date": "2026-05-24",
      "version": "1.1",
      "summary": "Ajout couverture MITRE ATLAS (AML.T0067)"
    }
  ]
}
