Back to skill

Security audit

Alchemy Official

Security checks for vulnerabilities and agentic risk

Overview

The skill appears to be legitimate Alchemy documentation, but it needs Review because its gateway flow can sign real USDC payments using wallet credentials without enough built-in limits or confirmations.

Install only if you are comfortable with an agent helping use Alchemy blockchain APIs and x402 payments. Use testnets first, use a dedicated low-balance wallet, pin and audit npm packages before exposing wallet secrets, verify every payment amount/recipient/asset/network before signing, avoid storing SIWE tokens in project files, restrict and rotate API keys, and only query wallet portfolio data with authorization.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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
rules/payment.md:28
Finding

Unbounded Server-Directed USDC Payment Signing

Content
View full analysis
{ const account = privateKeyToAccount(privateKey); // 1. Create x402 client and register the EVM "exact" payment scheme const client = new x402Client(); registerExactEvmScheme(client, { signer: account }); const httpClient = new x402HTTPClient(client); // 2. Decode payment requirements from the PAYMENT-REQUIRED header const encoded = response.headers.get("PAYMENT-REQUIRED")!; const paymentRequired = decodePaymentRequiredHeader(encoded); // 3. Create the signed payment payload const paymentPayload = await httpClient.createPaymentPayload(paymentRequired); // 4. Encode as a header value return encodePaymentSignatureHeader(paymentPayload); } ``` The automatic request workflow similarly states: ```typescript const client = new x402Client(); registerExactEvmScheme(client, { signer }); const httpClient = new x402HTTPClient(client); const paidFetch = wrapFetchWithPayment(fetch, httpClient); ``` ### Technical Analysis The payment requirements are controlled by the HTTP `PAYMENT-REQUIRED` response. The documented flow decodes those requirements and immediately generates an EIP-712 USDC transfer authorization without verifying critical fields such as: - Maximum amount - Expected USDC contract address - Expected payment recipient - Expected resource URL - Permitted network - Payment scheme and timeout - Per-request or cumulative spending limits The optional selector in `rules/making-requests.md` only demonstrates selecting a network. It does not validate the amount, recipient, asset, or resource. The defau ...[truncated 1299 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
rules/curl-workflow.md:72
Finding

Plaintext SIWE Bearer Token and Temporary Header Storage

Content
View full analysis
siwe-token.txt ``` For subsequent requests, the token is read back from disk: ```bash TOKEN=$(cat siwe-token.txt) ``` The payment workflow also creates a predictable response-header file: ```bash HTTP_CODE=$(curl -s -o /dev/null -D headers.txt -w "%{http_code}" -X POST "https://x402.alchemy.com/eth-mainnet/v2" \ -H "Content-Type: application/json" \ -H "Accept: application/json" \ -H "Authorization: SIWE $TOKEN" \ -d '{"id":1,"jsonrpc":"2.0","method":"eth_blockNumber"}') ``` ### Technical Analysis The SIWE token is a bearer credential that remains valid for approximately one hour. Writing it with ordinary shell redirection applies the process’s current `umask`; the documentation does not ensure mode `0600`. Adding `siwe-token.txt` to `.gitignore` only reduces accidental version-control commits. It does not protect the token from: - Other local users - Workspace indexing or collection tools - Backups - Container volume snapshots - Misconfigured file sharing - Local malware - Accidental archive creation The predictable `headers.txt` file is also created without secure temporary-file handling or cleanup. Although the shown response headers principally contain payment requirements, retaining authentication and payment workflow artifacts unnecessarily expands the local attack surface. ### Attack Path 1. A user follows the documented workflow and creates `siwe-token.txt`. 2. The file receives default permissions based on the current `umask`. 3. Another local process, workspace collector, backup system, or unauthorized user reads the file. 4. The attacker copies the SIWE bearer token. 5. Before expiration, the att ...[truncated 611 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Error
Location
rules/wallet-bootstrap.md:53
Finding

Unpinned Third-Party Package Execution in Wallet-Signing Environment

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Note
Location
rules/authentication.md:25
Finding

Non-Cryptographic SIWE Nonce Generation

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
SKILL.md:65
Finding

API Credentials Embedded in Request URLs

Content
View full analysis
.g.alchemy.com/nft/v3/$ALCHEMY_API_KEY` | API key in URL | NFT ownership and metadata. | | Prices API | `https://api.g.alchemy.com/prices/v1/$ALCHEMY_API_KEY` | API key in URL | Prices by symbol or address. | | Portfolio API | `https://api.g.alchemy.com/data/v1/$ALCHEMY_API_KEY` | API key in URL | Multi-chain wallet views. | ``` A documented invocation is: ```bash curl -s https://eth-mainnet.g.alchemy.com/v2/$ALCHEMY_API_KEY \ -H "Content-Type: application/json" \ -d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}' ``` ### Technical ...[truncated 1726 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • YARA SignaturesMalware Match, Webshell Match, Cryptominer Match
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (99)

YARA rule 'agent_skill_mcp_tool_poisoning_metadata': MCP/tool metadata poisoning indicators in tool schemas or skill manifests [agent_skills]

High
Category
YARA Match
Confidence
80% confidence
Finding

YARA rule matched a hack tool or exploit indicator (offensive tools, reconnaissance, privilege escalation, or exploit frameworks).

Content

Scanner excerpt · references/data-simulation-api.md (reported line 4)May include surrounding context.

md
---
id: references/data-simulation-api.md
name: 'Simulation API'
description: 'Simulate transactions before submitting them on-chain. Use this for safety checks and user previews.'
tags:
  - alchemy
  - data-apis
  - data
related:
  - node-debug-api.md
  - recipes-simulate-transaction.md
updated: 2026-02-23
---
# Simulation API

Simulate transactions before submitting them on-chain. Preview asset changes and execution traces. JSON-RPC POST requests.

**Base URL**: `https://<network>.g.alchemy.com/v2/$ALCHEMY_API_KEY`

**Supported chains**: Ethereum, Base, Polygon, Arbitrum, Optimism (and testnets).

---

## `alchemy_simulateAssetChanges`

Simulates a transa

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
80% confidence
Finding

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).

