Back to skill

Security audit

x402 Singularity Layer

Security checks across malware telemetry and agentic risk

Overview

The skill matches its stated payment and wallet-management purpose, but it can spend funds, sign blockchain transactions, mutate owner resources, and revoke messaging installations with limited runtime guardrails.

Install only if you are comfortable with an agent that can spend USDC, sign on-chain transactions, manage x402 resources, and use wallet/API credentials. Use a dedicated low-balance wallet, scoped API keys or PATs, trusted default hosts, and review every payment, staking, deletion, registration, feedback, and XMTP revoke action before running it.

SkillSpector

By NVIDIA
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Taint TrackingDirect Taint Flow, Variable-Mediated Taint Flow, Credential Exfiltration Chain
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (30)

Tainted flow: 'result' from requests.get (line 284, network input) → requests.get (network output)

Medium
Category
Data Flow
Content
filename = "downloaded_product"
        print(f"\nDownloading file to: {filename}")
        
        file_response = requests.get(result["downloadUrl"])
        if file_response.status_code == 200:
            with open(filename, "wb") as f:
                f.write(file_response.content)
Confidence
95% confidence
Finding
file_response = requests.get(result["downloadUrl"])

Tainted flow: 'BASE' from os.getenv (line 38, credential/environment) → requests.post (network output)

Critical
Category
Data Flow
Content
def _post(path: str, body: dict) -> dict:
    r = requests.post(f"{BASE}{path}", json=body, timeout=TIMEOUT)
    data = r.json()
    if not r.ok:
        msg = data.get("error", data)
Confidence
91% confidence
Finding
r = requests.post(f"{BASE}{path}", json=body, timeout=TIMEOUT)

Tainted flow: 'url' from os.getenv (line 44, credential/environment) → requests.post (network output)

