Skip to content

TAB-1104: gate agent navigation + Tabstack URL tools through the action firewall#595

Merged
srbiv merged 2 commits into
mainfrom
stafford/tab-1104-goto-navigation-is-an-ungated-data-exfiltration-sink-ipi
Jul 17, 2026
Merged

TAB-1104: gate agent navigation + Tabstack URL tools through the action firewall#595
srbiv merged 2 commits into
mainfrom
stafford/tab-1104-goto-navigation-is-an-ungated-data-exfiltration-sink-ipi

Conversation

@srbiv

@srbiv srbiv commented Jul 17, 2026

Copy link
Copy Markdown
Collaborator

The action firewall (TAB-976) gates form fill/submit but not URL egress. goto and the Tabstack extract/generate tools each take a model-controlled URL and send it out, so an injected page can exfiltrate the caller 's task/data secrets to an attacker host — no form, no approval.

Change

  • Add assessNavigation(targetUrl, firewall): allow only a host the caller named (start host via withTrustedStartHost + trusted_hostnames), or when unsafe_mode is set. Non-http(s) targets (null host) are blocked (fail closed).
  • Gate goto and tabstack_extract_markdown / tabstack_extract_json / tabstack_generate_json with it. Blocks return a recoverable error and emit FIREWALL_BLOCKED_NON_INTERACTIVE (kind navigation).
  • Shared buildFirewallRemediations so every gated sink emits identical guidance.

Gating the destination host, not the URL contents, is deliberate: scanning the URL for the secret is a blocklist (encoding/param/method evade it). Denying the destination is independent of payload shape.

Scope / severity

Prod's remote browser currently confines navigation to the start domain (BrightData navigate_domains_limit), so cross-domain exfil is not exploitable end-to-end today — but that is a third-party config, not a control we own. This makes the boundary explicit and portable (local browsers, other zones, future config changes). Not a P1 bleed; a real hardening.

Tradeoff

Blocks the agent from following a link/search result to a host the caller did not name. Opt in via trusted_hostnames (exposed on /v1/automate, TAB-980) or unsafe_mode — same escape hatch as fill/submit.

Testing

  • assessNavigation unit tests (trusted/untrusted/unsafe/null-host/case).
  • goto tool: blocks untrusted (no navigation, emits event), allows trusted + unsafe.
  • Tabstack tools: block untrusted, allow trusted, unsafe bypass.
  • Full suite: core 924, cli 229, server 103, extension 273; all typechecks pass.

srbiv added 2 commits July 17, 2026 14:10
goto was the only action tool that skipped the firewall, so a prompt-injected page could exfiltrate caller task/data secrets by having the agent navigate to an attacker URL with the secret in the query string — no form, no approval. Add assessNavigation, which allows a goto only to a caller-named host (start host + trusted_hostnames) or under unsafe_mode, mirroring the fill/submit gates. Blocks return a recoverable error and emit a firewall event.
…AB-1104)

The Tabstack extract/generate tools fetch a model-supplied URL — an identical data-egress sink to goto — but bypassed the firewall. Apply the same destination allowlist (assessNavigation: caller start host + trusted_hostnames, unsafe_mode bypass) to all three tools, and extract the shared remediation builder so every gated sink emits identical guidance.
@srbiv
srbiv requested a review from a team July 17, 2026 18:58

@lmorchard lmorchard left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM and works for me, +1 assuming evals don't tank for some reason

@srbiv
srbiv merged commit 64e48d1 into main Jul 17, 2026
17 checks passed
@srbiv
srbiv deleted the stafford/tab-1104-goto-navigation-is-an-ungated-data-exfiltration-sink-ipi branch July 17, 2026 20:21
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants