feat(secu): confirmation liée (tool+args) pour les actions irréversibles — anti ride-the-oui #28
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "secu/risky-confirm-p2"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Résurrection du draft #137 (anti « ride-the-oui »), réimplémenté post-P2
La branche originale
secu/risky-confirm-binding(24-06) datait d'avant le refactor P2 (wolf_tools 5235→595 l.) — rebase impossible, réimplémentation sur le registreToolDef.Ce que ça ferme
En mode Demande, un « oui » de l'utilisateur flottait : donné pour une action A, il autorisait n'importe quelle action B ré-émise ensuite (détournement par prompt injection — outil différent OU mêmes outil/args détournés). Désormais un outil risqué (irréversible/sortant) exige un pending qui matche exactement
tool_nameETargs, plus une confirmation courte (« oui ») ou une approbation UI. Purge des autres pendingsexec:: un « oui » ne peut viser qu'une seule action.Architecture
ToolDef.risky: nouveau flag source-unique (commeread_only/admin_only), posé sur 10 outils cœur.RISKY_TOOLS(façade wolf_tools) : dérivé du registre +channel_send/webhook_send(outils sortants auto-découverts des plugins, alignés sur_CATASTROPHIC_OUTWARD_PREFIXESde trust_gate) + heuristique verbes mutants pour les MCP dynamiques (mcp_gmail_send…).Écart assumé vs le draft
Le draft gatait TOUS les modes, y compris l'Autonome. Ici le gate est scopé au mode Demande (+ liaison args de la carte Restreint) : l'Autonome reste non bridé, conformément au modèle de menace (mono-user/VPS, agent root voulu) et à la règle « ne PAS brider l'agent auto-améliorable ». La réponse injection en Autonome reste le trust-tainting (Lot E).
Tests
13 tests de logique pure (
test_risky_confirmation.py) : flag registre, heuristique MCP, confirmation courte stricte, matching lié (4 scénarios de détournement).Suite complète locale : 888 passed, mêmes 9 échecs + 2 erreurs préexistants que main (tests Postgres-dépendants, verts en CI).
🤖 Generated with Claude Code
https://claude.ai/code/session_01F5SST5qru4jYV2NoCwPBu6