Exec-Freigaben
Exec-Freigaben sind die Companion-App- / Node-Host-Schranke, damit ein sandboxed Agent Befehle auf einem echten Host (gateway oder node) ausführen kann. Wie ein Sicherheits-Interlock: Befehle sind nur erlaubt, wenn Richtlinie + Allowlist + (optional) Benutzerfreigabe übereinstimmen. Exec-Freigaben sind zusätzlich zur Tool-Richtlinie und Elevated-Gating (außer elevated ist auf full, dann werden Freigaben übersprungen). Die effektive Richtlinie ist die strengere aus tools.exec.* und den Approval-Defaults; fehlt ein Approvals-Feld, wird der tools.exec-Wert genutzt. Ist die Companion-App-UI nicht verfügbar, wird jede Anfrage, die eine Abfrage erfordert, per Ask-Fallback (Standard: deny) entschieden.
Wo es gilt
Exec-Freigaben werden lokal auf dem Ausführungshost durchgesetzt:
- Gateway-Host →
openclaw-Prozess auf der Gateway-Maschine - Node-Host → Node-Runner (macOS-Companion-App oder Headless-Node-Host)
macOS-Aufteilung:
- Der Node-Host-Service leitet
system.runper lokalem IPC an die macOS-App weiter. - Die macOS-App erzwingt Freigaben und führt den Befehl im UI-Kontext aus.
Einstellungen und Speicher
Freigaben liegen in einer lokalen JSON-Datei auf dem Ausführungshost: ~/.clawdbot/exec-approvals.json. Beispiel-Schema:
{
"version": 1,
"socket": {
"path": "~/.clawdbot/exec-approvals.sock",
"token": "base64url-token"
},
"defaults": {
"security": "deny",
"ask": "on-miss",
"askFallback": "deny",
"autoAllowSkills": false
},
"agents": {
"main": {
"security": "allowlist",
"ask": "on-miss",
"askFallback": "deny",
"autoAllowSkills": true,
"allowlist": [\
{\
"id": "B0C8C0B3-2C2D-4F8A-9A3C-5A4B3C2D1E0F",\
"pattern": "~/Projects/**/bin/rg",\
"lastUsedAt": 1737150000000,\
"lastUsedCommand": "rg -n TODO",\
"lastResolvedPath": "/Users/user/Projects/.../bin/rg"\
}\
]
}
}
}Richtlinien-Stellschrauben
Security (exec.security)
- deny: alle Host-Exec-Anfragen blockieren.
- allowlist: nur allowlistete Befehle erlauben.
- full: alles erlauben (entspricht elevated).
Ask (exec.ask)
- off: nie abfragen.
- on-miss: nur abfragen, wenn die Allowlist nicht passt.
- always: bei jedem Befehl abfragen.
Ask-Fallback (askFallback)
Wenn eine Abfrage nötig ist, aber keine UI erreichbar ist, entscheidet der Fallback:
- deny: blockieren.
- allowlist: nur erlauben, wenn Allowlist passt.
- full: erlauben.
Allowlist (pro Agent)
Allowlists sind pro Agent. Bei mehreren Agenten in der macOS-App den zu bearbeitenden Agenten wählen. Muster sind case-insensitive Glob-Matches. Muster sollten auf Binary-Pfade aufgelöst werden (Nur-Basename-Einträge werden ignoriert). Legacy-agents.default-Einträge werden beim Laden nach agents.main migriert. Beispiele:
~/Projects/**/bin/bird~/.local/bin/*/opt/homebrew/bin/rg
Jeder Allowlist-Eintrag speichert:
- id stabile UUID für die UI-Identität (optional)
- last used Zeitstempel
- last used command
- last resolved path
Auto-Allow für Skill-CLIs
Wenn Auto-allow skill CLIs aktiviert ist, werden von bekannten Skills referenzierte ausführbare Dateien auf Nodes (macOS-Node oder Headless-Node-Host) als allowlistet behandelt. Dafür wird skills.bins über Gateway-RPC abgefragt. Deaktivieren für strenge manuelle Allowlists.
Safe Bins (nur stdin)
tools.exec.safeBins definiert eine kleine Liste nur-stdin-Binaries (z. B. jq), die im Allowlist-Modus ohne explizite Allowlist-Einträge laufen dürfen. Safe Bins lehnen optionale Datei-Args und pfadähnliche Tokens ab und arbeiten nur auf dem eingehenden Stream. Shell-Verkettung und -Umleitungen sind im Allowlist-Modus nicht automatisch erlaubt. Shell-Verkettung (&&, ||, ;) ist erlaubt, wenn jedes Top-Level-Segment die Allowlist erfüllt (inkl. Safe Bins oder Skill-Auto-Allow). Umleitungen bleiben im Allowlist-Modus ununterstützt. Standard Safe Bins: jq, grep, cut, sort, uniq, head, tail, tr, wc.
Bearbeitung in der Control UI
In der Control UI → Nodes → Exec approvals-Karte Defaults, pro-Agent-Überschreibungen und Allowlists bearbeiten. Einen Scope wählen (Defaults oder ein Agent), Richtlinie anpassen, Allowlist-Muster hinzufügen/entfernen, dann Save. Die UI zeigt last used-Metadaten pro Muster. Der Ziel-Selector wählt Gateway (lokale Freigaben) oder einen Node. Nodes müssen system.execApprovals.get/set anbieten (macOS-App oder Headless-Node-Host). Bietet ein Node noch keine Exec-Freigaben an, die lokale ~/.clawdbot/exec-approvals.json direkt bearbeiten. CLI: openclaw approvals unterstützt Gateway- oder Node-Bearbeitung (siehe Approvals CLI).
Freigabe-Ablauf
Wenn eine Abfrage nötig ist, sendet das Gateway exec.approval.requested an Operator-Clients. Control UI und macOS-App lösen es per exec.approval.resolve, dann leitet das Gateway die genehmigte Anfrage an den Node-Host weiter. Bei erforderlichen Freigaben gibt das Exec-Tool sofort mit einer Approval-ID zurück. Diese ID zur späteren Zuordnung von System-Events nutzen (Exec finished / Exec denied). Kommt vor Timeout keine Entscheidung, gilt die Anfrage als Approval-Timeout und wird als Ablehnungsgrund angezeigt. Der Bestätigungsdialog enthält:
- Befehl + Args
- cwd
- Agent-ID
- aufgelöster ausführbarer Pfad
- Host- + Richtlinien-Metadaten
Aktionen:
- Allow once → jetzt ausführen
- Always allow → zur Allowlist hinzufügen + ausführen
- Deny → blockieren
Weiterleitung von Exec-Freigaben in Chat-Kanäle
Exec-Freigabe-Abfragen kannst du in beliebige Chat-Kanäle (inkl. Plugin-Kanäle) weiterleiten und mit /approve freigeben. Dafür wird die normale ausgehende Zustellung genutzt. Config:
{
approvals: {
exec: {
enabled: true,
mode: "session", // "session" | "targets" | "both"
agentFilter: ["main"],
sessionFilter: ["discord"], // Substring oder Regex
targets: [\
{ channel: "slack", to: "U12345678" },\
{ channel: "telegram", to: "123456789" }\
]
}
}
}Im Chat antworten:
/approve <id> allow-once
/approve <id> allow-always
/approve <id> denymacOS-IPC-Ablauf
Gateway -> Node Service (WS)
| IPC (UDS + token + HMAC + TTL)
v
Mac App (UI + approvals + system.run)Sicherheitshinweise:
- Unix-Socket-Modus
0600, Token inexec-approvals.jsongespeichert. - Same-UID-Peer-Check.
- Challenge/Response (Nonce + HMAC-Token + Request-Hash) + kurzer TTL.
System-Events
Der Exec-Lebenszyklus erscheint als System-Nachrichten:
Exec running(nur wenn der Befehl den Running-Notice-Schwellwert überschreitet)Exec finishedExec denied
Diese werden in der Sitzung des Agenten gepostet, nachdem der Node das Event meldet. Gateway-Host-Exec-Freigaben senden dieselben Lebenszyklus-Events, wenn der Befehl endet (und optional bei Laufzeit über dem Schwellwert). Freigabe-pflichtige Execs nutzen die Approval-ID als runId in diesen Nachrichten zur einfachen Zuordnung.
Konsequenzen
- full ist mächtig; Allowlists bevorzugen, wenn möglich.
- ask hält dich im Loop und erlaubt trotzdem schnelle Freigaben.
- Pro-Agent-Allowlists verhindern, dass Freigaben eines Agenten in andere durchsickern.
- Freigaben gelten nur für Host-Exec-Anfragen von autorisierten Sendern. Unautorisierte Sender können
/execnicht ausführen. /exec security=fullist eine Sitzungs-Convenience für autorisierte Operatoren und überspringt Freigaben by Design. Für harten Block von Host-Exec: Approvals-Security aufdenysetzen oder dasexec-Tool per Tool-Richtlinie verweigern.
Verwandt: