T03 · Remote Payload Retrieval and Execution
- Location
page-agent-bridge.mjs:25- Finding
Unpinned Third-Party Script Is Downloaded and Executed in Every Browser Session
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This scraping skill is not proven malicious, but it exposes broad browser-control powers and unsafe credential handling that users should review before installing.
Install only if you are comfortable running a local browser-control server and reviewing or hardening it first. Do not provide passwords, tokens, or one-time codes through chat; log in manually in a browser instead. Prefer pinning or vendoring the Page-Agent script, binding the server to localhost with authentication, removing executeJavascript unless explicitly needed, and scraping only data you are authorized to collect.
page-agent-bridge.mjs:25Unpinned Third-Party Script Is Downloaded and Executed in Every Browser Session
page-agent-bridge.mjs:226Unauthenticated Network API Exposes Browser Control and Arbitrary Page-Context JavaScript Execution
page-agent-bridge.mjs:137Unrestricted Browser Navigation Enables Server-Side Request Forgery and Internal-Network Access
SKILL.md:165Skill Instructions Solicit User Passwords Without a Safe Credential-Handling Boundary
The skill explicitly instructs the agent to ask users for login credentials to continue scraping authenticated pages, which expands the skill from webpage extraction into credential collection. This is dangerous because credentials may be exposed to the host model, logs, transcripts, or insecure bridge components, creating account-compromise risk well beyond the stated scraping purpose.
The bridge API exposes powerful session-control and arbitrary JavaScript execution primitives (executeJavascript, session deletion, and shutdown). In an agent-driven skill operating on arbitrary webpages, this broad capability can be abused to run unintended scripts in page context, manipulate authenticated sessions, or terminate service if access controls are weak or the agent is prompt-influenced into unsafe actions.
{ "action": "executeJavascript", "params": { "script": "return document.title;" } }
### `DELETE /sessions/:id`
Close session.
### `POST /shutdown`
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).
* GET /sessions/:id/state → get text-based DOM state
* POST /sessions/:id/act → execute one Page-Agent action
* POST /sessions/:id/navigate → navigate to new URL
* DELETE /sessions/:id → close browser session
* POST /shutdown → stop bridge server
*/
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).
* GET /sessions/:id/state → get text-based DOM state
* POST /sessions/:id/act → execute one Page-Agent action
* POST /sessions/:id/navigate → navigate to new URL
* DELETE /sessions/:id → close browser session
* POST /shutdown → stop bridge server
*/
The bridge exposes an 'executeJavascript' action that forwards arbitrary caller-supplied script into the live browser context. That greatly exceeds the stated scraping purpose and enables any client that can reach the HTTP service to run code in visited pages, manipulate authenticated sessions, extract DOM data, or trigger arbitrary browser-side actions.
The bridge exposes unauthenticated destructive control over sessions via DELETE, and nearby code also exposes unauthenticated server shutdown. Any local or network-reachable client can terminate active browser sessions or stop the bridge, causing denial of service and potentially disrupting automation that may hold authenticated web state.
return;
}
// DELETE /sessions/:id
const delMatch = url.pathname.match(/^\/sessions\/([a-zA-Z0-9-]+)$/);
if (delMatch && req.method === 'DELETE') {
const id = delMatch[1];
The manifest says no external LLM is needed, but the skill documentation explicitly shows 'Claude (Host Model)' receiving page state, understanding structure, deciding actions, and asking clarifying questions. That is a direct semantic mismatch about how the skill operates, not merely an implementation detail.
This is an internal documentation contradiction: the introductory description says no external LLM is required, while later documentation explicitly assigns core reasoning and control flow to Claude. The two statements cannot both be true as written.
The skill encourages extraction of potentially sensitive data such as employee details, emails, social engagement data, and directory information into CSV without any privacy, consent, or compliance warning. In a scraping context, omission of these safeguards materially increases the risk of collecting, storing, or redistributing personal data inappropriately.
The documentation presents credential collection as normal behavior without a strong warning about the sensitivity of passwords or safer alternatives. In context, this increases the chance that users will reveal secrets in plain text to an agent-driven workflow, enabling accidental leakage through chat history or logs.
The skill directly instructs the agent to request Username/email and Password in plain language, which is a classic secret-handling anti-pattern. This creates a clear path for sensitive credential capture by the model, transport, logs, and any integrated tooling, making account takeover or unauthorized reuse possible if mishandled.
The file implements an HTTP server for launching browser sessions, navigating, retrieving DOM state, and performing low-level actions, but it contains no CSV export logic and no structured-data extraction workflow. This behavior is materially broader and lower-level than the manifest's description of a skill that scrapes webpages and exports data to CSV.
npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.
npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.
npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.
This code accepts remote action requests that can click elements, type text, execute JavaScript, and navigate pages, all of which can modify browser state or trigger real actions on websites. Although the file documents the endpoints, it does not provide a user-facing warning, confirmation step, or explicit safety disclosure about these side effects.
The bridge initializes PageAgent with language: 'en-US', which forces a specific locale choice in the skill behavior. There is no indication in this file that the user can opt into or override that locale, which conflicts with the policy against imposing a language without user choice.
The bridge exposes session closure and full server shutdown functionality that can terminate active browser sessions and stop the service. While these operations are implemented intentionally, there is no explicit user warning or disclosure in the file that these endpoints are destructive to current session state.
No suspicious patterns detected.