How 2.0 protects you
- Loopback only. The connector binds
127.0.0.1and refuses non-loopback addresses. In 1.x it bound0.0.0.0, reachable by anyone on your network. - The extension never leaves loopback. 1.x scanned private network ranges and adopted whichever host answered with a known string — meaning anyone on shared Wi-Fi could receive your logs and screenshots. That scan is gone; the extension only ever contacts
127.0.0.1andlocalhost. - Authenticated. The HTTP API requires a bearer token generated per run and stored in a
0600file. The WebSocket acceptschrome-extension://,moz-extension://andsafari-web-extension://origins only — anyhttp(s)origin is rejected outright, because a browser setsOriginitself and a page therefore cannot forge one. TheHostheader is validated against DNS rebinding. - Nothing captured reaches a shell. Screenshot names are restricted to
[A-Za-z0-9._/-]and resolved inside a fixed directory. - Credentials are scrubbed before storage — see below.
- Headers are off by default, independently per direction, and storage values are withheld unless a tool explicitly asks for them.
- Cookie access is an optional permission you grant from the panel, not something the extension holds by default.
- Fewer permissions overall.
<all_urls>andtabsare no longer in the extension’s default set.
Redaction is layered, and best-effort
Credential scrubbing runs twice: in the browser before anything is truncated or transmitted, and again on the server before storage. The browser pass is the one that matters most — it means a recognised secret never crosses the socket at all. It covers credential-bearing headers, JWTs (including ones cut short by truncation), vendor session and client identifiers, cloud provider keys, and commonpassword/token JSON fields.
Over-redaction is treated as a bug too. A false positive silently destroys the debugging information this tool exists to provide, so patterns are confirmed rather than assumed where a cheap check exists — a JWT candidate, for instance, is verified by decoding its header, because plenty of harmless data is also base64-encoded JSON.
If you find a shape that leaks, or one that is being redacted when it should not be, both are worth reporting.
Seeing
[REDACTED] in your logs is this tool protecting you, not your app
misbehaving.Known vulnerabilities in 1.x
All three are fixed in 2.0.0.Remote code execution through the WebSocket endpoint (critical)
Remote code execution through the WebSocket endpoint (critical)
The connector bound
0.0.0.0, applied wildcard CORS, and performed no origin
check or authentication on its WebSocket upgrade. A path value taken from a
WebSocket message was interpolated into a shell command.Any web page the user visited — or anyone on the same network — could open the
socket, impersonate the extension, and execute arbitrary commands as the user.
Reported in issues #224, #232 and #233.Fixed by: binding loopback only and refusing non-loopback addresses;
requiring a browser-extension Origin on the WebSocket upgrade; requiring a
per-run bearer token on the HTTP API; validating the Host header; removing
the AppleScript path entirely; and constraining screenshot names to a safe
character set resolved inside a fixed directory.Network-wide interception of captured browser data (high)
Network-wide interception of captured browser data (high)
The extension probed
192.168.0.x, 192.168.1.x, 10.0.0.x and 10.0.1.x
across ports 3025–3035, and adopted the first host that returned a constant
string — persisting it to settings. That string is a public identifier in a
public repository, not a credential.Anyone on shared Wi-Fi could run a trivial HTTP server returning it and
silently receive the developer’s console output, full request and response
bodies, and screenshots, across restarts.Fixed by: removing the network scan entirely.Unauthenticated data exfiltration and control (high)
Unauthenticated data exfiltration and control (high)
With no authentication and wildcard CORS, any visited page could read the
console and network endpoints (including bodies and headers), force a
screenshot, write arbitrary bytes to arbitrary paths, overwrite global
settings, wipe captured data, and spawn headless Chrome instances.The settings endpoint also merged arbitrary keys from an unauthenticated
request body into server settings, which allowed both memory exhaustion and
injecting fabricated log entries that the developer’s AI agent would then read
and act on.Fixed by: token-authenticated API, origin and host validation, an explicit
settings allowlist with clamped ranges, and removal of caller-supplied
filesystem paths.