T09 · Insecure Skill Coding Practices
- Location
src/commands/pair.ts:40- Finding
Shell Command Injection Through WalletConnect QR File Opening
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This wallet skill appears purpose-aligned, but it handles wallet transactions and local session data with enough unsafe or under-scoped behavior that users should review it before installing.
Install only if you trust this publisher and are comfortable with an agent-accessible wallet bridge. Use a dedicated wallet with limited funds/allowances, review every wallet prompt, avoid --open until shell execution is fixed, prefer your own WalletConnect project ID, avoid debug logs unless necessary, and treat ~/.agent-wallet contents as sensitive.
src/commands/pair.ts:40Shell Command Injection Through WalletConnect QR File Opening
src/storage.ts:21Sensitive Wallet Session and Debug Data Stored Without Explicit Restrictive Permissions
Use of an undeclared local config file such as ~/.agent-wallet/lending-config.json introduces hidden configuration dependencies and can cause this skill to inherit RPC settings from another wallet-related component. In a transaction skill, that creates a meaningful trust-boundary issue: transactions or simulations may be routed through endpoints the user did not expect or approve.
Use of an undeclared local config file such as ~/.agent-wallet/lending-config.json introduces hidden configuration dependencies and can cause this skill to inherit RPC settings from another wallet-related component. In a transaction skill, that creates a meaningful trust-boundary issue: transactions or simulations may be routed through endpoints the user did not expect or approve.
Use of an undeclared local config file such as ~/.agent-wallet/lending-config.json introduces hidden configuration dependencies and can cause this skill to inherit RPC settings from another wallet-related component. In a transaction skill, that creates a meaningful trust-boundary issue: transactions or simulations may be routed through endpoints the user did not expect or approve.
Use of an undeclared local config file such as ~/.agent-wallet/lending-config.json introduces hidden configuration dependencies and can cause this skill to inherit RPC settings from another wallet-related component. In a transaction skill, that creates a meaningful trust-boundary issue: transactions or simulations may be routed through endpoints the user did not expect or approve.
Use of an undeclared local config file such as ~/.agent-wallet/lending-config.json introduces hidden configuration dependencies and can cause this skill to inherit RPC settings from another wallet-related component. In a transaction skill, that creates a meaningful trust-boundary issue: transactions or simulations may be routed through endpoints the user did not expect or approve.
Use of an undeclared local config file such as ~/.agent-wallet/lending-config.json introduces hidden configuration dependencies and can cause this skill to inherit RPC settings from another wallet-related component. In a transaction skill, that creates a meaningful trust-boundary issue: transactions or simulations may be routed through endpoints the user did not expect or approve.
Use of an undeclared local config file such as ~/.agent-wallet/lending-config.json introduces hidden configuration dependencies and can cause this skill to inherit RPC settings from another wallet-related component. In a transaction skill, that creates a meaningful trust-boundary issue: transactions or simulations may be routed through endpoints the user did not expect or approve.
Use of an undeclared local config file such as ~/.agent-wallet/lending-config.json introduces hidden configuration dependencies and can cause this skill to inherit RPC settings from another wallet-related component. In a transaction skill, that creates a meaningful trust-boundary issue: transactions or simulations may be routed through endpoints the user did not expect or approve.
Use of an undeclared local config file such as ~/.agent-wallet/lending-config.json introduces hidden configuration dependencies and can cause this skill to inherit RPC settings from another wallet-related component. In a transaction skill, that creates a meaningful trust-boundary issue: transactions or simulations may be routed through endpoints the user did not expect or approve.
Referenced artifact was not completely inspected
> **Agent quick check:** `node dist/cli/cli.bundle.mjs version`
Referenced artifact was not completely inspected
> **Agent quick check:** `node dist/cli/cli.bundle.mjs version`
Referenced artifact was not completely inspected
> **Agent quick check:** `node dist/cli/cli.bundle.mjs version`
Referenced artifact was not completely inspected
> **Agent quick check:** `node dist/cli/cli.bundle.mjs version`
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
import { resolve, dirname } from "path";
import { fileURLToPath } from "url";
export function loadLocalEnv() {
const envPath = resolve(dirname(fileURLToPath(import.meta.url)), "../../.env");
if (!existsSync(envPath))
return;
const content = readFileSync(envPath, "utf8");
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
import { resolve, dirname } from "path";
import { fileURLToPath } from "url";
export function loadLocalEnv() {
const envPath = resolve(dirname(fileURLToPath(import.meta.url)), "../../.env");
if (!existsSync(envPath))
return;
const content = readFileSync(envPath, "utf8");
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
import { resolve, dirname } from "path";
import { fileURLToPath } from "url";
export function loadLocalEnv() {
const envPath = resolve(dirname(fileURLToPath(import.meta.url)), "../../.env");
if (!existsSync(envPath))
return;
const content = readFileSync(envPath, "utf8");
The file comment and the actual signed content are inconsistent: the comment describes wallet verification, but the message asks the user to authorize transaction requests. This mismatch is dangerous because it can mislead reviewers, integrators, and users about the real security semantics of the flow, especially in a wallet-connect skill whose core purpose includes signing and contract-call operations.
The lockfile includes defu 6.1.4, which is reported vulnerable to prototype pollution via a proto key in merge/default arguments. In this skill's dependency graph it is pulled in transitively through h3/unstorage, and while package-lock.json alone does not prove a reachable exploit path, WalletConnect-related tooling commonly processes external metadata and configuration objects, so retaining a polluted merge primitive is a real risk if attacker-controlled objects reach it.
h3 1.15.5 is present transitively via unstorage and is associated with multiple server-side issues including SSE injection and path traversal-related flaws. Although this skill is primarily a wallet-connect/signing integration and package-lock.json does not show direct h3 use, the dependency is real and could become reachable if any embedded storage or server helper paths are exposed, making this a legitimate supply-chain risk.
Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.
ws 8.18.3 is bundled through viem and is reported vulnerable to memory disclosure and memory-exhaustion denial of service. This skill's purpose involves WalletConnect and blockchain communication over WebSocket-capable stacks, so a ws vulnerability is contextually more dangerous because network-facing message handling is central to the skill's operation.
ws 7.5.10 is present via WalletConnect's jsonrpc WebSocket connection stack and is flagged for memory exhaustion DoS. Because WalletConnect inherently relies on WebSocket-based relay communication with externally influenced traffic, an attacker could potentially abuse fragmented frames or chunking behavior against a consumer using this dependency, making this a credible vulnerability in context.
The skill requests capabilities that inherently use environment variables and network access, but the manifest does not declare any explicit tool scope or permissions boundary. In a wallet/transaction skill, missing scope declaration weakens reviewability and least-privilege enforcement, making it easier for the agent to perform networked actions or read configuration without clear authorization expectations.
The instruction to execute setup commands directly, automatically fix dependencies/environment, and not ask the user to run shell commands promotes autonomous system modification. In a wallet-connected skill, that increases risk because package installation, rebuilds, and environment changes can introduce unreviewed code execution or alter transaction-handling behavior before the user understands what happened.
## Agent Execution Policy
- Execute CLI/setup commands directly as the agent; do not ask the user to run shell commands.
- If dependencies/build/env are missing, fix them automatically in the workspace.
- Before any signing or on-chain write action, explain the action and get user consent.
- Do not output raw JSON/internal payloads to users by default; present concise human-readable summaries.
The documentation exposes a concrete WalletConnect project ID and says a default is already included in .env, but it does not warn about credential lifecycle, abuse, rotation, or visibility. Even if a WalletConnect project ID is not a high-value secret like a private key, embedding reusable service identifiers encourages hardcoding and can lead to unauthorized use, quota exhaustion, or tracing of activity through a shared project.