Back to skill

Security audit

VeraData — LATAM Compliance API

Security checks for vulnerabilities and agentic risk

Overview

The skill is a disclosed remote compliance API integration, but its wallet-payment examples and broad auto-use guidance need careful review before installation.

Install only if you intentionally want agents to send compliance, KYB, registry, rates, or sanctions queries to VeraData. Require explicit approval before screening real people or companies, avoid logging stream tokens, review any remote MCP tools before enabling them, and do not let an agent sign x402 payments unless you enforce local recipient, token, network, endpoint-price, and spend-limit checks.

Vulnerability Patterns
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (1)

T09 · Insecure Skill Coding Practices

Error
Location
SKILL.md:149
Finding

Unvalidated Server-Controlled Payment Terms Are Signed by the Client Wallet

Content
View full analysis

Vulnerability Details

File Location: SKILL.md, lines 149–165
Vulnerability Type: Untrusted payment authorization parameters
Risk Level: High

Vulnerable Code

python
# Step 3: sign EIP-3009
accepts = payment_req["accepts"][0]  # pick Base or Solana
signature = await wallet_client.sign_eip3009(
    amount=int(accepts["maxAmountRequired"]),
    to=accepts["paymentInfo"]["payTo"],
    usdc_contract=accepts["paymentInfo"]["extra"]["erc20Address"],
    valid_before=int(time.time()) + 300,
    nonce=secrets.token_hex(16),
)

# Step 4: encode and retry
payment_header = base64.b64encode(json.dumps({
    "scheme": accepts["scheme"],
    "networkId": accepts["networkId"],
    "payload": signature,
}).encode()).decode()

Technical Analysis

The example decodes a PAYMENT-REQUIRED response and signs the first entry in the server-controlled accepts array without independently validating:

  • The exact expected payment amount or a caller-approved maximum.
  • The recipient against VeraData's documented wallet addresses.
  • The USDC contract against an allowlist for the selected chain.
  • The network identifier against the wallet's intended network.
  • The payment scheme and decoded response structure.
  • Whether the selected acceptance option corresponds to the requested endpoint and published price.

Base64 provides encoding only; it does not provide authenticity, confidentiality, or integrity. Consequently, encoding the signed payload does not mitigate the trust-boundary problem.

Although the initial request uses a fixed HTTPS origin, a compromised API, TLS interception environment, DNS compromise, or malicious replacement service at that origin could return attacker-selected payment parameters. A wallet implementation that signs the supplied values literally could then authorize a transfer that differs from the payment the user intended.

This exceeds least privilege for the declar ...[truncated 2250 chars]

Remediation
View remediation

Remediation Suggestions

  1. Maintain a local allowlist of supported network IDs, canonical USDC contracts, payment schemes, and authorized recipient wallets.
  2. Define a local endpoint-to-price policy and reject any amount above the exact expected price or an explicit user-approved ceiling.
  3. Do not automatically select accepts[0]. Filter all options through policy and fail closed if no approved option remains.
  4. Bind the authorization to the intended endpoint, request, chain, asset, recipient, and amount where the protocol supports such binding.
  5. Require explicit user confirmation before signing when any payment term differs from previously approved policy.
  6. Implement the same validation inside wallet_client so callers cannot bypass it by supplying arbitrary values.
  7. Validate the decoded JSON against a strict schema, including types, allowed fields, amount bounds, expiry bounds, and nonce requirements.
  8. Reject redirects and unexpected origins, enforce TLS certificate verification, and apply appropriate connection and response-size limits.
  9. Check both HTTP responses and payment-verification results before treating a transaction as successful.
  10. Document that base64 is transport encoding rather than a security control, and display the human-readable payment terms before authorization.

A hardened flow should resemble:

python
APPROVED = {
    "eip155:8453": {
        "scheme": "exact",
        "token": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
        "pay_to": "0xCf1d31020A7915421f6d66B9835Dcb6f422337E7",
    }
}

expected_amount = endpoint_price_policy[endpoint]
approved = []

for option in payment_req.get("accepts", []):
    network = option.get("networkId")
    policy = APPROVED.get(network)
    payment_info = option.get("paymentInfo", {})
    extra = payment_info.get("extra", {})

    if (
        policy
        and option.get("scheme") == policy["scheme"]
        and payment
...[truncated 474 chars]
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (23)

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill description repeatedly instructs agents to use this integration for broad categories like sanctions compliance, KYC/KYB, financial data, registry lookup, and regulatory screening without tight scoping or user-consent guardrails. In autonomous agent environments, this can trigger the skill on sensitive tasks and cause regulated or personal data to be sent to a third-party API more often than intended.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% 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 10)May include surrounding context.

md
author: teodorofodocrispin-cmyk
  version: "2.3.2"
  base_url: https://api.veradata.dev
  health: https://api.veradata.dev/health
  x402_discovery: https://api.veradata.dev/.well-known/x402
  llms_txt: https://api.veradata.dev/llms.txt
  openapi: https://api.veradata.dev/openapi.json

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% 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 11)May include surrounding context.

md
author: teodorofodocrispin-cmyk
  version: "2.3.2"
  base_url: https://api.veradata.dev
  health: https://api.veradata.dev/health
  x402_discovery: https://api.veradata.dev/.well-known/x402
  llms_txt: https://api.veradata.dev/llms.txt
  openapi: https://api.veradata.dev/openapi.json

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% 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 12)May include surrounding context.

md
author: teodorofodocrispin-cmyk
  version: "2.3.2"
  base_url: https://api.veradata.dev
  health: https://api.veradata.dev/health
  x402_discovery: https://api.veradata.dev/.well-known/x402
  llms_txt: https://api.veradata.dev/llms.txt
  openapi: https://api.veradata.dev/openapi.json

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% 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 13)May include surrounding context.

md
author: teodorofodocrispin-cmyk
  version: "2.3.2"
  base_url: https://api.veradata.dev
  health: https://api.veradata.dev/health
  x402_discovery: https://api.veradata.dev/.well-known/x402
  llms_txt: https://api.veradata.dev/llms.txt
  openapi: https://api.veradata.dev/openapi.json

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% 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 14)May include surrounding context.

md
author: teodorofodocrispin-cmyk
  version: "2.3.2"
  base_url: https://api.veradata.dev
  health: https://api.veradata.dev/health
  x402_discovery: https://api.veradata.dev/.well-known/x402
  llms_txt: https://api.veradata.dev/llms.txt
  openapi: https://api.veradata.dev/openapi.json

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% 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 72)May include surrounding context.

md
author: teodorofodocrispin-cmyk
  version: "2.3.2"
  base_url: https://api.veradata.dev
  health: https://api.veradata.dev/health
  x402_discovery: https://api.veradata.dev/.well-known/x402
  llms_txt: https://api.veradata.dev/llms.txt
  openapi: https://api.veradata.dev/openapi.json

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% 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 73)May include surrounding context.

md
author: teodorofodocrispin-cmyk
  version: "2.3.2"
  base_url: https://api.veradata.dev
  health: https://api.veradata.dev/health
  x402_discovery: https://api.veradata.dev/.well-known/x402
  llms_txt: https://api.veradata.dev/llms.txt
  openapi: https://api.veradata.dev/openapi.json

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% 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 117)May include surrounding context.

md
author: teodorofodocrispin-cmyk
  version: "2.3.2"
  base_url: https://api.veradata.dev
  health: https://api.veradata.dev/health
  x402_discovery: https://api.veradata.dev/.well-known/x402
  llms_txt: https://api.veradata.dev/llms.txt
  openapi: https://api.veradata.dev/openapi.json

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% 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 354)May include surrounding context.

md
author: teodorofodocrispin-cmyk
  version: "2.3.2"
  base_url: https://api.veradata.dev
  health: https://api.veradata.dev/health
  x402_discovery: https://api.veradata.dev/.well-known/x402
  llms_txt: https://api.veradata.dev/llms.txt
  openapi: https://api.veradata.dev/openapi.json

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% 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 355)May include surrounding context.

md
author: teodorofodocrispin-cmyk
  version: "2.3.2"
  base_url: https://api.veradata.dev
  health: https://api.veradata.dev/health
  x402_discovery: https://api.veradata.dev/.well-known/x402
  llms_txt: https://api.veradata.dev/llms.txt
  openapi: https://api.veradata.dev/openapi.json

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% 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 356)May include surrounding context.

md
author: teodorofodocrispin-cmyk
  version: "2.3.2"
  base_url: https://api.veradata.dev
  health: https://api.veradata.dev/health
  x402_discovery: https://api.veradata.dev/.well-known/x402
  llms_txt: https://api.veradata.dev/llms.txt
  openapi: https://api.veradata.dev/openapi.json

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% 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 357)May include surrounding context.

md
author: teodorofodocrispin-cmyk
  version: "2.3.2"
  base_url: https://api.veradata.dev
  health: https://api.veradata.dev/health
  x402_discovery: https://api.veradata.dev/.well-known/x402
  llms_txt: https://api.veradata.dev/llms.txt
  openapi: https://api.veradata.dev/openapi.json

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% 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 358)May include surrounding context.

md
author: teodorofodocrispin-cmyk
  version: "2.3.2"
  base_url: https://api.veradata.dev
  health: https://api.veradata.dev/health
  x402_discovery: https://api.veradata.dev/.well-known/x402
  llms_txt: https://api.veradata.dev/llms.txt
  openapi: https://api.veradata.dev/openapi.json

External Transmission

Medium
Category
Data Exfiltration
Confidence
93% confidence
Finding

The quick-start command encourages immediate transmission of a sanctions-search subject to the external API with no embedded consent or data-handling gate. In the compliance context, names and associated jurisdiction data are often sensitive, making this more dangerous than a routine public-data fetch.

Content

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

Quick Start — Trial (No Payment)

bash
curl -X POST https://api.veradata.dev/sanctions/quick \
  -H "Content-Type: application/json" \
  -H "X-TRIAL: true" \
  -d '{"name": "Nicolás Maduro"}'

External Transmission

Medium
Category
Data Exfiltration
Confidence
93% confidence
Finding

The quick-start command encourages immediate transmission of a sanctions-search subject to the external API with no embedded consent or data-handling gate. In the compliance context, names and associated jurisdiction data are often sensitive, making this more dangerous than a routine public-data fetch.

Content

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

Quick Start — Trial (No Payment)

bash
curl -X POST https://api.veradata.dev/sanctions/quick \
  -H "Content-Type: application/json" \
  -H "X-TRIAL: true" \
  -d '{"name": "Nicolás Maduro"}'

External Transmission

Medium
Category
Data Exfiltration
Confidence
93% confidence
Finding

This example sends a named entity and country code to an external sanctions endpoint, which is a real third-party data disclosure. Because the skill is marketed for compliance and KYB use, agents may use it on high-sensitivity corporate screening tasks where unnecessary sharing could create legal, contractual, or privacy issues.

Content

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

text

```bash
curl -X POST https://api.veradata.dev/sanctions \
  -H "Content-Type: application/json" \
  -H "X-TRIAL: true" \
  -d '{"name": "PDVSA", "country": "VE"}'

External Transmission

Medium
Category
Data Exfiltration
Confidence
84% confidence
Finding

The stream-token flow initiates a paid external interaction and encourages token acquisition from the third-party service. While the sample query is low sensitivity, automatic purchase/payment flows increase risk because agents may spend funds or establish persistent data exchange without sufficiently narrow approval logic.

Content

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

Step 1 — Get a stream token (pays $0.02 USDC):

bash
# Without payment — receive 402 with PAYMENT-REQUIRED header
curl -X POST "https://api.veradata.dev/rates/stream/token?country=CO"

# With payment — receive stream_token valid 5 minutes
curl -X POST "https://api.veradata.dev/rates/stream/token?country=CO" \

External Transmission

Medium
Category
Data Exfiltration
Confidence
88% confidence
Finding

This example includes a PAYMENT-SIGNATURE header flow, meaning the agent may autonomously authorize on-chain or facilitator-mediated payment to a third party. In an agent setting, payment-capable external calls are more dangerous than ordinary network requests because a mis-trigger can leak data and spend assets simultaneously.

Content

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

curl -X POST "https://api.veradata.dev/rates/stream/token?country=CO"

With payment — receive stream_token valid 5 minutes

curl -X POST "https://api.veradata.dev/rates/stream/token?country=CO"
-H "PAYMENT-SIGNATURE: "

text

External Transmission

Medium
Category
Data Exfiltration
Confidence
81% confidence
Finding

Returning a stream URL with an embedded bearer-like stream token creates a credentialed external access path. If agents log, echo, or share URLs, the token could be exposed and reused within its validity window, enabling unauthorized access to the stream.

Content

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

"stream_token": "abc123...", "country": "CO", "expires_in": 300, "stream_url": "https://api.veradata.dev/rates/stream?country=CO&stream_token=abc123..." }

text

External Transmission

Medium
Category
Data Exfiltration
Confidence
81% confidence
Finding

The example shows consumption of a tokenized stream URL, which can lead agents to place ephemeral credentials in logs, telemetry, browser history, or downstream prompts. In autonomous systems, this increases the chance of accidental credential disclosure and unauthorized stream access.

Content

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

Step 2 — Connect to stream:

bash
curl -N "https://api.veradata.dev/rates/stream?country=CO&stream_token=abc123..."

SSE Events:

External Transmission

Medium
Category
Data Exfiltration
Confidence
86% confidence
Finding

Advertising an MCP server endpoint invites agents to establish a remote tool connection that can widen the attack surface beyond single-purpose HTTP requests. Remote MCP integration can expose additional capabilities and data flows if the agent auto-discovers or auto-trusts tools from the endpoint.

Content

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

MCP Integration

VeraData exposes a full MCP server at https://api.veradata.dev/mcp.

python
# In your MCP client config:

External Transmission

Medium
Category
Data Exfiltration
Confidence
87% confidence
Finding

The config snippet directly instructs clients to connect to a remote MCP server over HTTP transport, enabling broad remote tool exposure. In security-sensitive agent deployments, auto-configuring remote tool servers without approval can result in unintended data access, prompt injection propagation, or unauthorized external actions.

Content

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

md
{
  "mcpServers": {
    "veradata": {
      "url": "https://api.veradata.dev/mcp",
      "transport": "http"
    }
  }

Static analysis

No suspicious patterns detected.