Repository navigation
fix(vault): send credentials only to owner-trusted browsers - #70
Merged
Merged
Conversation
4 tasks done
kerdofficial
force-pushed
the
fix/vault-trusted-browsers
branch
from
October 22, 2026 19:53
3003ab1 to
1563ce4
Compare
Merged
4 tasks done
kerdofficial
force-pushed
the
fix/vault-trusted-browsers
branch
from
October 23, 2026 02:15
45c13e2 to
4e5cdd8
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What changed
Browser fill and capture now connect only to browsers the owner trusts. Owner vault settings gain
cdp_endpoints: trusted browser origins such ashttp://127.0.0.1:9222. A local request may use an endpoint that matches one of them, or an HTTPS/WSS endpoint that meets the existingremote_cdp_hostsrules. Anything else is refused withmissing_permissionbefore Inbot connects, and that includes loopback endpoints that are not registered. Tunnel requests keep the remote rules and ignorecdp_endpoints.PUT /v0/owner/vault/settingsnow updates only the keys you send.Credential use requests now include
browser: { endpoint, selector, target_id? }. The endpoint is the origin of the agent's CDP endpoint, with no path, query or credentials, so the owner approves a concrete sink. The approval fingerprint still binds the full endpoint, so swapping it after approval still returnsidempotency_conflict.Capture is now gated by
use_policylike fill. It uses kindcapture, needs an idempotency key on approval grants (REST, MCPcapture_credentialand CLI) and runs under the same lock as fill. Origin and CDP protocol errors no longer echo text supplied by the peer.Migration 20 adds
cdp_endpointsand rebuildscredential_use_requestsso that it allowscaptureand storesbrowser. Existing rows are kept.Why
Before this change, a local request could name any CDP endpoint. The origin check trusted that endpoint's own frame tree and the secret went out through
Input.insertText, so the agent chose where the password went. The approval also never showed the endpoint. Capture skipped approval and ran outside the lock.This is a partial mitigation, not browser authentication: Inbot still cannot authenticate a CDP peer. If a registered local browser stops, a process that binds its port can stand in for it. The docs now say so plainly. An Inbot-owned browser over a CDP pipe would close that gap and is left for a follow-up.
Upgrading changes behavior: until the owner registers a browser under Settings > Trusted browsers or with
inbot vault settings set --cdp-endpoints ..., local fill and capture fail with an error that explains how to register one.UI changes
Approvals now show the browser and field selector:
Settings has a Trusted browsers list above Remote browser hosts:
Checklist
pnpm checkpasses locallyProof: I ran format, lint, typecheck and vitest (1034 passed). A regression test fails when the old local bypass is restored. On an isolated home, an unregistered loopback listener received no connection for fill or capture, and approval requests showed the sink without the query token. Only synthetic credentials were used.