Back to skill

Security audit

GlueX

Security checks for vulnerabilities and agentic risk

Overview

This skill appears purpose-built for GlueX Devnet use, but it handles a local Solana signing key too broadly and uses a riskier Node install path for a transaction-capable tool.

Install only with an isolated, low-value Devnet-only wallet, preferably not your default Solana keypair. Review package-lock changes, avoid exposing funded wallets during npm install, and treat publish, claim, and approve commands as state-changing transactions even though the script targets Devnet.

Vulnerability Patterns
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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 (2)

T05 · Unauthorized Access and Privilege Escalation

Warning
Location
scripts/interact.ts:10
Finding
Unconditional Private-Key Loading for Read-Only Commands## Vulnerability Details **File Location**: `scripts/interact.ts:10-18` **Vulnerability Type**: Least-privilege violation involving sensitive signing material **Risk Level**: Medium ### Vulnerable Code ```ts // Load standard solana keypair const keypairPath = path.resolve(os.homedir(), '.config/solana/id.json'); let rawdata; try { rawdata = fs.readFileSync(keypairPath, 'utf-8'); } catch (e) { console.error("Could not find keypair at ~/.config/solana/id.json. Please generate one or configure your environment."); process.exit(1); } const keypair = Keypair.fromSecretKey(new Uint8Array(JSON.parse(rawdata))); ``` ### Technical Analysis The script reads and reconstructs the user's default Solana private key before determining which command will be executed. This behavior applies to transaction-producing commands, but it also applies to operations that do not legitimately require signing authority, including `listen-bounties`, help output, unknown commands, and malformed command invocations. Loading the private key unnecessarily places the secret in the Node.js process memory and exposes it to all code executing in the same process, including imported dependencies, debugging or instrumentation facilities, crash diagnostics, and any compromised runtime component. This violates the principle of least privilege. The code does not directly print or transmit the private key, so exploitation requires another component capable of reading process memory or executing within the Node.js process. ### Attack Path 1. A user invokes a read-only operation such as `npx ts-node interact.ts listen-bounties`. 2. Before dispatching the command, the script reads `~/.config/solana/id.json`. 3. The complete secret key is parsed and reconstructed as a `Keypair`. 4. The secret remains available in process memory for the lifetime of the listener. 5. A compromised dependency, injected debugger, malicious instrumentation hook, or o ...[truncated 785 chars]
Remediation
## Remediation Suggestions - Parse and validate the requested command before accessing any signing material. - Load the keypair only inside commands that actually produce signed transactions: `register-profile`, `publish-bounty`, `claim-bounty`, and `approve-bounty`. - Create a read-only `Connection` for `listen-bounties` rather than constructing an `AnchorProvider` backed by a private key. - Permit an explicit wallet path or secure wallet adapter instead of unconditionally using `~/.config/solana/id.json`. - Minimize key lifetime by constructing the signer immediately before signing and releasing references afterward. - Avoid including secret-containing objects in errors, debug output, telemetry, or crash reports. - Consider hardware-wallet or external signer support so private keys do not need to be loaded directly into the Node.js process.

T08 · Insecure Dependencies

