Back to skill

Security audit

Remote Browser Service

Security checks for vulnerabilities and agentic risk

Overview

This remote-browser skill is mostly coherent, but it gives agents broad access to persisted authenticated browser profiles and raw browser storage, so users should review it carefully before installing.

Install only if you trust the remote-browser provider with page contents, screenshots, user actions, and potentially reusable logged-in browser sessions. Prefer header-based authentication, avoid putting tokens in URLs, use ephemeral sessions for sensitive work, and delete stored sessions when finished.

Vulnerability Patterns
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Agent Memory PoisoningWrites attacker-controlled rules into memory that affect later sessions
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
Findings (3)

T09 · Insecure Skill Coding Practices

Error
Location
SKILL.md:48
Finding

API Authentication Token Permitted in URL Query String

Content
View full analysis
` or `X-API-Key`, or `?access_token=` ``` ### Technical Analysis The Skill explicitly permits an API credential to be supplied through the `access_token` URL query parameter. Query strings are routinely retained by infrastructure outside the application's direct control, including: - Browser history and bookmarked URLs - Reverse-proxy and web-server access logs - Monitoring, tracing, and analytics systems - Network security appliances - Screenshots, copied links, and support diagnostics - Referrer data in configurations without a sufficiently restrictive referrer policy The service already supports `Authorization: Bearer` and `X-API-Key` headers. Consequently, query-string authentication is unnecessary and creates additional exposure without being required for the declared browser-automation functionality. Because the token identifies the user and authorizes access to remote browser sessions, disclosure may expose more than a single request. Depending on server-side authorization and token scope, it may enable access to live sessions, stored sessions, browser screenshots, extracted page content, and persisted browser state. ### Attack Path 1. A user or agent follows the documented authentication option and constructs a URL containing `?access_token=`. 2. The full URL is recorded in browser history, proxy logs, tracing data, or another telemetry system. 3. An attacker gains read access to one of those records or receives a copied URL. 4. The attacker extracts the token from the query string. 5. The attacker presents the token to the remote browser service. 6. If the token remains valid, the attacker accesses API resources available to the affected user, including potentially sensitive browse ...[truncated 604 chars]
Remediation
View remediation
` authentication method. 2. Require credentials to be sent through `Authorization: Bearer` or a dedicated authentication header. 3. Reject query-string credentials at the server rather than merely discouraging them in documentation. 4. Configure servers, proxies, observability systems, and application logs to redact authentication headers and known credential parameters. 5. Rotate any token that has previously been transmitted in a URL. 6. Use short-lived, narrowly scoped tokens and support immediate revocation. 7. Apply strict referrer controls as defense in depth, while recognizing that this does not make URL credentials safe. ]]>

T05 · Unauthorized Access and Privilege Escalation

Error
Location
SKILL.md:441
Finding

Entire Authenticated Browser Profile Persisted to External Storage

Content
View full analysis
Remediation
View remediation

T05 · Unauthorized Access and Privilege Escalation

Error
Location
SKILL.md:441
Finding

Direct Browser Storage APIs Enable Authentication Artifact Extraction and Injection

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (7)

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
80% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · SKILL.md (reported line 115)May include surrounding context.

md
the idle clock restarts.
- **Activity that restarts the 5-min clock**: opening a CDP/VNC connection, `GET .../status`,
  `GET .../{session_id}`, and `POST .../ping`.
- **To close immediately** instead of waiting out the idle timeout: `DELETE /api/sessions/{session_id}`
  (or `terminate_session`). On teardown the profile is saved.

Maximum 1 concurrent session per user. If creation returns 429 or WebSocket closes with a limit error: **wait a bit** (previous session may still be shutting down) **and/or close the previous session** via `DELETE /api/sessions/{session_id}` before retrying.

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
80% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · SKILL.md (reported line 118)May include surrounding context.

md
the idle clock restarts.
- **Activity that restarts the 5-min clock**: opening a CDP/VNC connection, `GET .../status`,
  `GET .../{session_id}`, and `POST .../ping`.
- **To close immediately** instead of waiting out the idle timeout: `DELETE /api/sessions/{session_id}`
  (or `terminate_session`). On teardown the profile is saved.

Maximum 1 concurrent session per user. If creation returns 429 or WebSocket closes with a limit error: **wait a bit** (previous session may still be shutting down) **and/or close the previous session** via `DELETE /api/sessions/{session_id}` before retrying.

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
80% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · SKILL.md (reported line 436)May include surrounding context.

md
the idle clock restarts.
- **Activity that restarts the 5-min clock**: opening a CDP/VNC connection, `GET .../status`,
  `GET .../{session_id}`, and `POST .../ping`.
- **To close immediately** instead of waiting out the idle timeout: `DELETE /api/sessions/{session_id}`
  (or `terminate_session`). On teardown the profile is saved.

Maximum 1 concurrent session per user. If creation returns 429 or WebSocket closes with a limit error: **wait a bit** (previous session may still be shutting down) **and/or close the previous session** via `DELETE /api/sessions/{session_id}` before retrying.

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
90% confidence
Finding

The skill documents read/write/delete access to persisted browser-state blobs such as cookies, local storage, session storage, IndexedDB, and cache storage. This is dangerous because these interfaces expose highly sensitive authentication artifacts and allow modification or replay of stored browser state, which can enable account takeover, session hijacking, privacy violations, or destructive tampering if used by an agent beyond the user's intended scope.

Content

Scanner excerpt · SKILL.md (reported line 441)May include surrounding context.

md
- **Readability vs raw** — `/text` (default) strips nav/footer/ads; `?mode=raw` returns full `innerText`.
- **Interactive filter** — `?filter=interactive` on `/json` reduces nodes by ~75% for action tasks.
- **VNC vs DOM** — Use `/action` for selectors/refs in the page DOM. Use `/vnc/action` and `/vnc/screenshot` for pixel-level automation and UI outside the DOM.
- **Stored sessions** — Sessions persist to S3 and are restored on reopen. The **whole browser profile** is captured (cookies, localStorage, sessionStorage, IndexedDB, **Service Workers**, Cache Storage, metadata) and restored as one consistent unit, so apps that keep their login in IndexedDB/Service Workers (e.g. Telegram Web) come back **logged in**, not just at the login page. List with `GET /api/stored-sessions`, then reopen by creating a session with the same `session_id` (HTTP/WebSocket). If `url` is not provided on connect, the saved page URL is used for redirect. Use `GET/PUT /api/stored-sessions/{session_id}` to read or update metadata: `url` (redirect on reopen), `description` (free-text human label, max 500 chars, returned in the list endpoint's `descriptions` map), `width`/`height` (default resolution), `encrypt_with_api_key`. To move or edit individual persisted blobs without a live browser, use `GET/PUT /api/stored-sessions/{session_id}/cookies` (JSON array of cookie objects), `GET/PUT .../local-storage`, `GET/PUT .../session-storage` (both JSON objects with string keys and string values), `GET/PUT .../indexeddb` (IndexedDB snapshot object), and `GET/PUT .../cache-storage` (Cache Storage snapshot object). `DELETE /api/stored-sessions/{session_id}` wipes all persisted state for a session.

## Limitations & fallbacks

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · SKILL.md (reported line 93)May include surrounding context.

Create session (HTTP)

bash
curl -X POST "https://rb.all-completed.com/api/sessions" \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{}'

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill explicitly states that the full browser profile is persisted and restorable, including cookies, localStorage, sessionStorage, IndexedDB, Service Workers, and Cache Storage, which can preserve authenticated sessions and other highly sensitive user data. This is dangerous because an agent using the skill can enable long-lived retention of credentials and session artifacts in backend storage without a prominent upfront consent/retention warning, increasing the risk of unauthorized account access or privacy compromise if sessions are resumed, copied, or mishandled.

Content

No source excerpt is available for this finding.

Autonomous Decision Making

Medium
Category
Excessive Agency
Confidence
80% confidence
Finding

Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.

Content

Scanner excerpt · SKILL.md (reported line 452)May include surrounding context.

md
- **Prefer `fill` over `type` for form fields** — `type` does `focus()` + `Input.insertText`; some controlled/React inputs don't register it. `fill` does select-all + insertText with real input events and is the reliable choice for text fields. Use `type` only for appending to plain inputs.
- **To submit a form, use `submit` (not `press` Enter)** — a synthetic `press` Enter does not perform the browser's default submit. Use `{"kind":"submit","selector":"<form or a field in it>"}`, or click the submit button by selector (selector `click` does a DOM `element.click()`).
- **Never type secrets yourself — use `request-fill` ("Keeper")** — for passwords, login codes, 2FA, or any value you must not see, call `POST /api/sessions/{id}/request-fill` instead of `fill`/`type`. **This is THIS service's own built-in secure credential fill — "Keeper" is the user's companion app for it. It is NOT OpenClaw `secrets`/`SecretRefs` (config-backed values); do not conclude "there's no keeper" because OpenClaw secrets has no live prompt — this endpoint IS the live prompt.** The user supplies the value out-of-band in their Keeper app (which shows your `message` + a screenshot of the field area) and the **service** types it into the field; the value is never returned to you or logged. It's **async**: you get `{request_id, status:"pending"}`, then poll `GET /api/sessions/fill-status/{request_id}` (tool `get_fill_status`) until `filled` / `cancelled` / `timeout` / `error`.
  - **Default to this for any login.** Don't ask the user to paste a password into chat. Order of preference: (1) `request-fill`; (2) if it returns **`status:"no_keeper"`** (no Keeper app connected), have the user sign in themselves via the **live VNC view** (you never see the password) — the session then persists logged-in; (3) only as a last resort, with the user's explicit consent, accept a value they provide.
  - **One field:** `{"selector":"input[name=password]","label":"Password","field":"password","message":"Logging 
...[truncated 25 chars]

Static analysis

No suspicious patterns detected.