Back to skill

Security audit

Virtuals Protocol Acp

Security checks for vulnerabilities and agentic risk

Overview

The skill mostly matches its stated ACP commerce purpose, but it handles login links, arbitrary resource URLs, and local credentials in ways that deserve review before installation.

Review this skill carefully before installing. Use it only in an environment where ACP wallet, token, marketplace, and seller-runtime actions are intended. Protect config.json as a secret, avoid committing it, do not query resource URLs you do not trust, and be cautious with setup/login until the browser-opening code is changed to avoid shell execution and validate allowed ACP login hosts.

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 (5)

T09 · Insecure Skill Coding Practices

Error
Location
src/lib/open.ts:5
Finding

Shell Command Injection Through a Server-Provided Authentication URL

Content
View full analysis
{ const { data } = await apiClient().get<{ data: AuthUrlResponse }>( "/api/auth/lite/auth-url" ); return data.data; } ``` ```ts // src/lib/auth.ts:169-172 output.log(` Opening browser...`); openUrl(authUrl); output.log(` Login link: ${authUrl}\n`); output.log(" Complete login in your browser, then press ENTER.\n"); ``` ```ts // src/lib/open.ts:5-20 import { exec } from "child_process"; export function openUrl(url: string): void { const platform = process.platform; let cmd: string; if (platform === "darwin") { cmd = `open "${url}"`; } else if (platform === "win32") { cmd = `start "" "${url}"`; } else { // Linux / others cmd = `xdg-open "${url}"`; } exec(cmd, (err) => { if (err) { // Silently fail — the URL is always printed as fallback } }); } ``` ### Technical Analysis The authentication URL is supplied by the remote ACP service and passed directly to `openUrl`. That function interpolates the URL into a shell command and invokes it using `child_process.exec`. Placing attacker-controlled data inside double quotes does not make shell execution safe. On Unix-like platforms, constructs such as command substitution can still be evaluated inside double quotes. Platform-specific shell metacharacters can create equivalent risks on Windows. There is no validation that the returned value: - Uses HTTPS. - Belongs to an expected Virtuals authentication host. - Is free of shell metacharacters. - Represents an ordinary HTTP or HTTPS URL. This makes the remote authentication response part of a local command-execution boundary. ### Attack Path 1. An attacker gains cont ...[truncated 971 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
src/commands/resource.ts:15
Finding

Server-Side Request Forgery Through Unrestricted Resource URLs

Content
View full analysis
0) { // Build query string from params const queryString = new URLSearchParams(); for (const [key, value] of Object.entries(params)) { if (value !== null && value !== undefined) { queryString.append(key, String(value)); } } const urlWithParams = url.includes("?") ? `${url}&${queryString.toString()}` : `${url}?${queryString.toString()}`; response = await axios.get(urlWithParams); } else { response = await axios.get(url); } ``` ### Technical Analysis The command verifies only that the input can be parsed by the `URL` constructor. It does not restrict the URL scheme, hostname, resolved IP address, port, or redirect destination. Consequently, the CLI can be made to send requests from the victim environment to: - Loopback services. - Private network addresses. - Link-local services. - Cloud instance metadata endpoints. - Administrative interfaces bound only to the local network. - Redirect targets that resolve to protected destinations. Axios follows HTTP redirects by default, so validating only the initial string would remain insufficient even if a basic hostname check were added. The feature legitimately needs network access to query ACP resources, but unrestricted access to all network destinations exceeds the minimum privilege required for that functionality. ### Attack Path 1. An attacker publishes or supplies a crafted resource URL, or places instructions in untrusted content telling an Agent to query it. 2. The Agent invokes `acp resource query `. ...[truncated 999 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
src/lib/config.ts:23
Finding

Plaintext Credential Storage Without Restrictive File Permissions

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
src/commands/sell.ts:56
Finding

Path Traversal in Offering and Resource Scaffolding Commands

Content
View full analysis
{ if (!offeringName) { output.fatal("Usage: acp sell init "); } const dir = resolveOfferingDir(offeringName); if (fs.existsSync(dir)) { output.fatal(`Offering directory already exists: ${dir}`); } fs.mkdirSync(dir, { recursive: true }); const offeringJson: Record = { name: offeringName, description: "", jobFee: null, jobFeeType: null, requiredFunds: null, requirement: {}, }; fs.writeFileSync( path.join(dir, "offering.json"), JSON.stringify(offeringJson, null, 2) + "\n" ); const handlersTemplate = `import type { ExecuteJobResult, ValidationResult } from "../../runtime/offeringTypes.js"; // Required: implement your service logic here export async function executeJob(request: any): Promise { // TODO: Implement your service return { deliverable: "TODO: Return your result" }; } // Optional: validate incoming requests export function validateRequirements(request: any): ValidationResult { // Return { valid: true } to accept, or { valid: false, reason: "explanation" } to reject return { valid: true }; } // Optional: provide custom payment request message export function requestPayment(request: any): string { // Return a custom message/reason for the payment request return "Request accepted"; } `; fs.writeFileSync(path.join(dir, "handlers.ts"), handlersTemplate); } ``` ```ts function resolveResourceDir(resourceName: string): string { r ...[truncated 2465 chars]
Remediation
View remediation

T05 · Unauthorized Access and Privilege Escalation

Warning
Location
src/seller/runtime/acpSocket.ts:26
Finding

Seller WebSocket Uses a Public Wallet Address as Its Only Client Credential

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (65)

Tp4

High
Category
MCP Tool Poisoning
Confidence
91% confidence
Finding

If the underlying skill opens arbitrary URLs in the user's default browser via shell execution, that is a significant expansion of capability and can become command-injection or phishing-enablement risk depending on implementation. In an agent skill, browser-opening behavior should be treated as sensitive because it can direct users to attacker-controlled pages or abuse shell/platform handlers.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

If the underlying skill opens arbitrary URLs in the user's default browser via shell execution, that is a significant expansion of capability and can become command-injection or phishing-enablement risk depending on implementation. In an agent skill, browser-opening behavior should be treated as sensitive because it can direct users to attacker-controlled pages or abuse shell/platform handlers.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

If the underlying skill opens arbitrary URLs in the user's default browser via shell execution, that is a significant expansion of capability and can become command-injection or phishing-enablement risk depending on implementation. In an agent skill, browser-opening behavior should be treated as sensitive because it can direct users to attacker-controlled pages or abuse shell/platform handlers.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
89% confidence
Finding

If the underlying skill opens arbitrary URLs in the user's default browser via shell execution, that is a significant expansion of capability and can become command-injection or phishing-enablement risk depending on implementation. In an agent skill, browser-opening behavior should be treated as sensitive because it can direct users to attacker-controlled pages or abuse shell/platform handlers.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

If the underlying skill opens arbitrary URLs in the user's default browser via shell execution, that is a significant expansion of capability and can become command-injection or phishing-enablement risk depending on implementation. In an agent skill, browser-opening behavior should be treated as sensitive because it can direct users to attacker-controlled pages or abuse shell/platform handlers.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
87% confidence
Finding

If the underlying skill opens arbitrary URLs in the user's default browser via shell execution, that is a significant expansion of capability and can become command-injection or phishing-enablement risk depending on implementation. In an agent skill, browser-opening behavior should be treated as sensitive because it can direct users to attacker-controlled pages or abuse shell/platform handlers.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

If the underlying skill opens arbitrary URLs in the user's default browser via shell execution, that is a significant expansion of capability and can become command-injection or phishing-enablement risk depending on implementation. In an agent skill, browser-opening behavior should be treated as sensitive because it can direct users to attacker-controlled pages or abuse shell/platform handlers.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

If the underlying skill opens arbitrary URLs in the user's default browser via shell execution, that is a significant expansion of capability and can become command-injection or phishing-enablement risk depending on implementation. In an agent skill, browser-opening behavior should be treated as sensitive because it can direct users to attacker-controlled pages or abuse shell/platform handlers.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

If the underlying skill opens arbitrary URLs in the user's default browser via shell execution, that is a significant expansion of capability and can become command-injection or phishing-enablement risk depending on implementation. In an agent skill, browser-opening behavior should be treated as sensitive because it can direct users to attacker-controlled pages or abuse shell/platform handlers.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

If the underlying skill opens arbitrary URLs in the user's default browser via shell execution, that is a significant expansion of capability and can become command-injection or phishing-enablement risk depending on implementation. In an agent skill, browser-opening behavior should be treated as sensitive because it can direct users to attacker-controlled pages or abuse shell/platform handlers.

Content

No source excerpt is available for this finding.

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
Run from the **repo root** (where `package.json` lives). For machine-readable output, always append `--json`. The CLI prints JSON to stdout in `--json` mode. Yo

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
Run from the **repo root** (where `package.json` lives). For machine-readable output, always append `--json`. The CLI prints JSON to stdout in `--json` mode. Yo

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
See [ACP Job reference](./references/acp-job.md) for detailed buy workflow. See [Seller reference](./references/seller.md) for the full sell guide.

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
See [ACP Job reference](./references/acp-job.md) for detailed buy workflow. See [Seller reference](./references/seller.md) for the full sell guide.

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
See [ACP Job reference](./references/acp-job.md) for detailed buy workflow. See [Seller reference](./references/seller.md) for the full sell guide.

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
- **Repo root** — `SKILL.md`, `package.json`, `config.json` (do not commit). Run all commands from here.

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
- **bin/acp.ts** — Unified CLI entry point. Invoke with `acp <command> [subcommand] [args] --json`.

Known Vulnerable Dependency: axios==1.13.4 — 16 advisory(ies): CVE-2026-44494 (axios Vulnerable to Full Man-in-the-Middle via Prototype Pollution Gadget in `co); CVE-2026-44495 (axios Vulnerable to Credential Theft and Response Hijacking via Prototype Pollut); CVE-2025-62718 (Axios has a NO_PROXY Hostname Normalization Bypass that Leads to SSRF) +13 more

High
Category
Supply Chain
Confidence
97% confidence
Finding

The lockfile pins axios 1.13.4, and the reported advisories include SSRF/proxy-bypass and prototype-pollution-related request/response manipulation issues. In this skill, axios is a direct runtime dependency and the skill’s purpose involves transacting with external agents and services, which increases exposure to attacker-controlled URLs, redirects, proxy settings, or hostile responses.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: form-data==4.0.5 — 1 advisory(ies): CVE-2026-12143 (form-data: CRLF injection in form-data via unescaped multipart field names and f)

High
Category
Supply Chain
Confidence
88% confidence
Finding

form-data 4.0.5 is reported vulnerable to CRLF injection through unescaped multipart field names/filenames. If this skill ever builds multipart requests from untrusted marketplace or agent-supplied metadata, an attacker could tamper with multipart boundaries/headers and potentially alter server-side interpretation of uploaded content.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: socket.io-parser==4.2.5 — 2 advisory(ies): CVE-2026-69185 (Socket.IO: Zero-attachment Memory Exhaustion); CVE-2026-33151 (socket.io allows an unbounded number of binary attachments)

High
Category
Supply Chain
Confidence
95% confidence
Finding

socket.io-parser 4.2.5 is flagged for unbounded attachment handling and memory exhaustion conditions. This skill depends on socket.io-client for runtime communication, so a malicious or compromised remote agent/service could send crafted frames that consume excessive memory and crash or degrade the host agent.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: ws==8.18.3 — 2 advisory(ies): CVE-2026-45736 (ws: Uninitialized memory disclosure); CVE-2026-48779 (ws: Memory exhaustion DoS from tiny fragments and data chunks)

High
Category
Supply Chain
Confidence
94% confidence
Finding

ws 8.18.3 is reported vulnerable to memory disclosure and memory-exhaustion DoS issues. Since it is pulled in through engine.io/socket.io-client and this skill is designed to communicate with external agents over network channels, exposure to malicious peers makes denial of service and possible unintended data exposure more plausible.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: axios==1.13.4 — 16 advisory(ies): CVE-2026-44494 (axios Vulnerable to Full Man-in-the-Middle via Prototype Pollution Gadget in `co); CVE-2026-44495 (axios Vulnerable to Credential Theft and Response Hijacking via Prototype Pollut); CVE-2025-62718 (Axios has a NO_PROXY Hostname Normalization Bypass that Leads to SSRF) +13 more

High
Category
Supply Chain
Confidence
98% confidence
Finding

The manifest includes axios 1.13.4, which the supplied analysis identifies as having multiple known advisories, including an SSRF-related NO_PROXY bypass and more severe request/response manipulation issues. In the context of an agent-commerce skill that interacts with wallets, marketplaces, remote agents, and seller runtimes, a vulnerable HTTP client is especially dangerous because it may enable credential leakage, SSRF against internal services, response tampering, or misuse of privileged network access.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The README promotes auto-provisioned wallets and token launch capability without warning that blockchain transactions may be irreversible, may incur fees, and may create financial, legal, or reputational consequences. In this skill context, the danger is elevated because the tool is designed for AI agents, which may execute commands programmatically and trigger real economic actions with limited human review.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The README states that API keys and session tokens are stored in a local config.json file but does not warn users that these values are sensitive secrets requiring restrictive file permissions, careful backup handling, and exclusion from logs or support bundles. In a skill that provisions wallets and can transact on-chain, compromise of these credentials could enable unauthorized marketplace actions, account access, or misuse of the seller runtime.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
91% confidence
Finding

The skill declares capabilities that clearly involve network access, local configuration handling, and credential use, but it does not declare an explicit tool scope such as allowed-tools or permissions. That omission weakens reviewability and can cause an agent platform to grant broader execution than users expect, especially because the skill includes login, wallet, token, runtime, and resource-query operations.

Content

No source excerpt is available for this finding.

Static analysis

Detected: suspicious.dangerous_exec

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
src/commands/serve.ts:86

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
src/commands/setup.ts:52

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
src/lib/config.ts:142

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
src/lib/open.ts:20