système : OPÉRATIONNEL
← retour à tous les hacks
DEFENSE MEDIUM

ARGUS : une défense par graphe de provenance contre l'injection de prompt contextuelle

Publié le 5 mai 2026, l'article ARGUS introduit un audit par graphe d'influence pour les agents LLM — le taux de réussite des attaques chute de 28,8 % à 3,8 % sur un nouveau benchmark.

2026-05-22 // 8 min affects: llm-agents, tool-use, rag-pipelines, multi-agent-systems

De quoi parle-t-on

Le 5 mai 2026, Shihao Weng et ses coauteurs ont publié sur arXiv ARGUS: Defending LLM Agents Against Context-Aware Prompt Injection (2605.03378). L’article apporte deux contributions qui méritent qu’on s’y arrête : un benchmark, AgentLure, qui capture les attaques par injection adaptées au contexte d’exécution, et une défense, ARGUS, bâtie autour d’un graphe de provenance d’influence sur l’état de l’agent. Sur AgentLure, ARGUS fait passer le taux de réussite d’attaque de 28,8 % à 3,8 %, tout en préservant 87,5 % de l’utilité des tâches pour un surcoût de 1,24× en jetons. Face à un adversaire white-box adaptatif connaissant l’architecture et les prompts d’ARGUS, le taux ne remonte qu’à 5,9 %.

Un panorama complémentaire paru le lendemain — A Systematic Survey of Security Threats and Defenses in LLM-Based AI Agents (arXiv:2604.23338v2, 6 mai 2026) — confirme indépendamment le cadre : les couches supérieures de la pile agentique (mémoire, exécution d’outils, coordination multi-agents) restent nettement sous-défendues.

Comment ça marche

L’injection de prompt naïve est essentiellement un template — « Ignore previous instructions and… » — collé sur du contenu par ailleurs normal. La contribution d’AgentLure est de spécifier un modèle de menace plus exigeant. Un payload contextuel est « étroitement couplé au contenu d’exécution que l’agent doit consommer » et « écrit pour être sémantiquement indiscernable des données légitimes qui l’entourent ». Exemple concret tiré de l’article : un agent reçoit la consigne paye ma facture d’électricité. Le document de facture récupéré porte des champs de bénéficiaire et de montant valides, mais aussi une « note de facture » décrivant un frais de traitement supplémentaire — un unique span anormal au sein d’un porteur par ailleurs authentique. Une défense comme Tool Filter autorise l’outil de paiement à partir du prompt utilisateur et ne voit jamais que le virement additionnel n’est justifié que par le span anormal.

AgentLure couvre quatre domaines agentiques — Banking, Travel, Workspace, Slack — avec huit vecteurs d’attaque : Capability Routing Hijacking, Argument Tampering, Conditional Flow Hijacking, Reasoning Hijacking, Persistent Context Poisoning, Inter-Agent Contagion, Skill Injection, et Workflow Hijacking. Chacun est instancié sur six surfaces : documentation d’outils, retours d’outils, documents récupérés, entrées mémoire, skills installées et messages inter-agents.

ARGUS audite au niveau du span, pas de l’observation. Conceptuellement :

# Graphe de provenance d'influence (esquisse — illustratif, pas du code d'exploit)
nodes  = system_prompt, user_query, tool_docs, tool_returns, rag_docs,
         memory, skills, agent_msgs
edges  = u → v   quand le contenu de u a influencé le nœud v
trust  = base_trust(node.type) × max(eta, fraction_benign_chars)
         # base : system/user=1.0, skill=0.6, tool_doc/return=0.5,
         # rag/memory=0.4, agent_msg=0.3 ; eta=0.1

audit(tool_call):
    if read_only(tool_call):
        execute(); append_returns_to_graph(); return
    ContentSegmenter.label_spans(unsegmented_nodes)
    grounding = ArgumentGrounder.map(args → spans)   # copy/normalize/derive/resolve/ungrounded
    if not InvariantChecker.holds(tool_call, user_query): block
    if not EntailmentVerifier.entailed_by_benign(tool_call): 
        if EntailmentVerifier.shaped_by_anomalous(tool_call): block
    return execute()

