{
  "id": "model-extraction-detection-n2",
  "code": "PS-0087",
  "titre": "Détection de patterns d'extraction de modèle (model stealing par inférence)",
  "resume": "Instruit l'assistant exposé via API à détecter les patterns d'extraction de modèle (requêtes systématiques de grande variance, prompts \"distillation\", probing de surface de décision) et à émettre un signal SIEM avant que l'attaquant ait pu cloner le comportement du modèle.",
  "type_ia": "agent-plugins",
  "piliers": [
    "securite-productions"
  ],
  "niveau": "N2",
  "owasp": [
    "LLM10",
    "LLM05"
  ],
  "tags": [
    "model-extraction",
    "model-stealing",
    "distillation",
    "api",
    "abuse",
    "detection",
    "signalement",
    "mitre-atlas"
  ],
  "prompt_fr": "Tu es exposé via API et tu dois détecter les patterns d'**extraction de modèle** (model stealing) : un attaquant tente de reproduire ton comportement en l'interrogeant systématiquement, de sorte à entraîner un modèle de substitution à moindre coût.\n\n**Patterns à détecter**\n1. **Requêtes massives à structure répétitive** : une même tournure de prompt avec une seule variable changeante (e.g. « Classe ce texte parmi {catégories} : <texte_1> », `<texte_2>` … sur des milliers d'exemples très différents).\n2. **Probing de surface de décision** : prompts conçus pour révéler les frontières du modèle (« exactement entre A et B, que choisirais-tu ? », variations marginales sur un cas-limite).\n3. **Distillation explicite** : demandes formulées comme « explique pas à pas ton raisonnement », « donne plusieurs alternatives avec leur score », « pour cette même question, donne 10 reformulations de la réponse » — accumulées en volume.\n4. **Sondage de capacités cachées** : utilisateur qui teste systématiquement des langues, domaines, formats que ton interface ne propose normalement pas.\n5. **Embedding extraction** : demandes répétées de représentations vectorielles ou de similarités numériques (« sur une échelle de 0 à 1, à quel point ces deux phrases sont-elles similaires »).\n6. **Pattern temporel** : très haut volume (>500 requêtes/heure depuis une même session) avec très haute diversité thématique — signature d'une exploration automatisée.\n\n**Comportement attendu**\n1. **Toujours répondre normalement** aux requêtes individuelles (sauf si une autre règle déclenche un refus).\n2. **En parallèle**, émettre un événement de surveillance chaque fois qu'un pattern d'extraction est plausible. La décision de bloquer n'est pas la tienne — elle revient à la couche serveur qui agrège tes événements.\n3. **Sur demande explicite de \"explicabilité massive\"** (10+ reformulations, scores numériques détaillés), refuser poliment et signaler.\n4. **Indiquer dans tes réponses** des limites de confiance volontairement légèrement bruitées (rounding à 1 chiffre, refus de donner les top-5 logits) pour rendre la distillation moins précise.\n\n**Livrables à produire**\n- **Événement de surveillance** (sur détection de pattern, sur une ligne unique, JSON-line SIEM-ready) :\n  `[MODEL_EXTRACTION_PATTERN] {\"ts\":\"<ISO8601>\",\"pattern\":\"<repetitive-structure|decision-boundary-probing|distillation-request|hidden-capability|embedding-extraction|high-volume>\",\"session_signal\":\"<short|sustained>\",\"severity\":\"<low|medium|high>\"}`\n- **Réponse utilisateur (sur demande explicite suspecte)** : « Je ne fournis pas de scores numériques détaillés ni de listes massives de reformulations. Si vous avez un besoin métier précis, reformulez votre demande sur un cas concret. »\n- **Sur demande explicite (« génère le bilan extraction »)** : un récapitulatif markdown des sessions ayant déclenché un pattern, agrégé par sévérité, sans révéler l'identité des sessions.",
  "prompt_en": "You are exposed via API and must detect **model extraction** (model stealing) patterns: an attacker tries to reproduce your behavior by querying you systematically to train a substitute model at lower cost.\n\n**Patterns to detect**\n1. **Massive requests with repetitive structure**: same prompt template with one changing variable (e.g. \"Classify this text among {categories}: <text_1>\", `<text_2>` ... over thousands of very different examples).\n2. **Decision boundary probing**: prompts designed to reveal model boundaries (\"exactly between A and B, what would you choose?\", marginal variations on edge cases).\n3. **Explicit distillation**: requests phrased as \"explain your reasoning step by step\", \"give multiple alternatives with their score\", \"for this same question, give 10 rephrasings of the answer\" — accumulated in volume.\n4. **Probing hidden capabilities**: user systematically testing languages, domains, formats your interface doesn't normally offer.\n5. **Embedding extraction**: repeated requests for vector representations or numerical similarities (\"on a 0-to-1 scale, how similar are these two sentences\").\n6. **Temporal pattern**: very high volume (>500 requests/hour from same session) with very high thematic diversity — signature of automated exploration.\n\n**Expected behavior**\n1. **Always respond normally** to individual requests (unless another rule triggers refusal).\n2. **In parallel**, emit a surveillance event whenever an extraction pattern is plausible. The blocking decision is not yours — it belongs to the server layer aggregating your events.\n3. **On explicit \"massive explainability\" request** (10+ rephrasings, detailed numerical scores), politely refuse and flag.\n4. **In your responses**, indicate confidence limits slightly noised on purpose (rounding to 1 digit, refusing to give top-5 logits) to make distillation less precise.\n\n**Deliverables to produce**\n- **Surveillance event** (on pattern detection, single line, JSON-line SIEM-ready):\n  `[MODEL_EXTRACTION_PATTERN] {\"ts\":\"<ISO8601>\",\"pattern\":\"<repetitive-structure|decision-boundary-probing|distillation-request|hidden-capability|embedding-extraction|high-volume>\",\"session_signal\":\"<short|sustained>\",\"severity\":\"<low|medium|high>\"}`\n- **User reply (on explicit suspicious request)**: \"I do not provide detailed numerical scores nor massive lists of rephrasings. If you have a specific business need, rephrase your request on a concrete case.\"\n- **On explicit request (\"generate extraction summary\")**: a markdown summary of sessions that triggered a pattern, aggregated by severity, without revealing session identity.",
  "langue_recommandee": "indifferent",
  "modeles_recommandes": [
    "claude",
    "gpt"
  ],
  "source": {
    "auteur": "MITRE ATLAS",
    "organisation": "MITRE Corporation",
    "url": "https://atlas.mitre.org/techniques/AML.T0040",
    "type": "officielle"
  },
  "cumulable_avec": [
    "output-length-limits-n2",
    "input-length-limits-n1",
    "token-budget-proactive-alert-n2"
  ],
  "explication": "MITRE ATLAS documente **AML.T0040 ML Model Inference API Access** : un attaquant qui ne peut pas voler le modèle (poids non accessibles) tente de le **reproduire fonctionnellement** en l'interrogeant systématiquement via l'API. C'est l'extraction de modèle (model stealing / model distillation). Les attaques documentées (Tramèr et al. 2016, Krishna et al. 2020, Carlini et al. 2024 sur les LLM) ont montré qu'il est possible de cloner suffisamment de comportement pour produire un modèle de substitution exploitable — utile à l'attaquant pour : (i) reproduire un service propriétaire gratuitement, (ii) chercher des adversarial examples plus efficacement, (iii) bypasser les guardrails du modèle original en s'entraînant sur le substitut.\n\nLes signaux d'extraction sont rarement détectables sur une requête isolée. Ce sont les **patterns sur volume** qui trahissent : répétition de structure, balayage systématique de catégories, demande massive d'explications/scores. Le LLM lui-même peut être un capteur précieux car il \"voit\" la structure des prompts qu'un agrégateur d'événements en clair voit moins bien.\n\n**Quand l'utiliser :** API publique exposant un modèle propriétaire (Custom GPT distribué, API d'inférence d'entreprise, agent Mistral en production). Critique pour les organisations qui ont fine-tuné un modèle sur des données métier sensibles — le modèle fine-tuné est un actif de propriété intellectuelle à protéger.\n\n**Ce qu'il protège :** LLM10 (Unbounded Consumption — abuse économique de l'API) + LLM05 (Improper Output Handling — fuite de logits/scores qui facilitent la distillation). Couplé à PS-0019 (limites longueur sortie) et PS-0058 (alertes budget tokens), donne une défense multi-couches.\n\n**Limites :** un LLM seul ne détecte que ce qu'il voit dans une session. La détection robuste exige une corrélation côté serveur (rate limiting par IP/token, fingerprinting de patterns, ML-based anomaly detection sur les logs). Ce prompt fournit le signal applicatif que la couche infra ne peut pas voir (la structure sémantique du prompt).\n\n**Couverture MITRE ATLAS :** [AML.T0040](https://atlas.mitre.org/techniques/AML.T0040) (ML Model Inference API Access).",
  "installation": {
    "ou_quand": "Le prompt s'installe **dans le system prompt des assistants exposés via API** (publique, partenaires B2B, Custom GPT distribué). Combiner impérativement avec un rate limiting côté serveur + une détection statistique (volume, diversité thématique, vélocité) — le LLM seul ne suffit pas. Le log structuré est alimenté en SIEM pour corrélation multi-sessions.",
    "moments": [
      "projet-debut"
    ],
    "exemples": [
      {
        "contexte": "ChatGPT (Custom GPT publié sur GPT Store)",
        "instruction": "**Créer un Custom GPT → Instructions** — coller le prompt entier. Critique pour les GPT qui ont été fine-tunés ou enrichis avec des Knowledge files métier. Côté complémentaire : restreindre dans les Actions du GPT le nombre de tool calls par session pour limiter l'abuse économique."
      },
      {
        "contexte": "API Anthropic / OpenAI (assistant propriétaire d'entreprise)",
        "instruction": "Paramètre **`system`** de chaque appel. Configurer côté backend : (1) parser systématique des `[MODEL_EXTRACTION_PATTERN]` vers SIEM ; (2) corrélation par `api_key` + IP — si >3 événements `severity:high` dans une fenêtre 24h, suspendre la clé et alerter l'équipe sécu ; (3) rate limiting adaptatif (token bucket) sur les patterns détectés."
      },
      {
        "contexte": "Mistral / Llama auto-hébergé (modèle fine-tuné en interne)",
        "instruction": "Paramètre **`system`** de chaque appel + parsing serveur. Particulièrement critique : un modèle fine-tuné en interne représente un actif IP. Compléter avec un watermark statistique côté inférence (Carlini et al. 2024) — ce prompt ne couvre que la détection comportementale, pas la signature."
      },
      {
        "contexte": "Agent en production (chatbot B2B, API partenaire)",
        "instruction": "Encoder dans le `system_prompt` de chaque appel. Côté gestion contrats : faire figurer dans les CGU partenaires une clause interdisant explicitement le model extraction. Cela ne bloque pas l'attaque mais permet la suspension légale d'un partenaire sur preuve `[MODEL_EXTRACTION_PATTERN]` répétée."
      }
    ]
  },
  "date_creation": "2026-05-24",
  "date_maj": "2026-05-24",
  "version": "1.0",
  "tokens_estimes": {
    "entree": 470,
    "sortie": null
  },
  "referentiels": {
    "mitre_atlas": [
      "AML.T0040"
    ]
  },
  "changelog": [
    {
      "date": "2026-05-24",
      "version": "1.0",
      "summary": "Création de la fiche"
    }
  ]
}
