shell.exec, édite des fichiers,
récupère des URL et charge des skills communautaires — n’importe lequel de
ces actes peut rm -rf un volume, lire un .env, ou exfiltrer vers un hôte
attaquant. Cette recette verrouille cette surface avec le
Firewall : refusez le shell destructeur, validez
les arguments des appels que vous autorisez, clôturez l’egress, et mettez
les opérations véritablement risquées en attente d’un humain. Rien de cela
ne touche le code de votre agent — la politique vit dans la passerelle et
est appliquée au prochain appel.
Tout ce qui suit est configuré dans la console (Firewall → Posture /
Politiques). Ces routes de gestion utilisent votre session de console, pas
une clé de relais. Seuls les appels
/v1/* que votre agent effectue
portent une clé sk-orca-…. Les éditions de politique nécessitent le rôle
Developer.1. Commencez par observer, pas bloquer — le référentiel agent de codage sécurisé
Ne rédigez pas de règles à l’aveugle. Donnez à l’agent sa clésk-orca-…,
puis ouvrez Firewall → Posture et appliquez le niveau
d’autonomie balanced.
En une seule transaction, cela audite chaque appel d’outil, signale la PII,
et refuse le shell destructeur — de sorte que la pire action est déjà
clôturée pendant que vous apprenez le reste du comportement de l’agent à
partir du trafic réel.
Laissez-le tourner, puis lisez Firewall → Discovered tools : chaque
outil que l’espace de travail a vu, marqué covered (une règle
s’applique) ou gap (aucune ne s’applique). Cette liste est le brouillon
de votre allow-list. Quand le flux semble correct, passez à tight
(deny par défaut) ou rédigez la politique ciblée ci-dessous.
2. Refusez le shell destructeur — le plancher non négociable
La règle la plus importante pour un agent de codage est pas de shell destructeur. Les niveaux d’autonomiebalanced et tight livrent déjà
cela comme le preset Block destructive shell, qui matérialise de vraies
règles deny éditables couvrant à la fois les noms d’outils en direct de
l’espace de travail (shell.*, bash, cmd.*, powershell.*, exec.*)
et les formes namespacées MCP qu’un serveur enregistré expose (*.shell.*,
*.cmd.*, …).
Si vous préférez le scoper plus serré que « refuser tout shell », rédigez
une règle qui ne refuse que les commandes destructrices et audite le
reste. Une règle correspond sur un glob de nom d’outil plus un prédicat
d’argument optionnel (JSONPath contre les arguments de l’appel) :
Refuser rm -rf mais autoriser les autres appels shell
Refuser rm -rf mais autoriser les autres appels shell
Dans Firewall → Policies, ajoutez une règle au-dessus de votre
défaut :
- Glob d’outil :
shell.exec - Args match (clause JSONPath) :
- Verdict :
deny
eq, contains,
regex, in, cidr_match, gt, lt. Un appel dont le $.command
correspond au regex est bloqué ; tout le reste retombe sur la règle
suivante.À quoi ressemble le block
À quoi ressemble le block
Un appel refusé sur la surface inbound renvoie une HTTP 400 avec
le code d’erreur
firewall_blocked et un message nommant l’outil et la
raison. Un appel dispatché à travers la passerelle MCP revient comme une
erreur d’outil (firewall deny: …) afin que le modèle puisse réagir
au lieu de planter. Les blocks inbound se déclenchent avant l’appel au
modèle amont, donc ils ne coûtent aucun token de modèle.3. Validez les arguments sur les outils que vous gardez
Autoriser un outil n’est pas la même chose qu’autoriser chaque argument qu’on lui passe. Le même prédicat JSONPath qui scope un deny vous permet de contraindre la forme d’un appel autorisé — de sorte quedb.query ne
puisse pas porter un DROP, et file.write ne puisse pas s’échapper d’un
répertoire.
Bloquer un DROP SQL
Glob
db.query, clause
{"path":"$.sql","op":"regex","value":"(?i)\\bdrop\\b"}, verdict
deny.Redacter un secret dans les args
Le verdict
sanitize redacte les sous-chaînes correspondantes des
arguments de l’appel d’outil avant que l’appel ne soit transmis. Il
ne touche jamais ce qu’un outil renvoie ; sur la surface inbound (pas
encore d’arguments au moment de l’appel) il escalade en un block.4. Contrôlez l’egress — clôturez où l’agent peut atteindre
Un agent de codage qui peut récupérer des URL peut être dirigé vers du SSRF (atteindre le cloud-metadata ou un hôte interne10.x) ou utilisé pour
exfiltrer. Le niveau d’autonomie tight livre un preset SSRF qui refuse
les noms d’outils de forme « fetch » (http_fetch, web_search,
fetch_url, request, et leurs formes <server>.*) purement et
simplement.
Pour un contrôle au niveau de la destination, rédigez une règle egress.
Les règles d’egress scopent par host ou CIDR avec des entrées allow /
deny, évaluées sur la surface egress :
Aucun preset ne livre de règles d’egress basées sur CIDR — le preset SSRF
correspond aux noms d’outils de forme « fetch ». La denylist host/CIDR
ci-dessus en est une que vous rédigez vous-même. Voir
Arrêter l’exfiltration pour le
motif complet.
5. Mettez les opérations risquées en attente d’un humain (HITL)
Certaines opérations ne devraient être ni auto-autorisées ni auto-refusées — un déploiement, ungit push, une migration destructrice.
Pour celles-là, utilisez le verdict pending_approval. L’appel est mis en
attente, l’agent reçoit une réponse « held » avec un id d’approbation, et
un relecteur le résout hors-bande :
- Rédigez une règle (par ex. glob
deploy.*, verdictpending_approval). - L’appel mis en attente renvoie une HTTP 400
firewall_approval_pendingavec un id d’approbation. - Un relecteur l’approuve depuis la console (Developer+) ou via un callback webhook signé HMAC.
- L’agent interroge l’approbation, puis re-soumet l’appel d’origine avec un
en-tête
X-OrcaRouter-Firewall-Approvalà usage unique — et la passerelle le laisse passer cette fois-là.
6. Gouvernez les skills et serveurs MCP qu’il charge
Les agents de codage tirent des capacités à l’exécution — skills communautaires, serveurs MCP BYO. Le Firewall gouverne les deux à la passerelle :- Les Skills sont scannés dans une bande de risque avec un mode
d’application (
allow/quarantine/block). Un skill auto-détecté est mis en quarantaine — en attente d’approbation — jusqu’à ce qu’un relecteur le valide. Voir Skills. - Les serveurs MCP que vous enregistrez dispatchent chaque
tools/callà travers la passerelle, qui évalue chacun sur la surfacemcpavant le dispatch. Les identifiants sont stockés chiffrés ; une sonde de santé rapporteok/degraded/down. Voir Serveurs MCP et Durcir un agent MCP.
7. Vérifiez et observez
Avant de dépendre d’une politique, exécutez-la en dry-run. L’onglet Test évalue un appel d’outil d’échantillon contre la politique actuelle et montre le verdict, la règle correspondante et la raison — rien n’est dispatché, rien n’est persisté. Une fois en direct, Firewall → Events / Runs est l’enregistrement de chaque évaluation, filtrable par verdict, surface, outil et exécution, et le flux d’anomalies signale les pics de débit/coût contre la baseline apprise de l’espace de travail,retry_loop,
et les chemins d’outils jamais vus auparavant.
Récapitulatif
Référence Firewall
Le plan de politique complet — surfaces, verdicts, résolution,
autonomie.
Règles du firewall
Le langage de correspondance : globs, clauses d’arguments, egress,
séquences.
Appels d'outils dangereux
La menace contre laquelle cette recette se défend.
Agence excessive
Pourquoi les agents sur-permissionnés sont le risque agent central.
Recette agent autonome
Verrouillez de bout en bout une boucle d’agent pleinement autonome.
Arrêter l'exfiltration
Les motifs d’egress et de trifecta létale en profondeur.