Warning
Location
scripts/package-lock.json:20
Finding
Dependency Lockfile Uses a Third-Party Registry Mirror## Vulnerability Details **File Location**: `scripts/package-lock.json:20-31` **Vulnerability Type**: Unnecessary third-party software supply-chain trust **Risk Level**: Medium ### Vulnerable Code ```json "node_modules/@babel/runtime": { "version": "7.29.2", "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.29.2.tgz", "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==", "engines": { "node": ">=6.9.0" } }, "node_modules/@coral-xyz/anchor": { "version": "0.29.0", "resolved": "https://registry.npmmirror.com/@coral-xyz/anchor/-/anchor-0.29.0.tgz", "integrity": "sha512-eny6QNG0WOwqV0zQ7cs/b1tIuzZGmP7U7EcH+ogt4Gdbl8HDmIYVMh/9aTmYZPaFWjtUaI8qSn73uYEXWfATdA==", ``` The same third-party registry host is used throughout the lockfile. The audited lockfile also identifies dependencies with installation scripts at lines 393, 691, and 861. ### Technical Analysis The lockfile directs npm to retrieve dependency archives from `registry.npmmirror.com` instead of the official npm registry. This introduces an additional supply-chain trust boundary into the documented `npm install` process. The recorded SHA-512 integrity values provide meaningful protection against an archive being silently changed without a corresponding lockfile modification. They do not, however, eliminate risks arising from a malicious or improperly reviewed lockfile update, compromise of the environment where the lockfile is generated, or acceptance of altered dependency metadata and integrity values. This exposure is particularly relevant because the dependency tree contains native optional packages marked with `hasInstallScript: true`. Installation scripts execute with the privileges of the user running npm and can access user-owned files, including the Solana keypair used by this project. No evidence was found that the current locked packages are maliciou ...[truncated 1453 chars]
Remediation
## Remediation Suggestions - Regenerate the lockfile using the official npm registry at `https://registry.npmjs.org`. - Use `npm ci` in automated and production-like environments to enforce the reviewed lockfile. - Pin direct dependency versions rather than relying on broad caret ranges where reproducibility is important. - Review every lockfile change, particularly changes to `resolved`, `integrity`, dependency versions, and installation-script metadata. - Use `npm ci --ignore-scripts` where native installation scripts are not required. - If installation scripts are necessary, explicitly allow only reviewed packages and perform installation in a sandbox without wallet credentials. - Run dependency vulnerability and provenance checks as part of CI. - Ensure the package installation environment cannot access funded wallet files or other production credentials.
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Rogue AgentSelf-Modification, Session Persistence
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (24)

Known Vulnerable Dependency: ws==8.19.0 — 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
91% confidence
Finding
The lockfile includes ws 8.19.0 via rpc-websockets, and the cited advisories describe memory disclosure and memory exhaustion conditions in WebSocket handling. Because this skill interacts with Solana infrastructure and may keep network-facing WebSocket connections open to remote RPC endpoints, a vulnerable ws version increases exposure to malicious or compromised peers.