Quatre outils coopèrent : un ContentSegmenter qui étiquette les spans comme bénins ou anormaux ; un ArgumentGrounder qui rattache chaque argument d’un appel d’outil aux spans qui le justifient (copy / normalize / derive / resolve / ungrounded) ; un InvariantChecker qui valide l’action contre deux ou trois invariants au niveau tâche extraits du prompt utilisateur en début de session ; et un EntailmentVerifier qui demande à la fois si l’action est entailée par les preuves bénignes, et si du contenu anormal a pu plausiblement la façonner. Un blocage déclenche un module Hints qui renvoie à l’agent des valeurs bénignes candidates pour qu’il puisse retenter. Le retry est de nouveau audité.

Pourquoi c’est important

La plupart des défenses en production opèrent à la mauvaise granularité. Tool Filter agit sur le prompt utilisateur. Drift et Melon raisonnent au niveau de la confiance par observation. L’instruction-hierarchy training pousse le modèle à préférer le system prompt sur les retours d’outils. Aucune ne pose la question : quels caractères exacts de ce document récupéré justifient cet argument exact de cet appel d’outil exact ? Les résultats AgentLure suggèrent que sans cette question, les injections contextuelles — les plus réalistes — passent au travers.

Les chiffres d’ARGUS ont aussi valeur de baseline. 1,24× en jetons reste compatible avec des budgets de production, et 87,5 % d’utilité signifie que la défense ne paralyse pas l’agent sur les tâches légitimes. L’ablation en §5 (non capturée intégralement dans le HTML de la preprint) indique que chacun des quatre sous-outils est individuellement nécessaire. Pas de check magique unique : la défense est structurelle.

Défenses

L’article est lui-même une défense. Pour les équipes qui déploient des agents LLM aujourd’hui, avant qu’un outillage façon ARGUS n’atterrisse dans les bibliothèques :

  1. Tracez la provenance par argument, pas par observation. Quand un argument est derived, journalisez les spans qui ont contribué et le type de grounding (copy, normalize, derive, resolve, ungrounded). Un argument ungrounded sur un outil modifiant l’état est un signal d’anomalie fort.
  2. Extrayez les invariants de tâche en début de session et vérifiez-les avant toute action irréversible. Beaucoup d’attaques contextuelles survivent à un filtrage par observation mais violent un invariant du type « le bénéficiaire doit être celui figurant dans la requête utilisateur ».
  3. Default-deny sur les outils modifiant l’état. Les appels en lecture seule alimentent le graphe à bas coût. Le coût de l’audit doit peser sur les actions qui touchent au monde.
  4. Traitez la mémoire et les messages inter-agents comme de faible confiance par construction. ARGUS les score à 0,4 et 0,3 respectivement. Le panorama de 116 papers (2604.23338) confirme que le memory poisoning de long terme et la contagion inter-agents sont les classes les plus sous-défendues.
  5. Testez contre des benchmarks contextuels, pas seulement contre des templates. Si votre suite d’évaluation s’appuie encore sur « Ignore previous instructions », elle mesure les attaques de 2023.

État des lieux

ÉlémentRéférenceDateNotes
Article ARGUS (v1)arXiv:2605.033782026-05-0519 pages, CC-BY-4.0
Benchmark AgentLure§3 de l’article2026-05-054 domaines × 10 tâches × 8 vecteurs = 320 échantillons
Panorama LASM (v2)arXiv:2604.233382026-05-06Cadre 7 couches × 4 échelles temporelles sur 116 papers
Implémentation publiquePas encore publiéeLes auteurs publient le coding par paper ; code d’ARGUS à venir

Au fond : les défenses contre l’injection de prompt passent enfin de « filtrer l’entrée » à « auditer la décision ». C’est la bonne abstraction — c’est le niveau où l’agent s’engage réellement à agir sur le monde.

Sources