Content

Scanner excerpt · references/webhooks-details.md (reported line 52)May include surrounding context.

md
- `GET /team-webhooks`
- `GET /webhook-addresses?webhook_id=...`
- `GET /webhook-nft-filters?webhook_id=...`
- `DELETE /delete-webhook?webhook_id=...`

## Spec-Derived Create Payload
`POST /create-webhook` requires:

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The skill instructs agents to set up a wallet, fund it with USDC, sign SIWE messages, and handle x402 payments, but it does not prominently warn that these actions can authorize spending or commit real funds. In an agent setting, this omission increases the risk of users or downstream automation performing financially consequential actions without informed consent or clear approval boundaries.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The description advertises 'Two auth modes: API key or x402 Agentic Gateway (no key needed)' and broad direct coverage including webhooks. In practice, the guide is explicitly 'for AI agents integrating Alchemy APIs using an API key' and repeatedly tells users without a key to use the separate agentic-gateway skill, so the described capability is broader than what this file actually implements/documents.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The trigger list contains broad terms such as nft, portfolio, and on-chain, which can cause unintended activation in loosely related conversations. In an agent ecosystem, overbroad activation can route user requests into a skill that encourages external requests and blockchain actions, increasing the chance of accidental data disclosure or unsafe transaction guidance.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The manifest description says the skill has 'Two auth modes: API key or x402 Agentic Gateway (no key needed),' implying this skill itself supports both modes. But the body text instructs that if no API key is set, the user must not proceed and should use the separate agentic-gateway skill instead, which directly contradicts the stated intent of this file's support scope.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The skill advertises EVM read/write and references transaction submission flows without an explicit warning that blockchain writes are irreversible and may transfer value. In agent-assisted contexts, omission of high-friction safety language can increase the likelihood that a user is guided into signing or broadcasting harmful transactions without understanding the consequences.

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

EVM JSON-RPC (Read)

bash
curl -s https://eth-mainnet.g.alchemy.com/v2/$ALCHEMY_API_KEY \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}'

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
87% confidence
Finding

