Tools
Exec-Genehmigungen — erweitert
Fortgeschrittene Themen zu Exec-Freigaben: der safeBins-Schnellpfad, Interpreter-/Runtime-
Bindung und die Weiterleitung von Freigaben an Chat-Kanäle (einschließlich nativer Zustellung).
Die zentrale Richtlinie und den Freigabeablauf finden Sie unter Exec-Freigaben.
Sichere Binaries (nur stdin)
tools.exec.safeBins definiert eine kleine Liste von nur-stdin-Binaries (zum
Beispiel cut), die im Allowlist-Modus ohne explizite Allowlist-
Einträge ausgeführt werden können. Sichere Binaries lehnen positionale Dateiargumente und pfadähnliche Tokens ab, sodass sie
nur mit dem eingehenden Stream arbeiten können. Behandeln Sie dies als engen Schnellpfad für
Stream-Filter, nicht als allgemeine Vertrauensliste.
Standardmäßig sichere Binaries:
cut, uniq, head, tail, tr, wc
grep und sort sind nicht in der Standardliste enthalten. Wenn Sie sie aktivieren, behalten Sie explizite
Allowlist-Einträge für ihre Nicht-stdin-Workflows bei. Für grep im Modus für sichere Binaries
geben Sie das Muster mit -e/--regexp an; die positionale Musterform wird abgelehnt,
damit Dateioperanden nicht als mehrdeutige positionale Argumente eingeschleust werden können.
Argv-Validierung und abgelehnte Flags
Die Validierung ist ausschließlich anhand der argv-Form deterministisch (keine Existenzprüfungen im Host-Dateisystem), wodurch Datei-Existenz-Orakelverhalten durch Allow-/Deny- Unterschiede verhindert wird. Dateiorientierte Optionen werden für standardmäßig sichere Binaries abgelehnt; lange Optionen werden fail-closed validiert (unbekannte Flags und mehrdeutige Abkürzungen werden abgelehnt).
Nach Profil für sichere Binaries abgelehnte Flags:
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,-owc:--files0-from
Sichere Binaries erzwingen außerdem, dass argv-Tokens zur Ausführungszeit als literaler Text
behandelt werden (kein Globbing und keine Erweiterung von $VARS) für nur-stdin-Segmente, sodass Muster
wie * oder $HOME/... nicht zum Einschleusen von Dateilesevorgängen verwendet werden können.
Vertrauenswürdige Binary-Verzeichnisse
Sichere Binaries müssen aus vertrauenswürdigen Binary-Verzeichnissen aufgelöst werden (Systemstandardwerte plus
optional tools.exec.safeBinTrustedDirs). PATH-Einträge werden nie automatisch als vertrauenswürdig eingestuft.
Die standardmäßig vertrauenswürdigen Verzeichnisse sind absichtlich minimal: /bin, /usr/bin. Wenn
Ihre ausführbare sichere Binary in Paketmanager-/Benutzerpfaden liegt (zum Beispiel
/opt/homebrew/bin, /usr/local/bin, /opt/local/bin, /snap/bin), fügen Sie diese
explizit zu tools.exec.safeBinTrustedDirs hinzu.
Shell-Verkettung, Wrapper und Multiplexer
Shell-Verkettung (&&, ||, ;) ist erlaubt, wenn jedes Top-Level-Segment
die Allowlist erfüllt (einschließlich sicherer Binaries oder Skills-Auto-Allow). Umleitungen
bleiben im Allowlist-Modus nicht unterstützt. Befehlssubstitution ($() / Backticks) wird
beim Allowlist-Parsing abgelehnt, auch innerhalb doppelter Anführungszeichen; verwenden Sie einfache
Anführungszeichen, wenn Sie literalen $()-Text benötigen.
Bei Freigaben in der macOS-Companion-App wird roher Shell-Text, der Shell-Steuer- oder
Erweiterungssyntax enthält (&&, ||, ;, |, `, $, <, >, (, )), als
Allowlist-Fehltreffer behandelt, sofern die Shell-Binary selbst nicht auf der Allowlist steht.
Für Shell-Wrapper (bash|sh|zsh ... -c/-lc) werden anfragebezogene Env-Overrides
auf eine kleine explizite Allowlist reduziert (TERM, LANG, LC_*, COLORTERM,
NO_COLOR, FORCE_COLOR).
Bei allow-always-Entscheidungen im Allowlist-Modus speichern bekannte Dispatch-Wrapper (env,
nice, nohup, stdbuf, timeout) den inneren Pfad der ausführbaren Datei statt
des Wrapper-Pfads. Shell-Multiplexer (busybox, toybox) werden für
Shell-Applets (sh, ash usw.) auf die gleiche Weise entpackt. Wenn ein Wrapper oder Multiplexer
nicht sicher entpackt werden kann, wird kein Allowlist-Eintrag automatisch gespeichert.
Wenn Sie Interpreter wie python3 oder node auf die Allowlist setzen, bevorzugen Sie
tools.exec.strictInlineEval=true, damit Inline-Eval weiterhin eine explizite
Freigabe erfordert. Im strikten Modus kann allow-always weiterhin unbedenkliche
Interpreter-/Skriptaufrufe speichern, aber Inline-Eval-Träger werden nicht automatisch
gespeichert.
Sichere Binaries gegenüber Allowlist
| Thema | tools.exec.safeBins |
Allowlist (exec-approvals.json) |
|---|---|---|
| Ziel | Enge stdin-Filter automatisch erlauben | Bestimmten ausführbaren Dateien explizit vertrauen |
| Match-Typ | Name der ausführbaren Datei + argv-Richtlinie für sichere Binaries | Aufgelöstes Pfad-Glob der ausführbaren Datei oder nacktes Befehlsnamen-Glob für über PATH aufgerufene Befehle |
| Argumentumfang | Durch Profil für sichere Binaries und Literal-Token-Regeln eingeschränkt | Standardmäßig Pfad-Match; optionales argPattern kann geparstes argv einschränken |
| Typische Beispiele | head, tail, tr, wc |
jq, python3, node, ffmpeg, benutzerdefinierte CLIs |
| Beste Verwendung | Texttransformationen mit geringem Risiko in Pipelines | Jedes Tool mit breiterem Verhalten oder Seiteneffekten |
Konfigurationsort:
safeBinsstammt aus der Konfiguration (tools.exec.safeBinsoder pro Agentagents.list[].tools.exec.safeBins).safeBinTrustedDirsstammt aus der Konfiguration (tools.exec.safeBinTrustedDirsoder pro Agentagents.list[].tools.exec.safeBinTrustedDirs).safeBinProfilesstammt aus der Konfiguration (tools.exec.safeBinProfilesoder pro Agentagents.list[].tools.exec.safeBinProfiles). Profilschlüssel pro Agent überschreiben globale Schlüssel.- Allowlist-Einträge liegen in der host-lokalen Datei
~/.openclaw/exec-approvals.jsonunteragents.<id>.allowlist(oder über Control UI /openclaw approvals allowlist ...). openclaw security auditwarnt mittools.exec.safe_bins_interpreter_unprofiled, wenn Interpreter-/Runtime-Binaries insafeBinsohne explizite Profile erscheinen.openclaw doctor --fixkann fehlende benutzerdefiniertesafeBinProfiles.<bin>-Einträge als{}anlegen (danach prüfen und enger fassen). Interpreter-/Runtime-Binaries werden nicht automatisch angelegt.
Beispiel für ein benutzerdefiniertes Profil:
OC_I18N_900000
Wenn Sie jq explizit in safeBins aufnehmen, lehnt OpenClaw das env-Builtin im Modus für sichere Binaries
weiterhin ab, sodass jq -n env die Host-Prozessumgebung nicht ohne expliziten Allowlist-Pfad
oder Freigabeaufforderung ausgeben kann.
Interpreter-/Runtime-Befehle
Freigabegestützte Interpreter-/Runtime-Ausführungen sind absichtlich konservativ:
- Exakter argv-/cwd-/env-Kontext ist immer gebunden.
- Direkte Shell-Skript- und direkte Runtime-Dateiformen werden bestmöglich an einen konkreten lokalen Datei-Snapshot gebunden.
- Gängige Paketmanager-Wrapper-Formen, die weiterhin zu einer direkten lokalen Datei auflösen (zum Beispiel
pnpm exec,pnpm node,npm exec,npx), werden vor der Bindung entpackt. - Wenn OpenClaw für einen Interpreter-/Runtime-Befehl nicht exakt eine konkrete lokale Datei identifizieren kann (zum Beispiel Paket-Skripte, Eval-Formen, runtime-spezifische Loader-Ketten oder mehrdeutige Multi-Datei- Formen), wird die freigabegestützte Ausführung abgelehnt, statt eine semantische Abdeckung zu behaupten, die sie nicht hat.
- Für diese Workflows bevorzugen Sie Sandboxing, eine separate Host-Grenze oder einen explizit vertrauenswürdigen Allowlist-/vollständigen Workflow, bei dem der Operator die breitere Runtime-Semantik akzeptiert.
Wenn Freigaben erforderlich sind, gibt das exec-Tool sofort eine Freigabe-ID zurück. Verwenden Sie diese ID, um
spätere Systemereignisse (Exec finished / Exec denied) zuzuordnen. Wenn vor Ablauf des
Timeouts keine Entscheidung eintrifft, wird die Anfrage als Freigabe-Timeout behandelt und als Ablehnungsgrund angezeigt.
Verhalten der Follow-up-Zustellung
Nachdem ein genehmigter asynchroner Exec abgeschlossen ist, sendet OpenClaw einen Follow-up-agent-Turn an dieselbe Sitzung.
- Wenn ein gültiges externes Zustellziel vorhanden ist (zustellbarer Kanal plus Ziel
to), verwendet die Follow-up-Zustellung diesen Kanal. - In reinen Webchat- oder internen Sitzungsabläufen ohne externes Ziel bleibt die Follow-up-Zustellung nur sitzungsintern (
deliver: false). - Wenn ein Aufrufer explizit strikte externe Zustellung ohne auflösbaren externen Kanal anfordert, schlägt die Anfrage mit
INVALID_REQUESTfehl. - Wenn
bestEffortDeliveraktiviert ist und kein externer Kanal aufgelöst werden kann, wird die Zustellung auf sitzungsintern herabgestuft, statt fehlzuschlagen.
Weiterleitung von Freigaben an Chat-Kanäle
Sie können Exec-Freigabeaufforderungen an jeden Chat-Kanal weiterleiten (einschließlich Plugin-Kanälen) und sie
mit /approve genehmigen. Dies verwendet die normale Pipeline für ausgehende Zustellung.
Konfiguration:
OC_I18N_900001
Antworten Sie im Chat:
OC_I18N_900002
Der Befehl /approve verarbeitet sowohl Exec-Freigaben als auch Plugin-Freigaben. Wenn die ID keiner ausstehenden Exec-Freigabe entspricht, prüft er automatisch stattdessen Plugin-Freigaben.
Weiterleitung von Plugin-Freigaben
Die Weiterleitung von Plugin-Freigaben verwendet dieselbe Zustellungspipeline wie Exec-Freigaben, hat aber ihre eigene
unabhängige Konfiguration unter approvals.plugin. Das Aktivieren oder Deaktivieren der einen wirkt sich nicht auf die andere aus.
OC_I18N_900003
Die Konfigurationsform ist identisch mit approvals.exec: enabled, mode, agentFilter,
sessionFilter und targets funktionieren auf die gleiche Weise.
Kanäle, die gemeinsam genutzte interaktive Antworten unterstützen, zeigen dieselben Freigabe-Buttons für Exec- und
Plugin-Freigaben an. Kanäle ohne gemeinsam genutzte interaktive UI fallen auf Klartext mit /approve-
Anweisungen zurück.
Plugin-Freigabeanfragen können die verfügbaren Entscheidungen einschränken. Freigabeoberflächen verwenden die in der Anfrage
deklarierte Entscheidungsmenge, und der Gateway lehnt Versuche ab, eine Entscheidung einzureichen, die nicht angeboten wurde.
Freigaben im selben Chat auf jedem Kanal
Wenn eine Exec- oder Plugin-Freigabeanfrage von einer zustellbaren Chat-Oberfläche stammt, kann derselbe Chat
sie jetzt standardmäßig mit /approve genehmigen. Dies gilt neben den bestehenden Web-UI- und Terminal-UI-Abläufen
auch für Kanäle wie Slack, Matrix und Microsoft Teams.
Dieser gemeinsame Textbefehlsweg verwendet das normale Kanal-Auth-Modell für diese Unterhaltung. Wenn der ursprüngliche Chat bereits Befehle senden und Antworten empfangen kann, benötigen Freigabeanfragen keinen separaten nativen Zustelladapter mehr, nur um ausstehend zu bleiben.
Discord und Telegram unterstützen ebenfalls /approve im selben Chat, aber diese Kanäle verwenden weiterhin ihre
aufgelöste Genehmigerliste für die Autorisierung, auch wenn die native Freigabezustellung deaktiviert ist.
Für Telegram und andere native Freigabeclients, die den Gateway direkt aufrufen, ist dieser Fallback absichtlich auf Fehler vom Typ „Freigabe nicht gefunden“ begrenzt. Eine echte Ablehnung/ein echter Fehler einer Exec-Freigabe versucht nicht stillschweigend erneut eine Plugin-Freigabe.
Native Freigabezustellung
Einige Kanäle können auch als native Genehmigungs-Clients fungieren. Native Clients ergänzen den gemeinsamen /approve-Ablauf im selben Chat um DMs an Genehmiger, Fanout in den Ursprungs-Chat und kanalspezifische interaktive Genehmigungs-UX.
Wenn native Genehmigungskarten/-Buttons verfügbar sind, ist diese native UI der primäre agentenseitige Pfad. Der Agent sollte nicht zusätzlich einen doppelten einfachen Chat-Befehl /approve ausgeben, es sei denn, das Tool-Ergebnis meldet, dass Chat-Genehmigungen nicht verfügbar sind oder die manuelle Genehmigung der einzige verbleibende Pfad ist.
Wenn ein nativer Genehmigungs-Client konfiguriert ist, aber keine native Runtime für den Ursprungskanal aktiv ist, hält OpenClaw den lokalen deterministischen /approve-Prompt sichtbar. Wenn die native Runtime aktiv ist und die Zustellung versucht, aber kein Ziel die Karte empfängt, sendet OpenClaw eine Fallback-Benachrichtigung im selben Chat mit dem exakten Befehl /approve <id> <decision>, damit die Anfrage weiterhin aufgelöst werden kann.
Generisches Modell:
- Die Exec-Richtlinie des Hosts entscheidet weiterhin, ob eine Exec-Genehmigung erforderlich ist.
approvals.execsteuert die Weiterleitung von Genehmigungs-Prompts an andere Chat-Ziele.channels.<channel>.execApprovalssteuert, ob dieser Kanal als nativer Genehmigungs-Client agiert.
Native Genehmigungs-Clients aktivieren die DM-zuerst-Zustellung automatisch, wenn all dies zutrifft:
- Der Kanal unterstützt native Genehmigungszustellung.
- Genehmiger können aus expliziten
execApprovals.approversoder aus einer Eigentümeridentität wiecommands.ownerAllowFromaufgelöst werden. channels.<channel>.execApprovals.enabledist nicht gesetzt oder"auto".
Setzen Sie enabled: false, um einen nativen Genehmigungs-Client explizit zu deaktivieren. Setzen Sie enabled: true, um ihn zu erzwingen, wenn Genehmiger aufgelöst werden. Die öffentliche Zustellung im Ursprungs-Chat bleibt über channels.<channel>.execApprovals.target explizit.
FAQ: Warum gibt es zwei Exec-Genehmigungskonfigurationen für Chat-Genehmigungen?
- Discord:
channels.discord.execApprovals.* - Slack:
channels.slack.execApprovals.* - Telegram:
channels.telegram.execApprovals.*
Diese nativen Genehmigungs-Clients ergänzen den gemeinsamen /approve-Ablauf im selben Chat und die gemeinsamen Genehmigungs-Buttons um DM-Routing und optionalen Kanal-Fanout.
Gemeinsames Verhalten:
- Slack, Matrix, Microsoft Teams und ähnliche zustellbare Chats verwenden das normale Kanal-Auth-Modell für
/approveim selben Chat. - Wenn ein nativer Genehmigungs-Client automatisch aktiviert wird, ist das standardmäßige native Zustellungsziel DMs an Genehmiger.
- Für Discord und Telegram können nur aufgelöste Genehmiger genehmigen oder ablehnen.
- Discord-Genehmiger können explizit sein (
execApprovals.approvers) oder auscommands.ownerAllowFromabgeleitet werden. - Telegram-Genehmiger können explizit sein (
execApprovals.approvers) oder auscommands.ownerAllowFromabgeleitet werden. - Slack-Genehmiger können explizit sein (
execApprovals.approvers) oder auscommands.ownerAllowFromabgeleitet werden. - Native Slack-Buttons bewahren die Art der Genehmigungs-ID, sodass
plugin:-IDs Plugin-Genehmigungen ohne zweite Slack-lokale Fallback-Ebene auflösen können. - Natives Matrix-DM-/Kanal-Routing und Reaktionskürzel verarbeiten sowohl Exec- als auch Plugin-Genehmigungen; die Plugin-Autorisierung stammt weiterhin aus
channels.matrix.dm.allowFrom. - Native Matrix-Prompts enthalten
com.openclaw.approval-benutzerdefinierten Event-Inhalt im ersten Prompt-Event, sodass OpenClaw-fähige Matrix-Clients strukturierten Genehmigungsstatus lesen können, während Standard-Clients den Klartext-Fallback/approvebehalten. - Der Anfragende muss kein Genehmiger sein.
- Der Ursprungs-Chat kann direkt mit
/approvegenehmigen, wenn dieser Chat bereits Befehle und Antworten unterstützt. - Native Discord-Genehmigungs-Buttons routen nach Art der Genehmigungs-ID:
plugin:-IDs gehen direkt zu Plugin-Genehmigungen, alles andere geht zu Exec-Genehmigungen. - Native Telegram-Genehmigungs-Buttons folgen demselben begrenzten Exec-zu-Plugin-Fallback wie
/approve. - Wenn das native
targetdie Zustellung im Ursprungs-Chat aktiviert, enthalten Genehmigungs-Prompts den Befehlstext. - Ausstehende Exec-Genehmigungen laufen standardmäßig nach 30 Minuten ab.
- Wenn keine Bediener-UI und kein konfigurierter Genehmigungs-Client die Anfrage annehmen kann, fällt der Prompt auf
askFallbackzurück.
Sensible eigentümerexklusive Gruppenbefehle wie /diagnostics und /export-trajectory verwenden privates Eigentümer-Routing für Genehmigungs-Prompts und Endergebnisse. OpenClaw versucht zuerst eine private Route auf derselben Oberfläche, auf der der Eigentümer den Befehl ausgeführt hat. Wenn diese Oberfläche keine private Eigentümer-Route hat, fällt sie auf die erste verfügbare Eigentümer-Route aus commands.ownerAllowFrom zurück, sodass ein Discord-Gruppenbefehl die Genehmigung und das Ergebnis weiterhin an die Telegram-DM des Eigentümers senden kann, wenn Telegram als primäre private Schnittstelle konfiguriert ist. Der Gruppenchat erhält nur eine kurze Bestätigung.
Telegram verwendet standardmäßig Genehmiger-DMs (target: "dm"). Sie können zu channel oder both wechseln, wenn Genehmigungs-Prompts auch im ursprünglichen Telegram-Chat/-Thema erscheinen sollen. Für Telegram-Forumthemen bewahrt OpenClaw das Thema für den Genehmigungs-Prompt und die Nachverfolgung nach der Genehmigung.
Siehe:
macOS-IPC-Ablauf
OC_I18N_900004 Sicherheitshinweise:
- Unix-Socket-Modus
0600, Token inexec-approvals.jsongespeichert. - Same-UID-Peer-Prüfung.
- Challenge/Response (Nonce + HMAC-Token + Anfrage-Hash) + kurze TTL.
Verwandte Themen
- Exec-Genehmigungen — Kernrichtlinie und Genehmigungsablauf
- Exec-Tool
- Erweiterter Modus
- Skills — Skill-gestütztes Auto-Allow-Verhalten