Critical
Category
Data Flow
Content
else:
        body["agentId"] = agent_id

    response = requests.post(
        url,
        json=body,
        headers={
Confidence
94% confidence
Finding
response = requests.post( url, json=body, headers={ "Content-Type": "application/json", "X-API-Key": api_key, }, timeout=90, )

Lp3

Medium
Category
MCP Least Privilege
Confidence
95% confidence
Finding
The skill declares broad operational capabilities via allowed-tools (Read/Write/Edit/Bash/WebFetch) and explicitly describes access to environment variables, local files, shell execution, network APIs, and transaction signing, yet there is no precise permission model restricting when secrets, shell, or network access may be used. In a skill that can handle private keys, PATs, API keys, and on-chain signing, this mismatch increases the risk of over-privileged execution and accidental credential exposure or unsafe actions.

Description-Behavior Mismatch

Medium
Confidence
92% confidence
Finding
The file introduces fundraiser campaign management functionality that is not disclosed in the skill manifest's stated scope. In an agent setting, hidden or undocumented capabilities are dangerous because they can be invoked under misleading pretenses, causing the agent to use owner-scoped credentials for actions the operator did not authorize or expect.

Description-Behavior Mismatch

Medium
Confidence
95% confidence
Finding
The script exposes create and update operations against an owner-scoped campaigns API using PAT or API-key credentials, but those write actions are outside the documented management actions in the manifest. This increases the risk of unauthorized or surprising state changes because an agent may be induced to perform privileged writes with available secrets despite the user only expecting the documented x402-layer behaviors.

Vague Triggers

Medium
Confidence
88% confidence
Finding
The trigger list is extremely broad and includes many generic phrases around payments, support, wallet use, documentation, and staking, which can cause the skill to activate in contexts where the user did not intend to invoke a high-risk capability. Because this skill can spend funds, sign messages, submit transactions, and manage owner-scoped resources, unintended invocation materially increases exposure.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The document says endpoint creation returns a gateway URL and API key, and later instructs the origin to trust requests based on that x-api-key, but it does not explicitly tell users to treat the key as a secret, store it securely, or avoid exposing it in logs/client code. If operators mishandle the key, an attacker could forge proxied requests to the origin or query management APIs, depending on how the key is used.

Missing User Warnings

Medium
Confidence
93% confidence
Finding
The file instructs users to provide PATs and owner-linked API keys for privileged dashboard management, but it does not include guidance on secure handling, redaction, storage, or least-privilege use. In an agent setting, that omission increases the risk that secrets are over-requested, logged, echoed back, or reused in the wrong context, which could enable unauthorized endpoint or campaign management.

Missing User Warnings

Medium
Confidence
90% confidence
Finding
The reference includes a destructive operation, `delete_endpoint`, without any warning, confirmation requirement, or discussion of irreversible effects. In an agent-driven workflow, exposing deletion as a routine mapped action can lead to accidental or socially engineered destructive changes, especially when combined with owner-scoped credentials.

Missing User Warnings

Medium
Confidence
90% confidence
Finding
The documentation includes a complete local signing flow that takes a raw private key and signs payment authorizations, but it does not place an explicit security warning immediately around that workflow about handling, storage, exposure, or least-privilege use of sensitive key material. In this skill’s context, that matters because users may copy the example into agent automation, logs, environment variables, or persistent configs, increasing the chance of key compromise and unauthorized on-chain payments.

Missing User Warnings

Medium
Confidence
94% confidence
Finding
The reference shows direct EIP-712 payment signing with a raw private key but provides no safety guidance about secret handling, spend authorization, replay boundaries, or user consent. In this skill’s context, the omission is more dangerous because the documented flow is specifically for authorizing real USDC payments across supported chains, so users may copy the example into production or agent workflows without adequate safeguards.

Missing User Warnings

Medium
Confidence
91% confidence
Finding
The documentation instructs users to perform staking, unstaking, and claim operations that sign and submit on-chain transactions, but it does not clearly warn that staking locks tokens for a period, consumes network fees, and that submitted transactions are generally irreversible. In an agent skill context, this omission increases the risk that a user or downstream agent will authorize financially significant blockchain actions without informed consent.

Missing User Warnings

Medium
Confidence
91% confidence
Finding
The document explicitly requires highly sensitive secrets such as `PRIVATE_KEY` and an optional support token but does not warn users to protect them, avoid sharing them in chat/logs, or prefer safer secret-loading mechanisms. In a wallet-signing skill, this omission is meaningful because misuse or accidental disclosure of a private key can directly enable wallet compromise and unauthorized transactions.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
This script can automatically perform a paid request after receiving a 402 challenge, but it does not require an explicit confirmation step or provide a strong runtime warning that invoking it may spend USDC on Solana. In the context of an agent skill designed to automate payments, this increases the risk of unintended spending against arbitrary or attacker-controlled endpoints.

Missing User Warnings

Medium
Confidence
88% confidence
Finding
The script loads signing credentials from environment variables and proceeds directly to sign blockchain transactions without any explicit user-facing summary, confirmation, or transaction preview. In a skill context where an agent may invoke this non-interactively, this increases the risk of unintended asset use or irreversible on-chain actions if upstream API data, prompts, or parameters are wrong or manipulated.

Missing User Warnings

Medium
Confidence
91% confidence
Finding
The code broadcasts EVM transactions returned from a prepare/finalize workflow and waits for receipt automatically, with no interactive confirmation step. Because the transaction target, ABI, function, and args originate from an external platform API, a compromised service, bad configuration, or logic bug could cause unintended on-chain actions that are irreversible once submitted.

Missing User Warnings

Medium
Confidence
90% confidence
Finding
The script submits a prepared Solana transaction blob from a remote API and signs it with the local wallet plus an extra asset keypair without presenting the transaction contents or requiring confirmation. In this skill's wallet-first registration context, that is especially risky because users are expected to provide signing keys, and a malicious or compromised upstream service could induce irreversible unauthorized on-chain operations.

Missing User Warnings

High
Confidence
95% confidence
Finding
The revoke-others command performs an irreversible security-sensitive action that revokes all other XMTP installations for the wallet without any confirmation, dry-run, or scope display. In an agent-skill context, this is especially dangerous because a mistaken invocation or prompt-manipulated use could lock out legitimate devices and disrupt messaging access.

External Transmission

Medium
Category
Data Exfiltration
Content
if response.status_code in (200, 201):
        result = response.json()
        print("\nEndpoint created")
        print(f"URL: https://api.x402layer.cc/e/{slug}")
        if "endpoint" in result and "api_key" in result["endpoint"]:
            print("API Key returned. You must validate x-api-key at your origin.")
        if "webhook" in result:
Confidence
90% confidence
Finding
https://api.x402layer.cc/

External Transmission

Medium
Category
Data Exfiltration
Content
def _post(path: str, body: dict) -> dict:
    r = requests.post(f"{BASE}{path}", json=body, timeout=TIMEOUT)
    data = r.json()
    if not r.ok:
        msg = data.get("error", data)
Confidence
88% confidence
Finding
requests.post(f"{BASE}{path}", json=

Unpinned Dependencies

Low
Category
Supply Chain
Content
# Install: pip install -r requirements.txt

# EVM/Base payments - Required for EIP-712 signing
eth-account>=0.10.0
web3>=6.0.0

# HTTP requests
Confidence
88% confidence
Finding
eth-account>=0.10.0

Unpinned Dependencies

Low
Category
Supply Chain
Content
# EVM/Base payments - Required for EIP-712 signing
eth-account>=0.10.0
web3>=6.0.0

# HTTP requests
requests>=2.28.0
Confidence
92% confidence
Finding
web3>=6.0.0

Unpinned Dependencies

Low
Category
Supply Chain
Content
web3>=6.0.0

# HTTP requests
requests>=2.28.0

# Receipt JWT verification (RS256/JWKS)
pyjwt[crypto]>=2.8.0
Confidence
94% confidence
Finding
requests>=2.28.0

Unpinned Dependencies

Low
Category
Supply Chain
Content
# Receipt JWT verification (RS256/JWKS)
pyjwt[crypto]>=2.8.0
cryptography>=42.0.0

# Solana payments / wallet-first Solana agent registration
solders>=0.20.0
Confidence
89% confidence
Finding
cryptography>=42.0.0

VirusTotal

VirusTotal engine telemetry is currently stale for this artifact.

View on VirusTotal

Static analysis

Detected: suspicious.env_credential_access

Environment variable access combined with network send.

Critical
Code
suspicious.env_credential_access
Location
scripts/xmtp_support.mjs:11