Skip to content

Native Gateway: browser status/profiles blocked by listener ownership verification #1701

Open

Description

@grrgp228-bot

Native Gateway: browser status/profiles blocked by listener ownership verification

Environment

  • Windows Companion: v2026.9.8-1, matching the latest official GitHub release checked today.
  • Gateway CLI: v2026.9.9.
  • Local Native Gateway using the packaged runtime.
  • The paired Windows Node is connected and advertises browser capability and browser.proxy.

Reproduction and observed result

The main agent used the official browser tool to request status and profiles on the connected Windows Node. Both requests failed with:

Browser control authentication was blocked because the local listener owner could not be verified.

No browser launch or Chrome attachment occurred. The intended Gemini test was never sent. This report contains no credentials, personal paths, account identifiers, or raw diagnostic logs.

Investigation

The error is produced by BrowserProxyCapability before sending authentication to the local browser control service.

In the installed release's browserControlAuthorization callback, I found checks for an SSH-owned listener and an application-managed local WSL Gateway. I did not find a Native Gateway runtime ownership branch in that callback. The active configuration has a Native package/runtime contract, no SSH configuration, and no setup-managed WSL name.

This suggests a mismatch between the Native Gateway configuration and the ownership-validation path. It is a hypothesis, not a confirmed root cause: I have not determined which internal validation condition returns false.

Expected behavior and request

Please confirm whether browser.proxy ownership validation is supported for this Native Gateway configuration in the current release, and whether there is a supported fix or configuration procedure.

The ownership check has not been disabled, and no authentication data or browser profiles have been copied. I am looking for a supported solution that preserves the security checks.

References

