Back to skill

Security audit

Prospairrow Websites MCP

Security checks for vulnerabilities and agentic risk

Overview

This skill appears to be a real Prospairrow integration, but its local server can use ambient API credentials without authenticating local callers, and some read-only tasks can trigger POST-based processing.

Review before installing. Use a narrowly scoped Prospairrow API key, avoid starting mcp:writes unless you need write actions, do not enable OpenClaw config API-key fallback unless required, and do not expose or rely on the loopback MCP server in environments with untrusted local processes or browser content. Treat read-only score tasks as potentially account-impacting until reclassified or confirmed side-effect-free.

Vulnerability Patterns
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (2)

T05 · Unauthorized Access and Privilege Escalation

Error
Location
src/server.ts:94
Finding

Unauthenticated Loopback RPC Service Uses Ambient Prospairrow Credentials

Content
View full analysis
{ if (req.method !== "POST") { res.writeHead(405, { "content-type": "application/json" }); res.end(JSON.stringify({ error: "Method not allowed" })); return; } const body = await new Promise((resolve, reject) => { let data = ""; req.on("data", (chunk) => { data += chunk; }); req.on("end", () => resolve(data)); req.on("error", reject); }); try { const payload = JSON.parse(body) as JsonRpcRequest; const authHeader = Array.isArray(req.headers.authorization) ? req.headers.authorization[0] : req.headers.authorization; const apiKeyHeader = Array.isArray(req.headers["x-api-key"]) ? req.headers["x-api-key"][0] : req.headers["x-api-key"]; const bearer = typeof authHeader === "string" ? authHeader.match(/^Bearer\s+(.+)$/i)?.[1]?.trim() : ""; const apiKey = (typeof apiKeyHeader === "string" && apiKeyHeader.trim()) || bearer || undefined; const result = await handleRpc(payload, { apiKey }); ``` ```ts // src/framework/service.ts:56-64 async function resolveProspairrowApiKey(inputData: RunTaskInput): Promise { const fromRequest = cleanSecret(inputData.apiKey); if (fromRequest) return fromRequest; const fromEnv = cleanSecret(process.env.PROSPAIRROW_API_KEY); if (fromEnv) return fromEnv; return readConfigApiKey(); } ``` ```ts // src/framework/service.ts:182-225 const resolvedProspairrowApiKey = inputData.siteId === "prospairrow" ? await resolveProspairrowApiKey(inputData) : undefined; let storageStatePath: string | undefined; try { storageStatePath = await loadStorageStatePath(rootDir, site.siteId); } catch ...[truncated 3630 chars]
Remediation
View remediation

T05 · Unauthorized Access and Privilege Escalation

Warning
Location
src/sites/prospairrow/tasks/get_icp_score.ts:12
Finding

READ_ONLY Tasks Bypass the Write Gate Through Scoring POST Operations

Content
View full analysis
{ const parsed = inputSchema.safeParse(params ?? {}); if (!parsed.success) { return { icp_score: null, errors: [parsed.error.message] }; } const { prospect_id, force_rescore, diagnostics } = parsed.data; const apiInit = await ProspairrowApiClient.fromApiKey(ctx.apiKeys?.prospairrow ?? ""); if (!apiInit.client) { return { icp_score: null, errors: [apiInit.error ?? "PROSPAIRROW_API_INIT_FAILED"] }; } const api = apiInit.client; try { const result = await api.getIcpScore(String(prospect_id), { forceRescore: force_rescore }); ``` ```ts // src/sites/prospairrow/tasks/get_company_score.ts:11-28 export const task: TaskDefinition = { taskId: "get_company_score", capability: Capability.READ_ONLY, description: "Retrieve company score for a prospect id.", run: async (ctx, params) => { const parsed = inputSchema.safeParse(params ?? {}); if (!parsed.success) { return { company_score: null, errors: [parsed.error.message] }; } const { prospect_id, diagnostics } = parsed.data; const apiInit = await ProspairrowApiClient.fromApiKey(ctx.apiKeys?.prospairrow ?? ""); if (!apiInit.client) { return { company_score: null, errors: [apiInit.error ?? "PROSPAIRROW_API_INIT_FAILED"] }; } const api = apiInit.client; try { const result = await api.getCompan ...[truncated 2828 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • Rogue AgentSelf-Modification, Session Persistence
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
Findings (46)

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

The manifest describes a Prospairrow integration but also reveals a local RPC/MCP server interface, runtime installation, and header/env-based authentication handling not summarized in the purpose statement. These infrastructure capabilities increase the attack surface and can lead users to authorize a toolchain with more privileges and exposure than expected.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
92% confidence
Finding

The manifest describes a Prospairrow integration but also reveals a local RPC/MCP server interface, runtime installation, and header/env-based authentication handling not summarized in the purpose statement. These infrastructure capabilities increase the attack surface and can lead users to authorize a toolchain with more privileges and exposure than expected.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

The manifest describes a Prospairrow integration but also reveals a local RPC/MCP server interface, runtime installation, and header/env-based authentication handling not summarized in the purpose statement. These infrastructure capabilities increase the attack surface and can lead users to authorize a toolchain with more privileges and exposure than expected.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The manifest describes a Prospairrow integration but also reveals a local RPC/MCP server interface, runtime installation, and header/env-based authentication handling not summarized in the purpose statement. These infrastructure capabilities increase the attack surface and can lead users to authorize a toolchain with more privileges and exposure than expected.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

The manifest describes a Prospairrow integration but also reveals a local RPC/MCP server interface, runtime installation, and header/env-based authentication handling not summarized in the purpose statement. These infrastructure capabilities increase the attack surface and can lead users to authorize a toolchain with more privileges and exposure than expected.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
93% confidence
Finding

The manifest describes a Prospairrow integration but also reveals a local RPC/MCP server interface, runtime installation, and header/env-based authentication handling not summarized in the purpose statement. These infrastructure capabilities increase the attack surface and can lead users to authorize a toolchain with more privileges and exposure than expected.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The manifest describes a Prospairrow integration but also reveals a local RPC/MCP server interface, runtime installation, and header/env-based authentication handling not summarized in the purpose statement. These infrastructure capabilities increase the attack surface and can lead users to authorize a toolchain with more privileges and exposure than expected.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The manifest describes a Prospairrow integration but also reveals a local RPC/MCP server interface, runtime installation, and header/env-based authentication handling not summarized in the purpose statement. These infrastructure capabilities increase the attack surface and can lead users to authorize a toolchain with more privileges and exposure than expected.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

The manifest describes a Prospairrow integration but also reveals a local RPC/MCP server interface, runtime installation, and header/env-based authentication handling not summarized in the purpose statement. These infrastructure capabilities increase the attack surface and can lead users to authorize a toolchain with more privileges and exposure than expected.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The manifest describes a Prospairrow integration but also reveals a local RPC/MCP server interface, runtime installation, and header/env-based authentication handling not summarized in the purpose statement. These infrastructure capabilities increase the attack surface and can lead users to authorize a toolchain with more privileges and exposure than expected.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The manifest describes a Prospairrow integration but also reveals a local RPC/MCP server interface, runtime installation, and header/env-based authentication handling not summarized in the purpose statement. These infrastructure capabilities increase the attack surface and can lead users to authorize a toolchain with more privileges and exposure than expected.

Content

No source excerpt is available for this finding.

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
95% confidence
Finding

The script performs rm -rf "$RUNTIME_DIR/src" where RUNTIME_DIR is derived from the environment variable WEBSITES_MCP_DIR or defaults to a home-directory path. If that variable is set unexpectedly or maliciously to an unsafe location, running the installer can recursively delete an arbitrary src directory on the host, making this a real destructive path-abuse issue even though the command is quoted.

Content

Scanner excerpt · scripts/install-runtime.sh (reported line 28)May include surrounding context.

sh
[[ -f "$RUNTIME_SRC/pnpm-lock.yaml" ]] && cp "$RUNTIME_SRC/pnpm-lock.yaml" "$RUNTIME_DIR/pnpm-lock.yaml"
[[ -f "$RUNTIME_SRC/test.mjs" ]] && cp "$RUNTIME_SRC/test.mjs" "$RUNTIME_DIR/test.mjs"

rm -rf "$RUNTIME_DIR/src"
cp -R "$RUNTIME_SRC/src" "$RUNTIME_DIR/src"

cd "$RUNTIME_DIR"

Credential Access

High
Category
Privilege Escalation
Confidence
83% confidence
Finding

This code accesses a secret-bearing configuration structure and extracts PROSPAIRROW_API_KEY from a stored env bag, which is credential access behavior. Although it appears intended to support authentication for the declared service, the secret is obtained from local persisted configuration rather than explicit user input, making unauthorized or unexpected credential use possible if the skill is invoked in a broader agent chain.

Content

Scanner excerpt · src/framework/service.ts (reported line 49)May include surrounding context.

ts
const keyFromApiKey = cleanSecret(prospSkill?.apiKey);
    if (keyFromApiKey) return keyFromApiKey;

    const envBag = prospSkill?.env as Record<string, unknown> | undefined;
    return cleanSecret(envBag?.PROSPAIRROW_API_KEY);
  } catch {
    return undefined;

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

This markdown file documents add_prospects as a WRITE task and provides ready-to-run examples, but it does not warn users that the operation will create or modify prospect records. For markdown files, user-affecting data changes should include an explicit warning when the behavior could affect user data or system integrity.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The file documents enrich_prospects as a WRITE task and apollo_enrich with reveal behavior, but it does not disclose that these actions may update records and trigger external enrichment/reveal behavior. In markdown descriptions, omission of privacy or data-impact warnings for such operations is a reportable missing user warning.

Content

No source excerpt is available for this finding.

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 · API_SCHEMA.md (reported line 150)May include surrounding context.

List sites

bash
curl -sS http://127.0.0.1:8799 \
  -H 'content-type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"websites.list_sites","params":{}}'

Session Persistence

Medium
Category
Rogue Agent
Confidence
60% confidence
Finding

Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Content

Scanner excerpt · README.md (reported line 21)May include surrounding context.

clawhub install prospairrow-websites-mcp

text

2. Create a free Prospairrow account and API key:

- Go to `https://app.prospairrow.com`
- Choose **Sign in with Google**

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
95% confidence
Finding

The skill explicitly requires bash, node, environment variables, and a networked MCP endpoint, yet it declares no tool scope or permission boundaries. That makes the effective capability set broader and less transparent than the manifest suggests, increasing the chance that an agent invokes shell/network actions without appropriate policy review.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The guidance says to use the skill when the user asks to run Prospairrow actions through MCP/API, which is broad and lacks constraints around specific tasks, data classes, or approval requirements. Broad invocation language can cause over-triggering by agents, increasing the chance of unintended network calls, writes, or sensitive-data handling.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The text says 'nothing fetched at runtime' and frames the package as locally shipped, but it also states that npm dependencies are fetched during install and Playwright downloads browser binaries on first browser-mode use. Even if technically distinguishable from runtime, this wording obscures real network-fetch behavior and can cause operators to approve the skill under incorrect assumptions about offline operation and external code retrieval.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The documentation makes an absolute security claim of 'no supply chain risk' even though the same file admits external dependencies are fetched via npm and Playwright may download browser binaries later. This can mislead users into trusting the installation path as fully self-contained, reducing scrutiny of third-party packages and network activity during install or first use.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
Confidence
60% confidence
Finding

Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Content

Scanner excerpt · docs/INSTALL.md (reported line 14)May include surrounding context.

md
## Steps

1. Create a free Prospairrow account:

- Open `https://app.prospairrow.com`
- Use **Sign in with Google**

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 · README.md (reported line 46)May include surrounding context.

  1. Verify auth and MCP connectivity:
bash
curl -sS http://127.0.0.1:8799 \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $PROSPAIRROW_API_KEY" \
  -d '{"jsonrpc":"2.0","id":1,"method":"websites.list_sites","params":{}}'

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 · docs/INSTALL.md (reported line 40)May include surrounding context.

  1. Verify auth and MCP connectivity:
bash
curl -sS http://127.0.0.1:8799 \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $PROSPAIRROW_API_KEY" \
  -d '{"jsonrpc":"2.0","id":1,"method":"websites.list_sites","params":{}}'

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The operations guide explicitly instructs users to start a read/write runtime and to pass a live API key, but it provides no warning about the possibility of state-changing actions, misuse of production credentials, or safe testing practices. In an agent skill context, normalizing write-enabled startup and authenticated execution without guardrails increases the chance of unintended data modification or unauthorized actions against the connected service.

Content

No source excerpt is available for this finding.

Static analysis

Detected: suspicious.env_credential_access

Environment variable access combined with network send.

Critical
Code
suspicious.env_credential_access
Location
src/sites/prospairrow/tasks/_api.ts:60