Tools
Approbations d’exécution — avancé
Sujets avancés sur l’approbation d’exécution : le chemin rapide safeBins, la liaison des interpréteurs/environnements d’exécution et le transfert des approbations vers les canaux de discussion (y compris la livraison native).
Pour la politique principale et le flux d’approbation, consultez Approbations d’exécution.
Binaires sûrs (entrée standard uniquement)
tools.exec.safeBins désigne des binaires limités à l’entrée standard (par exemple cut) qui s’exécutent en mode liste d’autorisation sans entrée explicite dans celle-ci. Les binaires sûrs rejettent les arguments positionnels de fichiers et les jetons ressemblant à des chemins ; ils ne peuvent donc agir que sur le flux entrant. Considérez cela comme un chemin rapide restreint pour les filtres de flux, et non comme une liste générale de confiance.
Binaires sûrs par défaut :
cut, uniq, head, tail, tr, wc
grep et sort ne figurent pas dans la liste par défaut. Si vous les activez, conservez des entrées explicites dans la liste d’autorisation pour leurs utilisations ne reposant pas sur l’entrée standard. Pour grep en mode binaire sûr, fournissez le motif avec -e/--regexp ; la forme positionnelle du motif est rejetée afin d’empêcher la dissimulation d’opérandes de fichiers sous forme d’arguments positionnels ambigus.
Validation d’argv et options interdites
La validation est déterministe et repose uniquement sur la structure d’argv (sans vérifier l’existence de fichiers sur le système hôte), ce qui empêche d’utiliser les différences entre autorisation et refus comme oracle d’existence de fichiers. Les options orientées fichiers sont interdites pour les binaires sûrs par défaut ; la validation des options longues échoue de manière fermée (les options inconnues et les abréviations ambiguës sont rejetées). Les options booléennes reconnues et en lecture seule des binaires par défaut (par exemple wc -l, tr -d, uniq -c) sont acceptées, tandis que les options courtes non reconnues restent refusées par défaut et nécessitent une approbation manuelle.
Options interdites par profil de binaire sûr :
grep:--dereference-recursive,--directories,--exclude-from,--file,--recursive,-R,-d,-f,-rjq:--argfile,--from-file,--library-path,--rawfile,--slurpfile,-L,-fsort:--compress-program,--files0-from,--output,--random-source,--temporary-directory,-T,-otail:--follow,--retry,-F,-fwc:--files0-from
Les binaires sûrs imposent également que les jetons d’argv soient traités comme du texte littéral lors de l’exécution (sans développement des caractères génériques ni des $VARS) pour les segments limités à l’entrée standard, de sorte que des motifs comme * ou $HOME/... ne puissent pas servir à dissimuler des lectures de fichiers. awk, sed et jq sont toujours refusés comme binaires sûrs, car leur sémantique ne peut pas être validée comme limitée à l’entrée standard : jq peut lire les données d’environnement et charger du code jq depuis des modules ou des fichiers de démarrage. Pour ces outils, utilisez plutôt une entrée explicite dans la liste d’autorisation ou une invite d’approbation que safeBins.
Répertoires de binaires approuvés
Les binaires sûrs doivent être résolus depuis des répertoires de binaires approuvés (valeurs système par défaut, complétées éventuellement par tools.exec.safeBinTrustedDirs). Les entrées de PATH ne sont jamais automatiquement approuvées. Les répertoires approuvés par défaut sont volontairement limités : /bin, /usr/bin. Si l’exécutable de votre binaire sûr se trouve dans des chemins de gestionnaire de paquets ou d’utilisateur (par exemple /opt/homebrew/bin, /usr/local/bin, /opt/local/bin, /snap/bin), ajoutez-les explicitement à tools.exec.safeBinTrustedDirs.
Chaînage de commandes shell, enveloppes et multiplexeurs
Le chaînage de commandes shell (&&, ||, ;) est autorisé lorsque chaque segment de premier niveau satisfait la liste d’autorisation (y compris les binaires sûrs ou l’autorisation automatique par une skill). Les redirections restent non prises en charge en mode liste d’autorisation. La substitution de commande ($() / accents graves) est rejetée lors de l’analyse de la liste d’autorisation, y compris à l’intérieur de guillemets doubles ; utilisez des guillemets simples si vous avez besoin du texte littéral $().
Pour les approbations via l’application compagnon macOS, le texte shell brut contenant une syntaxe de contrôle ou de développement shell (&&, ||, ;, |, `, $, <, >, (, )) est considéré comme ne correspondant pas à la liste d’autorisation, sauf si le binaire shell lui-même y figure.
Pour les enveloppes shell (bash|sh|zsh ... -c/-lc), les substitutions de variables d’environnement limitées à la requête sont réduites à une petite liste d’autorisation explicite (TERM, LANG, LC_*, COLORTERM, NO_COLOR, FORCE_COLOR).
Pour les décisions allow-always en mode liste d’autorisation, les enveloppes de distribution transparentes (par exemple env, flock, nice, nohup, stdbuf, timeout) enregistrent le chemin de l’exécutable interne plutôt que celui de l’enveloppe. Les multiplexeurs shell (busybox, toybox) sont désenveloppés de la même manière pour les applets shell (sh, ash, etc.). Si une enveloppe ou un multiplexeur ne peut pas être désenveloppé en toute sécurité, aucune entrée de liste d’autorisation n’est enregistrée automatiquement.
Si vous ajoutez à la liste d’autorisation des interpréteurs comme python3 ou node, privilégiez tools.exec.strictInlineEval=true afin que l’évaluation en ligne nécessite toujours une approbation explicite. En mode strict, allow-always peut toujours enregistrer des appels bénins d’interpréteur ou de script, mais les vecteurs d’évaluation en ligne ne sont pas enregistrés automatiquement.
Binaires sûrs et liste d’autorisation
| Sujet | tools.exec.safeBins |
Liste d’autorisation (exec-approvals.json) |
|---|---|---|
| Objectif | Autoriser automatiquement des filtres restreints à l’entrée standard | Faire explicitement confiance à des exécutables spécifiques |
| Type de correspondance | Nom de l’exécutable + politique d’argv du binaire sûr | Motif glob du chemin d’exécutable résolu, ou motif glob du nom de commande seul pour les commandes appelées via PATH |
| Portée des arguments | Restreinte par le profil du binaire sûr et les règles de jetons littéraux | Correspondance de chemin par défaut ; argPattern peut éventuellement restreindre l’argv analysé |
| Exemples courants | head, tail, tr, wc |
jq, python3, node, ffmpeg, CLI personnalisées |
| Utilisation recommandée | Transformations de texte à faible risque dans les pipelines | Tout outil ayant un comportement plus large ou des effets de bord |
Emplacement de la configuration :
safeBinsprovient de la configuration (tools.exec.safeBinsou, par agent,agents.list[].tools.exec.safeBins).safeBinTrustedDirsprovient de la configuration (tools.exec.safeBinTrustedDirsou, par agent,agents.list[].tools.exec.safeBinTrustedDirs).safeBinProfilesprovient de la configuration (tools.exec.safeBinProfilesou, par agent,agents.list[].tools.exec.safeBinProfiles). Les clés de profil propres à un agent remplacent les clés globales.- Les entrées de la liste d’autorisation se trouvent dans le fichier local d’approbations de l’hôte sous
agents.<id>.allowlist(ou via l’interface de contrôle /openclaw approvals allowlist ...). openclaw security auditémet l’avertissementtools.exec.safe_bins_interpreter_unprofiledlorsque des binaires d’interpréteur ou d’environnement d’exécution figurent danssafeBinssans profil explicite.openclaw doctor --fixpeut générer la structure des entrées personnaliséessafeBinProfiles.<bin>manquantes sous la forme{}(examinez-les et rendez-les plus restrictives ensuite). Les binaires d’interpréteur ou d’environnement d’exécution ne sont pas générés automatiquement.
Exemple de profil personnalisé : OC_I18N_900000
Commandes d’interpréteur ou d’environnement d’exécution
Les exécutions d’interpréteurs ou d’environnements d’exécution soumises à approbation sont volontairement prudentes :
- Le contexte exact d’argv, du répertoire de travail et de l’environnement est toujours lié.
- Les formes de script shell direct et de fichier d’environnement d’exécution direct sont liées, dans la mesure du possible, à un instantané précis d’un fichier local.
- Les formes courantes d’enveloppes de gestionnaire de paquets qui se résolvent toujours vers un seul fichier local direct (par exemple
pnpm exec,pnpm node,npm exec,npx) sont désenveloppées avant la liaison. - Si OpenClaw ne peut pas identifier exactement un fichier local précis pour une commande d’interpréteur ou d’environnement d’exécution (par exemple des scripts de paquet, des formes d’évaluation, des chaînes de chargeurs propres à l’environnement d’exécution ou des formes ambiguës à plusieurs fichiers), l’exécution soumise à approbation est refusée au lieu de prétendre offrir une couverture sémantique qu’elle ne possède pas.
- Pour ces flux de travail, privilégiez l’exécution en bac à sable, une limite d’hôte distincte ou une liste d’autorisation/un flux de travail complet explicitement approuvé dans lequel l’opérateur accepte la sémantique plus large de l’environnement d’exécution.
Lorsque des approbations sont requises, l’outil d’exécution renvoie immédiatement un identifiant d’approbation. Utilisez cet identifiant pour corréler les événements système ultérieurs de l’exécution approuvée (Exec finished, ainsi que Exec running lorsqu’il est configuré). Si aucune décision n’arrive avant l’expiration du délai, la requête est traitée comme une expiration de l’approbation et signalée comme un refus terminal de la commande hôte. Pour les approbations asynchrones de l’agent principal disposant d’une session d’origine, OpenClaw reprend également cette session avec un suivi interne afin que l’agent constate que la commande ne s’est pas exécutée, au lieu de tenter ultérieurement de réparer un résultat manquant. Les approbations d’exécution en attente expirent par défaut après 30 minutes.
Comportement de livraison du suivi
Après la fin d’une exécution asynchrone approuvée, OpenClaw envoie un tour agent de suivi à la même session.
Les approbations asynchrones refusées utilisent le même chemin de suivi de la session principale pour signaler le refus, mais elles n’enregistrent pas de transfert vers un environnement d’exécution élevé et n’exécutent pas la commande. Les refus sans session principale pouvant être reprise sont soit ignorés, soit signalés par une voie directe sûre lorsqu’il en existe une.
- S’il existe une cible de livraison externe valide (canal permettant la livraison et cible
to), le suivi est livré via ce canal. - Dans les flux limités au chat web ou aux sessions internes sans cible externe, la livraison du suivi reste limitée à la session (
deliver: false). - Si un appelant demande explicitement une livraison externe stricte sans canal externe pouvant être résolu, la requête échoue avec
INVALID_REQUEST. - Si
bestEffortDeliverest activé et qu’aucun canal externe ne peut être résolu, la livraison est rétrogradée en livraison limitée à la session au lieu d’échouer.
Transfert des approbations vers les canaux de discussion
Vous pouvez transférer les invites d’approbation d’exécution vers n’importe quel canal de discussion (y compris les canaux de Plugin) et les approuver avec /approve. Cette fonctionnalité utilise le pipeline normal de livraison sortante.
Configuration :
OC_I18N_900001
Répondez dans le chat :
OC_I18N_900002
La commande /approve gère à la fois les approbations d’exécution et celles de Plugin. Si l’identifiant ne correspond à aucune approbation d’exécution en attente, elle vérifie automatiquement les approbations de Plugin à la place. Ce mécanisme de repli est limité aux échecs de type « approbation introuvable » ; un refus ou une erreur réelle d’approbation d’exécution ne déclenche pas silencieusement une nouvelle tentative en tant qu’approbation de Plugin.
Transfert des approbations de Plugin
Le transfert des approbations de Plugin utilise le même pipeline de livraison que les approbations d’exécution, mais dispose de sa propre configuration indépendante sous approvals.plugin. L’activation ou la désactivation de l’un n’affecte pas l’autre.
Pour le comportement de création de Plugin, les champs de requête et la sémantique des décisions, consultez Demandes d’autorisation de Plugin.
OC_I18N_900003
La structure de configuration est identique à celle de approvals.exec : enabled, mode, agentFilter, sessionFilter et targets fonctionnent de la même manière.
Les canaux qui prennent en charge les réponses interactives partagées affichent les mêmes boutons d’approbation pour les approbations d’exécution et de
Plugin. Les canaux dépourvus d’interface utilisateur interactive partagée utilisent à la place du texte brut avec des instructions
/approve. Les demandes d’approbation de Plugin peuvent restreindre les décisions disponibles : les interfaces d’approbation utilisent
l’ensemble de décisions déclaré par la demande, et le Gateway rejette toute tentative d’envoyer une décision qui
n’a pas été proposée.
Approbations dans la même conversation sur n’importe quel canal
Lorsqu’une demande d’approbation d’exécution ou de Plugin provient d’une interface de conversation permettant la remise des messages, cette même conversation
peut l’approuver avec /approve par défaut. Cela s’applique à Slack, Matrix, Microsoft Teams et aux
conversations similaires permettant la remise des messages, en plus des flux existants de l’interface Web et de l’interface de terminal, en utilisant le
modèle d’authentification normal du canal pour cette conversation. Si la conversation d’origine peut déjà envoyer des commandes
et recevoir des réponses, les demandes d’approbation n’ont plus besoin d’un adaptateur de remise natif distinct uniquement pour
rester en attente.
Discord, Telegram et QQ bot prennent également en charge /approve dans la même conversation, mais ces canaux utilisent toujours leur
liste d’approbateurs résolue pour l’autorisation, même lorsque la remise native des approbations est désactivée.
Remise native des approbations
Certains canaux peuvent également agir comme clients d’approbation natifs : Discord, Slack, Telegram, Matrix et QQ bot.
Les clients natifs ajoutent les messages privés aux approbateurs, la diffusion vers la conversation d’origine et une expérience d’approbation interactive propre au canal,
en complément du flux partagé /approve dans la même conversation.
Lorsque des cartes ou boutons d’approbation natifs sont disponibles, cette interface native constitue le principal parcours destiné à l’agent.
L’agent ne doit pas également répéter une commande /approve en texte brut dans la conversation, sauf si le résultat de l’outil indique que
les approbations par conversation sont indisponibles ou que l’approbation manuelle est la seule possibilité restante.
Si un client d’approbation natif est configuré, mais qu’aucun environnement d’exécution natif n’est actif pour le canal
d’origine, OpenClaw conserve l’invite locale déterministe /approve visible. Si l’environnement d’exécution natif est
actif et tente la remise, mais qu’aucune cible ne reçoit la carte, OpenClaw envoie une notification de repli dans la même conversation
avec la commande exacte /approve <id> <decision> afin que la demande puisse toujours être traitée.
Modèle générique :
- la politique d’exécution de l’hôte détermine toujours si une approbation d’exécution est requise
approvals.execcontrôle le transfert des invites d’approbation vers d’autres destinations de conversationchannels.<channel>.execApprovalsdétermine si les clients natifs propres à Discord, Slack, Telegram, QQ bot et aux canaux similaires sont activés- les approbations de Plugin Slack peuvent utiliser le client d’approbation natif de Slack lorsque la demande provient de Slack
et que les approbateurs de Plugin Slack sont résolus ;
approvals.pluginpeut également acheminer les approbations de Plugin vers des sessions ou cibles Slack, même lorsque les approbations d’exécution Slack sont désactivées - les cartes d’approbation natives de Google Chat gèrent les approbations d’exécution et de Plugin provenant d’espaces ou de fils de discussion Google
Chat lorsque des approbateurs stables
users/<id>sont résolus à partir dedm.allowFromoudefaultTo; elles n’utilisent pas les événements de réaction pour les décisions - la remise des approbations par réaction dans WhatsApp et Signal est contrôlée par
approvals.execetapprovals.plugin; ces canaux ne comportent pas de blocschannels.<channel>.execApprovals
Les clients d’approbation natifs activent automatiquement la remise prioritaire par message privé lorsque toutes les conditions suivantes sont remplies :
- le canal prend en charge la remise native des approbations
- les approbateurs peuvent être résolus à partir de
execApprovals.approversexplicites ou de l’identité du propriétaire, telle quecommands.ownerAllowFrom channels.<channel>.execApprovals.enabledn’est pas défini ou vaut"auto"
Définissez enabled: false pour désactiver explicitement un client d’approbation natif. Définissez enabled: true pour forcer
son activation lorsque les approbateurs sont résolus. La remise publique dans la conversation d’origine reste explicitement contrôlée par
channels.<channel>.execApprovals.target. Lorsque la valeur native target active la remise dans la conversation d’origine,
les invites d’approbation incluent le texte de la commande.
- Discord :
channels.discord.execApprovals.* - Slack :
channels.slack.execApprovals.* - Telegram :
channels.telegram.execApprovals.* - QQ bot :
channels.qqbot.execApprovals.* - Google Chat : configurez des approbateurs stables avec
channels.googlechat.dm.allowFromouchannels.googlechat.defaultTo; aucun blocexecApprovalsn’est requis - WhatsApp : utilisez
approvals.execetapprovals.pluginpour acheminer les invites d’approbation vers WhatsApp - Signal : utilisez
approvals.execetapprovals.pluginpour acheminer les invites d’approbation vers Signal
Acheminement propre aux clients natifs :
- Telegram utilise par défaut les messages privés aux approbateurs (
target: "dm"). Passez àchanneloubothpour également afficher les invites d’approbation dans la conversation ou le sujet Telegram d’origine. Pour les sujets de forum Telegram, OpenClaw conserve le sujet pour l’invite d’approbation et le suivi après approbation. - Les approbateurs Discord et Telegram peuvent être explicites (
execApprovals.approvers) ou déduits decommands.ownerAllowFrom; seuls les approbateurs résolus peuvent approuver ou refuser. - Les approbateurs Slack peuvent être explicites (
execApprovals.approvers) ou déduits decommands.ownerAllowFrom. Les messages privés d’approbation de Plugin Slack utilisent les approbateurs de Plugin Slack issus deallowFromet l’acheminement par défaut du compte, et non les approbateurs d’exécution Slack. Les boutons natifs Slack conservent le type de l’identifiant d’approbation, de sorte que les identifiantsplugin:peuvent traiter les approbations de Plugin sans seconde couche de repli locale à Slack. - Les cartes natives de Google Chat conservent le repli manuel
/approvedans le texte du message, mais les rappels des boutons de la carte ne transportent que des jetons d’action opaques ; l’identifiant d’approbation et la décision sont récupérés depuis l’état des demandes en attente côté serveur. - Les approbations par emoji WhatsApp gèrent à la fois les invites d’exécution et de Plugin lorsque la famille de transfert de niveau supérieur correspondante achemine vers WhatsApp. Les invites d’origine native sont liées directement ; la remise en mode cible partagé lie les mêmes métadonnées typées d’approbation à l’accusé de réception de message WhatsApp accepté.
- Les approbations par réaction Signal gèrent à la fois les invites d’exécution et de Plugin uniquement lorsque la famille de
transfert de niveau supérieur correspondante est activée et achemine vers Signal. Les approbations d’exécution Signal directes dans la même conversation peuvent
supprimer le repli local
/approvesans approbateurs explicites ; la résolution par réaction Signal nécessite toujours des approbateurs Signal explicites provenant dechannels.signal.allowFromoudefaultTo. - L’acheminement natif Matrix par message privé ou canal et les raccourcis par réaction gèrent les approbations d’exécution et de Plugin ;
l’autorisation des Plugins provient toujours de
channels.matrix.dm.allowFrom. Les invites natives Matrix incluent le contenu d’événement personnalisécom.openclaw.approvaldans le premier événement d’invite afin que les clients Matrix compatibles avec OpenClaw puissent lire l’état d’approbation structuré, tandis que les clients standard conservent le repli en texte brut/approve. - Les boutons d’approbation natifs Discord et Telegram transportent un type explicite de propriétaire d’exécution ou de Plugin dans les
données de rappel privées au transport et ne traitent que ce propriétaire. Les anciens contrôles
/approvedépourvus de type restent un chemin de compatibilité limité : ils essaient uniquement les types de propriétaires que l’acteur peut approuver, ne poursuivent qu’après un résultat indiquant que l’approbation est introuvable et ne déduisent jamais la propriété à partir de l’identifiant d’approbation. - Le demandeur n’a pas besoin d’être un approbateur.
- Si aucune interface opérateur ni aucun client d’approbation configuré ne peut accepter la demande, l’invite utilise
askFallbackcomme solution de repli.
Les commandes de groupe sensibles réservées au propriétaire, telles que /diagnostics et /export-trajectory, utilisent un
acheminement privé vers le propriétaire pour les invites d’approbation et les résultats finaux. OpenClaw essaie d’abord un acheminement privé sur la
même interface que celle depuis laquelle le propriétaire a exécuté la commande. Si cette interface ne dispose d’aucun acheminement privé vers le propriétaire, OpenClaw
utilise à la place le premier acheminement disponible vers le propriétaire dans commands.ownerAllowFrom, de sorte qu’une commande de groupe Discord
peut toujours envoyer l’approbation et le résultat dans le message privé Telegram du propriétaire lorsque Telegram est configuré comme
interface privée principale. La conversation de groupe reçoit uniquement un bref accusé de réception.
Voir :
Applications mobiles officielles pour les opérateurs
Les applications officielles iOS et Android peuvent également examiner les approbations d’exécution en attente détenues par le Gateway
lorsqu’une connexion operator.admin est utilisée, ou lorsque leur appareil
operator.approvals associé a été explicitement ciblé par la demande. Elles lisent
le même enregistrement durable assaini que celui utilisé par la
Control UI, envoient une décision tenant compte du type et affichent le résultat canonique
de la première réponse du Gateway. L’Apple Watch reproduit ces invites d’approbation par l’intermédiaire
de l’iPhone associé, avec des actions d’autorisation unique et de refus. Le mode Gateway direct de la Watch
ne permet pas d’examiner les approbations.
La perte d’un accusé de réception de la résolution ne rend pas le choix envoyé définitif : l’application désactive les contrôles et relit l’enregistrement. Si une autre interface a prévalu, l’application affiche cette décision enregistrée. Les invites en attente restent liées au Gateway qui les a émises ; changer de Gateway actif ne peut donc pas rediriger un ancien identifiant d’approbation.
Flux IPC macOS
OC_I18N_900004 Remarques de sécurité :
- Mode du socket Unix
0600, jeton stocké dansexec-approvals.json. - Vérification du pair avec le même UID.
- Défi/réponse (nonce + jeton HMAC + hachage de la demande) + TTL court.
FAQ
Quand accountId et threadId sont-ils utilisés sur une cible d’approbation ?
Utilisez accountId lorsque plusieurs identités sont configurées pour le canal et que l’invite d’approbation doit
être envoyée par un compte précis. Utilisez threadId lorsque la destination prend en charge les sujets ou les
fils de discussion et que l’invite doit rester dans ce fil plutôt que dans la conversation de premier niveau.
Un exemple concret pour Telegram est un supergroupe d’exploitation avec des sujets de forum et deux comptes de bot Telegram.
La valeur to désigne le supergroupe, accountId sélectionne le compte du bot et threadId
sélectionne le sujet du forum :
OC_I18N_900005
Avec cette configuration, les approbations d’exécution transférées sont publiées par le compte Telegram ops-bot dans le sujet
77 de la conversation -1001234567890. Une cible sans accountId utilise le compte par défaut du canal, et
une cible sans threadId publie dans la destination de premier niveau.
Lorsque les approbations sont envoyées à une session, n’importe quel participant de cette session peut-il les approuver ?
Non. La remise dans une session détermine uniquement où l’invite apparaît. Elle n’autorise pas à elle seule chaque participant de cette conversation à approuver.
Pour le mécanisme générique /approve dans la même conversation, l’expéditeur doit déjà être autorisé à exécuter des commandes dans cette
session de canal. Si le canal expose des approbateurs explicites, ceux-ci peuvent autoriser
l’action /approve même s’ils ne sont pas autrement autorisés à exécuter des commandes dans cette session.
Certains canaux sont plus stricts. Les messages privés d’approbation natifs de Discord, Telegram, Matrix et Slack, ainsi que les
clients d’approbation natifs similaires, utilisent leurs listes d’approbateurs résolues pour autoriser les approbations. Par exemple,
une invite d’approbation dans un sujet de forum Telegram peut être visible par tous les participants du sujet, mais seuls les identifiants
numériques des utilisateurs Telegram résolus à partir de channels.telegram.execApprovals.approvers ou de
commands.ownerAllowFrom peuvent l’approuver ou la refuser.
Pages connexes
- Approbations d’exécution — politique centrale et flux d’approbation
- Outil d’exécution
- Mode privilégié
- Skills — comportement d’autorisation automatique reposant sur les Skills