Superviseur humainFichiers verrouilles (chflags uchg)Daemon Exec-GuardianIsolation de porteeAgent🔒🔒🔒XXXX

Chaque anneau est independant. Une breche dans une couche ne compromet pas les autres.

Un daemon Python independant qui intercepte chaque commande shell avant son execution. Il tourne sur un socket Unix, hors du workspace de l'agent, avec son code et ses politiques verrouilles par des flags d'immutabilite OS.

Trois niveaux d'enforcement

Auto-Deny

Les commandes dangereuses (sudo, rm -rf, chmod 777) sont automatiquement rejetees. Aucune revue humaine necessaire.

Auto-Allow

Les commandes de lecture (git status, curl, cat) sont automatiquement autorisees. Chemin rapide, aucun delai.

Ask-Human

Les commandes sensibles (git push, rm, kill, brew install) declenchent une demande d'approbation via iMessage avec un code de verification unique. Timeout de 2 minutes = refus automatique.

Commande AgentSocket UnixMoteur de reglesREFUS AUTOrm -rf, sudo, chmod 777BLOQUEDEMANDE HUMAINgit push, rm, kill, brewiMessageApprouve / RefuseACCORD AUTOgit status, cat, lsEXECUTE

Si le daemon plante ou devient inatteignable, TOUTES les commandes non pre-autorisees sont refusees. Fail-closed par design.

Les fichiers de configuration critiques sont proteges par des flags d'immutabilite OS (chflags uchg). L'agent ne peut pas modifier ses propres regles, son identite ou sa configuration de securite.

chflags uchgOS-level immutableXX
openclaw.json
SOUL.md
SECURITY.md
AGENTS.md
IDENTITY.md
TOOLS.md
exec-guardian.py
policies.json

Le deverrouillage necessite une intervention physique du superviseur humain.

Securite PIN

Toute action a fort impact necessite un code PIN numerique connu uniquement du superviseur humain. Le PIN est change apres toute suspicion de compromission et n'est jamais stocke dans les sessions de l'agent.

*
*
*
*

Implementation actuelle : PIN requis pour l'envoi d'emails, le deploiement de code, la suppression de fichiers et les modifications de configuration systeme.

Mail-Reader securise

L'agent mail-reader tourne en mode exec allowlist. Un seul script est autorise : mail-extract avec exactement 3 flags autorises (--hours, --account, --output). Tout le reste est refuse.

--hours
--account
--output
* (everything else)

Le traitement natif iMessage est desactive. Un daemon Python (imsg-watcher) poll la base de donnees chat.db en continu. Chaque message entrant spawne un sub-agent one-shot isole qui traite la demande puis se termine.

  • Aucune session persistante entre les messages
  • Cooldown de 24h pour les greetings par contact
  • Injection automatique des briefings projet
  • Timeout de 300 secondes par sub-agent
Utilisateur externeiMessagechat.dbPolling toutes les 5simsg-watcherdaemonSandbox isoleSub-agent one-shotTimeout 300s | Outils restreintsSub-agent detruitReponseMur d'isolationAgent PrincipalNe voit jamais les messages bruts

Chaque agent a ses propres permissions d'outils. L'agent principal a un acces large, tandis que les sub-agents operent avec des permissions minimales scopees a leur tache specifique. Un mail-reader ne peut pas deployer de code. Un bridge-reader n'a aucun outil.

AgentShellFichiersReseauGitEmailDeploy
main
mail-reader
bridge-reader
kickoff-coding
imsg-handler

Chaque sub-agent recoit uniquement les permissions minimales requises pour sa tache specifique.

Securite CLI iMessage

Le CLI d'envoi iMessage utilise des flags nommes uniquement (--to, --text). Les arguments positionnels sont rejetes. Cela empeche l'injection de commandes via le contenu des messages. Timeout de 45 secondes par envoi.

exec-guardian

Daemon permanent (launchd)

Couche d'enforcement runtime -- chaque execution d'outil passe par le guardian avant d'etre lancee.

HOW IT WORKS

  1. 1Daemon Python ecoutant sur un socket Unix (exec-approvals). Chaque appel exec d'OpenClaw est intercepte
  2. 2Moteur de decision a 3 niveaux : auto-deny (commandes dangereuses comme rm -rf, curl vers hotes inconnus), auto-allow (commandes sures correspondant a l'allowlist), ask-julien (cas ambigus envoyes via iMessage pour approbation humaine)
  3. 3Politiques definies dans policies.json -- le daemon et le fichier de politique sont verrouilles avec chflags uchg (immuables)
  4. 4Fail-closed : si le daemon guardian plante ou est injoignable, TOUTES les executions sont bloquees. L'agent ne peut pas le contourner

WHY IT MATTERS

Un agent IA avec acces shell peut tout faire. Le guardian garantit que meme un agent compromis ou confus ne peut pas executer de commandes destructrices sans approbation humaine. C'est la derniere ligne de defense.

imsg-watcher

Daemon permanent (launchd)

Remplace le traitement natif d'iMessage par un pipeline de traitement de messages controle et isole.

HOW IT WORKS

  1. 1Interroge chat.db de macOS (SQLite) toutes les quelques secondes pour les nouveaux messages. L'integration iMessage native est desactivee
  2. 2Chaque message entrant spawn un sub-agent one-shot jetable : nouveau contexte, outils restreints, timeout 300s. Quand le sub-agent finit, il est detruit
  3. 3Cooldown de 24h pour les salutations par contact pour eviter le spam. Le contexte projet est auto-injecte selon le contact
  4. 4L'agent principal ne voit jamais le contenu brut d'iMessage -- seul le sub-agent le voit. Si le sub-agent est compromis par un message, les degats sont contenus

WHY IT MATTERS

iMessage est un vecteur d'attaque : quiconque connait le numero de telephone peut envoyer des injections de prompt. Le watcher isole chaque message dans un bac a sable jetable. Un message malveillant tue un sub-agent -- l'agent principal n'est pas affecte.

Securite en detail -- Architecture | OpenClaw × Easylab