Fail closed on exec approval timeout (#89938) · openclaw/openclaw@49737a5
drobison00
·
2026-06-11
·
via Recent Commits to openclaw:main
| Original file line number | Diff line number | Diff line change |
|---|
@@ -83,7 +83,7 @@ Precedence is intentional:
|
83 | 83 | ```bash |
84 | 84 | openclaw approvals set --file ./exec-approvals.json |
85 | 85 | openclaw approvals set --stdin <<'EOF' |
86 | | -{ version: 1, defaults: { security: "full", ask: "off" } } |
| 86 | +{ version: 1, defaults: { security: "full", ask: "off", askFallback: "full" } } |
87 | 87 | EOF |
88 | 88 | openclaw approvals set --node <id|name|ip> --file ./exec-approvals.json |
89 | 89 | openclaw approvals set --gateway --file ./exec-approvals.json |
@@ -137,7 +137,8 @@ Why `tools.exec.host=gateway` in this example:
|
137 | 137 | - YOLO is about approvals, not routing. |
138 | 138 | - If you want host exec even when a sandbox is configured, make the host choice explicit with `gateway` or `/exec host=gateway`. |
139 | 139 | |
140 | | -This matches the current host-default YOLO behavior. Tighten it if you want approvals. |
| 140 | +Omitted `askFallback` defaults to `deny`. Set `askFallback: "full"` |
| 141 | +explicitly when upgrading a no-UI host that should keep never-prompt behavior. |
141 | 142 | |
142 | 143 | Local shortcut: |
143 | 144 | |
|
| Original file line number | Diff line number | Diff line change |
|---|
@@ -159,7 +159,8 @@ when set at the narrower session or agent scope.
|
159 | 159 | ### `askFallback` |
160 | 160 | |
161 | 161 | <ParamField path="askFallback" type='"deny" | "allowlist" | "full"'> |
162 | | - Resolution when a prompt is required but no UI is reachable. |
| 162 | + Resolution when a prompt is required but no UI is reachable. If this |
| 163 | + field is omitted, OpenClaw defaults to `deny`. |
163 | 164 | |
164 | 165 | - `deny` - block. |
165 | 166 | - `allowlist` - allow only if allowlist matches. |
@@ -211,7 +212,9 @@ If you want host exec to run without approval prompts, you must open
|
211 | 212 | (`tools.exec.*`) **and** host-local approvals policy in |
212 | 213 | `~/.openclaw/exec-approvals.json`. |
213 | 214 | |
214 | | -YOLO is the default host behavior unless you tighten it explicitly: |
| 215 | +OpenClaw defaults omitted `askFallback` to `deny`. Set host |
| 216 | +`askFallback` to `full` explicitly when a no-UI approval prompt should |
| 217 | +fall back to allow. |
215 | 218 | |
216 | 219 | | Layer | YOLO setting | |
217 | 220 | | --------------------- | -------------------------- | |
@@ -278,7 +281,8 @@ openclaw exec-policy preset yolo
|
278 | 281 | That local shortcut updates both: |
279 | 282 | |
280 | 283 | - Local `tools.exec.host/security/ask`. |
281 | | -- Local `~/.openclaw/exec-approvals.json` defaults. |
| 284 | +- Local `~/.openclaw/exec-approvals.json` defaults, including |
| 285 | +`askFallback: "full"`. |
282 | 286 | |
283 | 287 | It is intentionally local-only. To change gateway-host or node-host |
284 | 288 | approvals remotely, use `openclaw approvals set --gateway` or |
|
| Original file line number | Diff line number | Diff line change |
|---|
@@ -16,6 +16,7 @@ import {
|
16 | 16 | createExecApprovalPendingState, |
17 | 17 | enforceStrictInlineEvalApprovalBoundary, |
18 | 18 | MAX_EXEC_APPROVAL_FOLLOWUP_FAILURE_LOG_KEYS as maxExecApprovalFollowupFailureLogKeys, |
| 19 | +resolveBaseExecApprovalDecision, |
19 | 20 | resolveExecApprovalUnavailableState, |
20 | 21 | resolveExecHostApprovalContext, |
21 | 22 | sendExecApprovalFollowupResult, |
@@ -443,6 +444,19 @@ describe("resolveExecHostApprovalContext", () => {
|
443 | 444 | }); |
444 | 445 | |
445 | 446 | describe("enforceStrictInlineEvalApprovalBoundary", () => { |
| 447 | +it("denies unanswered approvals when ask fallback is fail-closed", () => { |
| 448 | +expect( |
| 449 | +resolveBaseExecApprovalDecision({ |
| 450 | +decision: null, |
| 451 | +askFallback: "deny", |
| 452 | +}), |
| 453 | +).toEqual({ |
| 454 | +approvedByAsk: false, |
| 455 | +deniedReason: "approval-timeout", |
| 456 | +timedOut: true, |
| 457 | +}); |
| 458 | +}); |
| 459 | + |
446 | 460 | it("denies timeout-based fallback when strict inline-eval approval is required", () => { |
447 | 461 | expect( |
448 | 462 | enforceStrictInlineEvalApprovalBoundary({ |
|
| Original file line number | Diff line number | Diff line change |
|---|
@@ -500,8 +500,8 @@ describe("exec approvals CLI", () => {
|
500 | 500 | requireRecord(toolsScope.askFallback, "tools.exec askFallback"), |
501 | 501 | "tools.exec askFallback", |
502 | 502 | { |
503 | | -effective: "full", |
504 | | -source: "OpenClaw default (full)", |
| 503 | +effective: "deny", |
| 504 | +source: "OpenClaw default (deny)", |
505 | 505 | }, |
506 | 506 | ); |
507 | 507 | |
@@ -517,8 +517,8 @@ describe("exec approvals CLI", () => {
|
517 | 517 | effective: "always", |
518 | 518 | }); |
519 | 519 | expectFields(requireRecord(agentScope.askFallback, "agent askFallback"), "agent askFallback", { |
520 | | -effective: "allowlist", |
521 | | -source: "OpenClaw default (full)", |
| 520 | +effective: "deny", |
| 521 | +source: "OpenClaw default (deny)", |
522 | 522 | }); |
523 | 523 | }); |
524 | 524 | |
|
| Original file line number | Diff line number | Diff line change |
|---|
@@ -694,8 +694,8 @@ describe("exec approvals policy helpers", () => {
|
694 | 694 | }); |
695 | 695 | |
696 | 696 | expect(summary.askFallback).toEqual({ |
697 | | -effective: "full", |
698 | | -source: "OpenClaw default (full)", |
| 697 | +effective: "deny", |
| 698 | +source: "OpenClaw default (deny)", |
699 | 699 | }); |
700 | 700 | }); |
701 | 701 | |
|
| Original file line number | Diff line number | Diff line change |
|---|
@@ -282,7 +282,7 @@ export const DEFAULT_EXEC_APPROVAL_TIMEOUT_MS = 1_800_000;
|
282 | 282 | |
283 | 283 | const DEFAULT_SECURITY: ExecSecurity = "full"; |
284 | 284 | const DEFAULT_ASK: ExecAsk = "off"; |
285 | | -export const DEFAULT_EXEC_APPROVAL_ASK_FALLBACK: ExecSecurity = "full"; |
| 285 | +export const DEFAULT_EXEC_APPROVAL_ASK_FALLBACK: ExecSecurity = "deny"; |
286 | 286 | const DEFAULT_AUTO_ALLOW_SKILLS = false; |
287 | 287 | const DEFAULT_SOCKET = "~/.openclaw/exec-approvals.sock"; |
288 | 288 | const DEFAULT_FILE = "~/.openclaw/exec-approvals.json"; |
|
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。