diff --git a/CHANGELOG.md b/CHANGELOG.md index f4b1bd1a405..8a4c7ab1212 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ Docs: https://docs.openclaw.ai - Doctor/plugins: cache external `preferOver` catalog lookups within each plugin auto-enable pass so large `agents.list` configs no longer peg CPU and repeatedly reread plugin catalogs during doctor/plugins resolution. (#66246) Thanks @yfge. - Agents/local models: clarify low-context preflight hints for self-hosted models, point config-backed caps at the relevant OpenClaw setting, and stop suggesting larger models when `agents.defaults.contextTokens` is the real limit. (#66236) Thanks @ImLukeF. - Browser/SSRF: restore hostname navigation under the default browser SSRF policy while keeping explicit strict mode reachable from config, and keep managed loopback CDP `/json/new` fallback requests on the local CDP control policy so browser follow-up fixes stop regressing normal navigation or self-blocking local CDP control. (#66386) Thanks @obviyus. +- Browser/SSRF: preserve explicit strict browser navigation mode for legacy `browser.ssrfPolicy.allowPrivateNetwork: false` configs by normalizing the legacy alias to the canonical strict marker instead of silently widening those installs to the default non-strict hostname-navigation path. ## 2026.4.14-beta.1 diff --git a/extensions/browser/src/browser/config.test.ts b/extensions/browser/src/browser/config.test.ts index 30f1e266ce0..d74f5bc8b24 100644 --- a/extensions/browser/src/browser/config.test.ts +++ b/extensions/browser/src/browser/config.test.ts @@ -321,6 +321,15 @@ describe("browser config", () => { expect(resolved.ssrfPolicy).toEqual({ dangerouslyAllowPrivateNetwork: false }); }); + it("preserves legacy explicit strict mode from allowPrivateNetwork=false", () => { + const resolved = resolveBrowserConfig({ + ssrfPolicy: { + allowPrivateNetwork: false, + }, + } as unknown as BrowserConfig); + expect(resolved.ssrfPolicy).toEqual({ dangerouslyAllowPrivateNetwork: false }); + }); + it("keeps allowlist-only browser SSRF policy strict by default", () => { const resolved = resolveBrowserConfig({ ssrfPolicy: { diff --git a/extensions/browser/src/browser/config.ts b/extensions/browser/src/browser/config.ts index 87f6a0a517a..503146dcf4a 100644 --- a/extensions/browser/src/browser/config.ts +++ b/extensions/browser/src/browser/config.ts @@ -149,7 +149,9 @@ function resolveBrowserSsrFPolicy(cfg: BrowserConfig | undefined): SsrFPolicy | } return { - ...(resolvedAllowPrivateNetwork || dangerouslyAllowPrivateNetwork === false + ...(resolvedAllowPrivateNetwork || + dangerouslyAllowPrivateNetwork === false || + allowPrivateNetwork === false ? { dangerouslyAllowPrivateNetwork: resolvedAllowPrivateNetwork } : {}), ...(allowedHostnames ? { allowedHostnames } : {}),