The skill documents getOwnersForContract and getOwnersForNFT as returning wallet owner addresses, which can expose user-linked blockchain holdings and balances. Although the file includes a warning about untrusted metadata URLs, it does not provide any user-facing warning that these endpoints surface potentially privacy-sensitive ownership data.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The documentation encourages sending wallet addresses, holdings, NFT ownership, and transaction history to a third-party API but does not clearly warn that this is sensitive financial/activity metadata being externally transmitted. In an agent skill context, users may not realize queries deanonymize wallets or expose portfolio intelligence to an external service, making this a real privacy and data-handling issue.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
89% confidence
Finding

This example performs an external POST request to Alchemy containing wallet addresses and returns sensitive portfolio data including balances and prices. In a skill ecosystem, such examples normalize sending potentially identifying financial data off-platform without any adjacent warning or consent guidance.

Content

Scanner excerpt · references/data-portfolio-apis.md (reported line 46)May include surrounding context.

Request

bash
curl -s -X POST "https://api.g.alchemy.com/data/v1/$ALCHEMY_API_KEY/assets/tokens/by-address" \
  -H "Content-Type: application/json" \
  -d '{
    "addresses": [{

External Transmission

Medium
Category
Data Exfiltration
Confidence
89% confidence
Finding

This example performs an external POST request to Alchemy containing wallet addresses and returns sensitive portfolio data including balances and prices. In a skill ecosystem, such examples normalize sending potentially identifying financial data off-platform without any adjacent warning or consent guidance.

Content

Scanner excerpt · references/data-portfolio-apis.md (reported line 46)May include surrounding context.

Request

bash
curl -s -X POST "https://api.g.alchemy.com/data/v1/$ALCHEMY_API_KEY/assets/tokens/by-address" \
  -H "Content-Type: application/json" \
  -d '{
    "addresses": [{

External Transmission

Medium
Category
Data Exfiltration
Confidence
88% confidence
Finding

This endpoint sends wallet addresses to an external API to retrieve token balances, which can reveal financial holdings even without metadata or prices. Because the skill is documentation for agent use, omission of privacy/consent warnings increases the chance of silent collection or analysis of third-party wallet data.

Content

Scanner excerpt · references/data-portfolio-apis.md (reported line 139)May include surrounding context.

Request

bash
curl -s -X POST "https://api.g.alchemy.com/data/v1/$ALCHEMY_API_KEY/assets/tokens/balances/by-address" \
  -H "Content-Type: application/json" \
  -d '{
    "addresses": [{

External Transmission

Medium
Category
Data Exfiltration
Confidence
88% confidence
Finding

This endpoint sends wallet addresses to an external API to retrieve token balances, which can reveal financial holdings even without metadata or prices. Because the skill is documentation for agent use, omission of privacy/consent warnings increases the chance of silent collection or analysis of third-party wallet data.

Content

Scanner excerpt · references/data-portfolio-apis.md (reported line 139)May include surrounding context.

Request

bash
curl -s -X POST "https://api.g.alchemy.com/data/v1/$ALCHEMY_API_KEY/assets/tokens/balances/by-address" \
  -H "Content-Type: application/json" \
  -d '{
    "addresses": [{

External Transmission

Medium
Category
Data Exfiltration
Confidence
90% confidence
Finding

This request transmits wallet addresses externally to enumerate owned NFTs, which can expose collecting behavior, identity-linked assets, and acquisition history. In context, wallet ownership data is sensitive and the example lacks warning that a third party receives and can correlate this information.

Content

Scanner excerpt · references/data-portfolio-apis.md (reported line 208)May include surrounding context.

Request

bash
curl -s -X POST "https://api.g.alchemy.com/data/v1/$ALCHEMY_API_KEY/assets/nfts/by-address" \
  -H "Content-Type: application/json" \
  -d '{
    "addresses": [{

External Transmission

Medium
Category
Data Exfiltration
Confidence
90% confidence
Finding

This request transmits wallet addresses externally to enumerate owned NFTs, which can expose collecting behavior, identity-linked assets, and acquisition history. In context, wallet ownership data is sensitive and the example lacks warning that a third party receives and can correlate this information.

Content

Scanner excerpt · references/data-portfolio-apis.md (reported line 208)May include surrounding context.

Request

bash
curl -s -X POST "https://api.g.alchemy.com/data/v1/$ALCHEMY_API_KEY/assets/nfts/by-address" \
  -H "Content-Type: application/json" \
  -d '{
    "addresses": [{

External Transmission

Medium
Category
Data Exfiltration
Confidence
89% confidence
Finding

This example sends wallet addresses to a third-party endpoint to derive NFT collection ownership, which can reveal user portfolio composition and behavioral patterns. The danger is amplified in agent usage because the action can occur automatically and at scale without the user appreciating the privacy implications.

Content

Scanner excerpt · references/data-portfolio-apis.md (reported line 289)May include surrounding context.

Request

bash
curl -s -X POST "https://api.g.alchemy.com/data/v1/$ALCHEMY_API_KEY/assets/nfts/contracts/by-address" \
  -H "Content-Type: application/json" \
  -d '{
    "addresses": [{

External Transmission

Medium
Category
Data Exfiltration
Confidence
89% confidence
Finding

This example sends wallet addresses to a third-party endpoint to derive NFT collection ownership, which can reveal user portfolio composition and behavioral patterns. The danger is amplified in agent usage because the action can occur automatically and at scale without the user appreciating the privacy implications.

Content

Scanner excerpt · references/data-portfolio-apis.md (reported line 289)May include surrounding context.

Request

bash
curl -s -X POST "https://api.g.alchemy.com/data/v1/$ALCHEMY_API_KEY/assets/nfts/contracts/by-address" \
  -H "Content-Type: application/json" \
  -d '{
    "addresses": [{

External Transmission

Medium
Category
Data Exfiltration
Confidence
94% confidence
Finding

This endpoint transmits wallet addresses to obtain transaction history, exposing detailed on-chain activity, counterparties, and timing information to a third party. Transaction history is especially sensitive because it can be used for profiling, deanonymization, and financial surveillance if queried without clear authorization.

Content

Scanner excerpt · references/data-portfolio-apis.md (reported line 379)May include surrounding context.

Request

bash
curl -s -X POST "https://api.g.alchemy.com/data/v1/$ALCHEMY_API_KEY/transactions/history/by-address" \
  -H "Content-Type: application/json" \
  -d '{
    "addresses": [{

External Transmission

Medium
Category
Data Exfiltration
Confidence
94% confidence
Finding

This endpoint transmits wallet addresses to obtain transaction history, exposing detailed on-chain activity, counterparties, and timing information to a third party. Transaction history is especially sensitive because it can be used for profiling, deanonymization, and financial surveillance if queried without clear authorization.

Content

Scanner excerpt · references/data-portfolio-apis.md (reported line 379)May include surrounding context.

Request

bash
curl -s -X POST "https://api.g.alchemy.com/data/v1/$ALCHEMY_API_KEY/transactions/history/by-address" \
  -H "Content-Type: application/json" \
  -d '{
    "addresses": [{

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 76)May include surrounding context.

md
Query current and historical token prices. REST endpoints (GET and POST).

**Base URL**: `https://api.g.alchemy.com/prices/v1/$ALCHEMY_API_KEY`

---

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 77)May include surrounding context.

md
Query current and historical token prices. REST endpoints (GET and POST).

**Base URL**: `https://api.g.alchemy.com/prices/v1/$ALCHEMY_API_KEY`

---

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 129)May include surrounding context.

md
Query current and historical token prices. REST endpoints (GET and POST).

**Base URL**: `https://api.g.alchemy.com/prices/v1/$ALCHEMY_API_KEY`

---

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 134)May include surrounding context.

md
Query current and historical token prices. REST endpoints (GET and POST).

**Base URL**: `https://api.g.alchemy.com/prices/v1/$ALCHEMY_API_KEY`

---

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 · references/data-portfolio-apis.md (reported line 20)May include surrounding context.

md
Query current and historical token prices. REST endpoints (GET and POST).

**Base URL**: `https://api.g.alchemy.com/prices/v1/$ALCHEMY_API_KEY`

---

Static analysis

No suspicious patterns detected.