Known Vulnerable Dependency: toml==3.0.0 — 2 advisory(ies): CVE-2026-77465 (toml-node: Uncontrolled Recursion); CVE-2026-63376 (toml-node: Prototype Pollution Leads to `Object.prototype` Corruption via `__pro)

High
Category
Supply Chain
Confidence
90% confidence
Finding
toml 3.0.0 is used by anchor, and the cited issues include uncontrolled recursion and prototype pollution. In a CLI that may parse local configuration or IDL-related TOML files, maliciously crafted TOML from an untrusted repository or workspace could crash the process or corrupt object behavior in ways that affect subsequent logic.

Known Vulnerable Dependency: ws==7.5.10 — 1 advisory(ies): CVE-2026-48779 (ws: Memory exhaustion DoS from tiny fragments and data chunks)

High
Category
Supply Chain
Confidence
89% confidence
Finding
ws 7.5.10 is present transitively via jayson and is flagged for a memory exhaustion DoS issue. Since JSON-RPC/WebSocket communication is central to Solana tooling, a malicious endpoint or hostile traffic pattern could cause excessive memory consumption and make the CLI unstable or unavailable.

Lp3

Medium
Category
MCP Least Privilege
Confidence
94% confidence
Finding
The skill explicitly instructs use of network-capable tooling and real-time WebSocket listeners, but its manifest does not declare any tool scope such as permissions or allowed-tools. That omission weakens least-privilege controls and makes it harder for a hosting agent framework to constrain network access or alert operators to the skill's true capabilities.

Session Persistence

Medium
Category
Rogue Agent
Content
```

- **Security Requirement**: Autonomous Agents need a Solana Keypair funded with Devnet SOL to run transactions.
  - Create one: `solana-keygen new -o ~/.config/solana/id.json --no-bip39-passphrase`
  - Get Devnet SOL: `solana airdrop 2 ~/.config/solana/id.json --url devnet`
  - **Do not ask for or handle human users' private keys directly or save them to disk or plain text logs.**
Confidence
89% confidence
Finding
The skill instructs creation of a persistent Solana keypair at a standard filesystem path with `--no-bip39-passphrase`, which leaves sensitive credentials stored unencrypted on disk. Even though the example mentions Devnet, normalizing persistent plaintext key storage is risky for agents and can lead to wallet compromise if reused, copied, or accessed by other processes.

Rp1

Medium
Category
MCP Rug Pull
Confidence
91% confidence
Finding
Using `npx ts-node` without pinning versions makes execution depend on whatever package resolution is current in the environment, increasing supply-chain and reproducibility risk. A compromised or unexpected package version could execute arbitrary code when the skill is run.

Rp1

Medium
Category
MCP Rug Pull
Confidence
91% confidence
Finding
This command again relies on unpinned `npx ts-node`, which can pull or execute non-deterministic tooling from the local/npm environment. In a crypto-related skill that performs on-chain actions, that raises the risk of malicious code execution affecting wallet operations or transaction construction.

Rp1

Medium
Category
MCP Rug Pull
Confidence
91% confidence
Finding
The example publish command uses unpinned `npx ts-node`, preserving the same supply-chain exposure while also initiating a value-bearing blockchain action. If the resolved toolchain is malicious or altered, it could modify transaction details, exfiltrate secrets, or redirect funds.

Rp1

Medium
Category
MCP Rug Pull
Confidence
91% confidence
Finding
The listener command uses unpinned `npx ts-node`, exposing long-running background execution to dependency hijacking or environment drift. Because it is intended to run continuously and react to network events, compromise of the runtime could persistently monitor activity or trigger unauthorized follow-on actions.

Rp1

Medium
Category
MCP Rug Pull
Confidence
91% confidence
Finding
The claim-bounty command uses `npx ts-node` without version pinning, introducing supply-chain risk in a transaction-signing context. A malicious runtime or dependency could alter the bounty address, submit unintended transactions, or access locally stored key material.

Rp1

Medium
Category
MCP Rug Pull
Confidence
91% confidence
Finding
Approving and rewarding a bounty is a sensitive on-chain action, and invoking it through unpinned `npx ts-node` creates avoidable supply-chain exposure. In this context, compromise could lead to unauthorized approvals, misdirected payments, or secret theft from the execution environment.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The script automatically reads the user's default Solana private key from `~/.config/solana/id.json` on startup, without an explicit warning or consent gate. In a CLI skill that performs on-chain actions, this increases the chance that a user runs unreviewed code with a hot wallet, enabling unintended signing of transactions and exposing sensitive local credential usage in a high-trust path.

Description-Behavior Mismatch

Medium
Confidence
92% confidence
Finding
The manifest says this skill can register profiles, listen to bounties, claim tasks, approve rewards, and map social graph connections from the CLI. However, the advertised command list also includes `publish-bounty`, and the implementation creates on-chain bounties with funding parameters, which is a materially different operation from the stated description.

Missing User Warnings

Medium
Confidence
96% confidence
Finding
The CLI submits blockchain transactions that can create records and move funds with no explicit safety prompt, dry-run, or transaction summary. In this skill context, the danger is elevated because the same script auto-loads a local signing key, so a user can unintentionally authorize financial actions simply by invoking a command with incorrect or maliciously suggested parameters.

Rp1

Medium
Category
MCP Rug Pull
Confidence
70% confidence
Finding
npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.

Intent-Code Divergence

Low
Confidence
97% confidence
Finding
In the bounty listener, the code comment and log output imply it is showing the bounty title, but it decodes `bounty.description` and prints that value as `Title`. This is a direct contradiction between the user-facing intent expressed by the label and what the code actually displays.

Known Vulnerable Dependency: uuid==11.1.0 — 1 advisory(ies): CVE-2026-41907 (uuid: Missing buffer bounds check in v3/v5/v6 when buf is provided)

Low
Category
Supply Chain
Confidence
74% confidence
Finding
The lockfile includes uuid 11.1.0 under rpc-websockets, and the cited issue affects buffer-handling code paths in v3/v5/v6 when a caller provides a buf argument. This is a real supply-chain risk, but in this CLI context it appears transitive and likely not directly attacker-reachable unless the application or dependency invokes those specific APIs on untrusted input.

Known Vulnerable Dependency: stream-json==1.9.1 — 1 advisory(ies): CVE-2026-71429 (stream-json: pick/ignore/filter/replace filters are O(depth²) on nested input — )

Low
Category
Supply Chain
Confidence
68% confidence
Finding
stream-json 1.9.1 is present transitively via jayson, and the advisory describes O(depth²) behavior on deeply nested input for certain filters. This is a genuine denial-of-service style weakness, but its practical exploitability depends on whether this CLI processes attacker-controlled deeply nested JSON through the vulnerable filter paths.

Known Vulnerable Dependency: uuid==8.3.2 — 1 advisory(ies): CVE-2026-41907 (uuid: Missing buffer bounds check in v3/v5/v6 when buf is provided)

Low
Category
Supply Chain
Confidence
72% confidence
Finding
uuid 8.3.2 is also present transitively via jayson, and the advisory concerns missing bounds checks in specific versioned UUID generation functions when buf is supplied. This is a real vulnerable dependency, though likely lower-risk here because exploitation requires a specific API usage pattern that may not be exposed in normal CLI operations.

Unpinned Dependencies

Low
Category
Supply Chain
Content
"description": "Helper scripts for agents to use the GlueX protocol",
  "main": "interact.ts",
  "dependencies": {
    "@coral-xyz/anchor": "^0.29.0",
    "@solana/web3.js": "^1.89.0",
    "ts-node": "^10.9.2",
    "typescript": "^5.3.3"
Confidence
90% confidence
Finding
The dependency uses a caret range, which allows newer minor/patch releases to be installed over time. In a security-sensitive Solana interaction tool, this can introduce supply-chain risk or unexpected behavior changes if an upstream package ships a compromised or breaking release.

Unpinned Dependencies

Low
Category
Supply Chain
Content
"main": "interact.ts",
  "dependencies": {
    "@coral-xyz/anchor": "^0.29.0",
    "@solana/web3.js": "^1.89.0",
    "ts-node": "^10.9.2",
    "typescript": "^5.3.3"
  },
Confidence
90% confidence
Finding
The @solana/web3.js dependency is not pinned to an exact version, so installations may pull different upstream releases. Because this skill operates directly against Solana and may handle wallet interactions or transaction construction, dependency drift increases supply-chain and reliability risk.

Unpinned Dependencies

Low
Category
Supply Chain
Content
"dependencies": {
    "@coral-xyz/anchor": "^0.29.0",
    "@solana/web3.js": "^1.89.0",
    "ts-node": "^10.9.2",
    "typescript": "^5.3.3"
  },
  "devDependencies": {
Confidence
82% confidence
Finding
Using a ranged version for ts-node allows future releases to be installed implicitly, which can alter script execution behavior or introduce malicious upstream code. While this is primarily a tooling dependency, it still executes code in the local environment and therefore contributes to supply-chain exposure.

Unpinned Dependencies

Low
Category
Supply Chain
Content
"@coral-xyz/anchor": "^0.29.0",
    "@solana/web3.js": "^1.89.0",
    "ts-node": "^10.9.2",
    "typescript": "^5.3.3"
  },
  "devDependencies": {
    "@types/node": "^25.5.0"
Confidence
80% confidence
Finding
The typescript package is specified with a caret range, allowing silent upgrades that may change compilation output or tooling behavior. In an automation skill that may generate or execute blockchain-related scripts, non-deterministic toolchain versions can create hard-to-detect security and operational issues.

Unpinned Dependencies

Low
Category
Supply Chain
Content
"typescript": "^5.3.3"
  },
  "devDependencies": {
    "@types/node": "^25.5.0"
  }
}
Confidence
73% confidence
Finding
Although @types/node is a development dependency, leaving it unpinned still reduces build reproducibility and can cause unexpected type or build changes. This is less severe than runtime dependencies, but it contributes to overall supply-chain uncertainty.

Static analysis

No suspicious patterns detected.