Activity

  1. added
    P1Urgent regression or broken agent/channel workflow affecting real users now.
    clawsweeper:needs-security-reviewClawSweeper marked this issue as needing security-sensitive review.
    clawsweeper:no-new-fix-prClawSweeper does not recommend queueing a new automated fix PR for this issue.
    clawsweeper:source-reproClawSweeper found a high-confidence source-level issue reproduction.
    impact:securityThis issue is about security boundaries, credentials, authz, sandboxing, or sensitive data.
    impact:ux-frictionUser-facing flow adds avoidable confusion or support burden without fully blocking progress.
    issue-rating: 🦞 diamond lobsterVery strong issue quality with high-confidence source-level or clear reproduction.
    on Oct 11, 2026
  2. clawsweeper commented on Oct 11, 2026

    @clawsweeper

    Codex review: this still needs some work.

    Summary
    Keep open: both current main and the reported release reject Native Gateway browser authorization before HTTP, because the callback supports SSH and managed WSL ownership but has no native path.

    Reproducibility: yes. at source level: a native package record without SSH necessarily returns false from browser authorization, producing the exact reported error before HTTP; no live Windows reproduction, builds or tests were run during this read-only review.

    Maintainer decision needed

    • Question: Can the isolated Native Gateway contract provide fresh ownership proof for the browser-control port, and which runtime service should expose that proof to browser authorization?
    • Recommendation: Add verified secondary-endpoint authorization: Confirm package attestation covers the actual browser listener, expose verification through the native runtime owner, and test successful status/profiles plus foreign and replaced listener rejection.
    • Why: The missing native branch is source-proven, but existing runtime inspection proves the Gateway port and does not establish browser-port authorization.

    Next step
    Confirm native browser-port attestation, then establish a failing status/profiles regression and repair authorization without weakening listener checks.

    Security
    Needs attention: The current path protects credentials; repairing native support requires proof of the actual browser listener's ownership.

    Review details

    Best possible solution:

    Authorize the actual native browser listener through a focused ownership service and provide a visible recovery action when verification is unavailable.

    Do we have a high-confidence way to reproduce the issue?

    Yes at source level: a native package record without SSH necessarily returns false from browser authorization, producing the exact reported error before HTTP; no live Windows reproduction, builds or tests were run during this read-only review.

    Is this the best way to solve the issue?

    A native-specific ownership path is warranted, but it must verify the browser listener itself rather than reuse Gateway-port proof or remove the authorization check.

    AGENTS.md: found and applied where relevant.

    Remaining risk / open question:

    • The installed package's ability to attest ownership of the browser-control listener remains unverified.
    • Accepting loopback, package identity or Gateway-port ownership alone could disclose the shared token to an unrelated browser-port listener.

    Codex review notes: model internal, reasoning medium; reviewed against 16299381a4df.

    Label changes

    Label changes:

    • add P1: The official release and current main block browser tool calls for a connected Native Gateway node.
    • add impact:security: The repair changes the listener-ownership boundary protecting the saved shared Gateway token.
    • add impact:ux-friction: An advertised browser capability fails with an ownership error and no established supported native recovery procedure.
    • add issue-rating: 🦞 diamond lobster: Current issue advisory state selects this label.
    • add clawsweeper:source-repro: Current issue advisory state selects this label.
    • add clawsweeper:no-new-fix-pr: Current issue advisory state selects this label.
    • add clawsweeper:needs-security-review: Current issue advisory state selects this label.

    Label justifications:

    • P1: The official release and current main block browser tool calls for a connected Native Gateway node.
    • impact:security: The repair changes the listener-ownership boundary protecting the saved shared Gateway token.
    • impact:ux-friction: An advertised browser capability fails with an ownership error and no established supported native recovery procedure.
    Evidence reviewed

    Security concerns:

    • [high] Preserve browser-port credential authorization — src/OpenClaw.Tray.WinUI/App.xaml.cs:2409
      The native runtime's existing inspection is tied to the Gateway port. Allowing browser authentication based only on successful pairing or Gateway ownership would leave the separate browser listener unverified.
      Confidence: 0.98

    What I checked:

    • Current default branch verified: GitHub identifies main as the default branch, and its SHA matches the clean review checkout. (16299381a4df)
    • Native browser authorization is absent: After the SSH branch, the browser authorization callback requires ResolveManagedDistroName to return a value; otherwise it returns false without inspecting native runtime ownership. (src/OpenClaw.Tray.WinUI/App.xaml.cs:2409, 16299381a4df)
    • Native records deliberately cannot qualify as WSL: ResolveManagedDistroName returns null whenever NativePackageFamilyName is present; NativeGatewayRecordTests independently protects this separation, including legacy-looking display names. (src/OpenClaw.Connection/GatewayRecord.cs:195, 16299381a4df)
    • Exact error precedes the HTTP request: BrowserProxyCapability returns the reported listener-owner error when its authorization callback rejects a token-bearing request, before SendAsync. (src/OpenClaw.Shared/Capabilities/BrowserProxyCapability.cs:80, 16299381a4df)
    • Existing credential protection must survive: BrowserProxy_UnverifiedControlListener_DoesNotSendBearerToken asserts failure and no HTTP request when listener authorization fails; this test was read, not run. (tests/OpenClaw.Shared.Tests/CapabilityTests.cs:963, 16299381a4df)
    • Gateway-port proof is insufficient for the browser port: IsolatedGatewayRuntime.InspectAsync requires package status.Port to match the inspected record's endpoint; listener verification also requires matching package-attested port, PID and process sequence. Substituting the browser port into the record is not an established authorization path. (src/OpenClaw.Connection/NativeGateway/IsolatedGatewayRuntime.cs:230, 16299381a4df)
    How this review workflow works
    • ClawSweeper keeps one durable marker-backed review comment per issue or PR.
    • Re-runs edit this comment so the latest verdict, findings, and automation markers stay together instead of adding duplicate bot comments.
    • A fresh review can be triggered by eligible @clawsweeper re-review comments, exact-item GitHub events, scheduled/background review runs, or manual workflow dispatch.
    • PR/issue authors and users with repository write access can comment @clawsweeper re-review or @clawsweeper re-run on an open PR or issue to request a fresh review only.
    • Maintainers can also comment @clawsweeper review to request a fresh review only.
    • Fresh-review commands do not start repair, autofix, rebase, CI repair, or automerge.
    • Maintainer-only repair and merge flows require explicit commands such as @clawsweeper autofix, @clawsweeper automerge, @clawsweeper fix ci, or @clawsweeper address review.
    • Maintainers can comment @clawsweeper explain to ask for more context, or @clawsweeper stop to stop active automation.

    Reviewed October 11, 2026, 9:58 AM ET / 13:58 UTC.

  3. github-actions commented on Oct 26, 2026

    @github-actions
    Contributor

    This issue has been automatically marked as stale due to inactivity.
    Please add updated OpenClaw Windows details or it will be closed.

  4. grrgp228-bot commented on Oct 27, 2026

    @grrgp228-bot
    Author

    Status update (2026-10-28): I have not re-tested this on the current Windows installation, so this is a source/release review, not a fresh runtime reproduction.

    GitHub still lists v2026.9.8-1 as the latest non-prerelease release. I also checked v2026.10.5-alpha.4 and main at 48cb8a1.

    In the browserControlAuthorization callback, the alpha still rejects a non-SSH Native Gateway record because ResolveManagedDistroName returns null. Current main calls FixtureLoopbackListenerOwner in that case, but that helper explicitly fails closed outside fixture mode. This does not appear to provide production Native Gateway browser-listener authorization.

    Related merged PR #1628 addresses process-proxy handling for browser.proxy; it does not establish ownership attestation for the Native Gateway browser-control listener.

    Could a maintainer please confirm:

    1. Is there a fix or supported Native Gateway browser authorization path elsewhere? If so, which PR/commit and released version contains it?
    2. Which runtime service should attest ownership of the actual browser-control listener, separately from the Gateway port?
    3. What supported, credential-safe procedure should be used to re-test status/profiles, including rejection of foreign or replaced listeners?

    Please keep this issue open pending clarification or link the tracked replacement/fix. No authentication checks have been disabled as part of this review, and this update contains no credentials or raw diagnostic logs.

  5. roboclaw-bot commented on Nov 10, 2026

    @roboclaw-bot
    Contributor

    Consolidating duplicate report #1975 here, without treating the underlying bug as fixed. The newer report confirms that browser status and doctor still fail on Companion and CLI 2026.11.1: #1975 (comment). Both reports use a non-SSH Native Gateway and hit browser-listener ownership verification before authentication is sent. This issue remains the canonical tracking item for a supported native browser-port ownership contract and status/profiles proof. Preserve rejection of foreign or replaced listeners; do not disable the check.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    P1Urgent regression or broken agent/channel workflow affecting real users now.clawsweeper:needs-security-reviewClawSweeper marked this issue as needing security-sensitive review.clawsweeper:no-new-fix-prClawSweeper does not recommend queueing a new automated fix PR for this issue.clawsweeper:source-reproClawSweeper found a high-confidence source-level issue reproduction.impact:securityThis issue is about security boundaries, credentials, authz, sandboxing, or sensitive data.impact:ux-frictionUser-facing flow adds avoidable confusion or support burden without fully blocking progress.issue-rating: 🦞 diamond lobsterVery strong issue quality with high-confidence source-level or clear reproduction.

    Type

    No type

    Fields

    Priority

    None yet

    Projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions