Skip to main content
Une injection indirecte arrive par une donnée : un ticket, un courriel, une page web, la réponse d’un outil. Le modèle la lit, puis propose une action dont la cible vient de cette donnée. Depuis la v1.9, AGENT-L suit d’où vient chaque valeur, et la politique peut refuser une action dont la cible vient d’une source non fiable.

Les étiquettes

Chaque valeur de l’état porte une étiquette : l’ensemble des sources qui ont servi à la calculer. L’étiquette survit à tout : recopie par SET, arithmétique, EFFECT, branche. Aucune transformation ne retire une source. Le flux implicite est suivi. Une valeur affectée sous une décision porte aussi l’étiquette de cette décision :
env vaut un littéral, mais il a été choisi par le message : il porte la source EVENT. Sans cela, une injection choisirait une constante « de confiance ».

Les fonctions de garde

x est un chemin : un argument de l’action jugée, ou tout chemin de l’état. action désigne l’action entière, ses arguments et la décision qui l’a produite.
Un NEVER s’évalue avant l’approbation. Un opérateur pressé qui approuve tout ne lève pas le refus.

Attester n’est pas faire confiance

Quand un outil s’exécute avec succès, chaque valeur de ses arguments est attestée par cet outil. ATTESTED(x, check_wipeable) le lit. L’étiquette de x ne change pas : une valeur validée reste une valeur venue du modèle.
Tout appel réussi atteste ses arguments, même si l’outil répond {"ok": "no"}. Un validateur doit donc lever une exception pour refuser une cible.

Côté hôte

Un capteur qui lit du texte écrit par un tiers peut le dire :
La valeur reçoit EXTERNAL en plus d’OBSERVED. L’hôte peut dégrader une valeur, jamais l’élever : aucune fonction ne rend une valeur fiable.

Sens de sûreté

  • Une valeur sans étiquette connue est UNKNOWN, donc non fiable.
  • Une valeur absente rend la fonction indéfinie, donc la garde indéterminée : un NEVER s’applique, un ALLOW ne compte pas.
  • Écrivez la protection en NEVER. Un ALLOW outil WHEN TRUSTED(x) est fermé tant qu’il est seul, mais une autre règle ALLOW sur le même outil suffit à le contourner.

Diagnostics

Tester une garde de provenance

Les scénarios voient les mêmes étiquettes qu’en production. Un chemin OBSERVE posé par GIVEN est OBSERVED, une réponse REASON est LLM :
EXPECT BLOCKED prouve que c’est la politique qui a refusé, et pas un plan jamais atteint.

Limite actuelle

Les gardes de provenance agissent à l’exécution. Les diagnostics statiques W119 et W125 et le théorème T6 ne les créditent pas encore. Pour une cible risquée, écrivez les deux : le paramètre ATTESTS, qui rend T6 démontrable, et la garde UNTRUSTED, qui tient quand la valeur arrive par un chemin que l’analyse statique ne suit pas.

Politiques

Ordre de décision et gardes indéterminées.

Banc comparatif

La même injection face à LangGraph, PydanticAI et CrewAI.