T09 · Insecure Skill Coding Practices
- Location
scripts/src/cli.ts:1686- Finding
Element Authorization Token Disclosed Through Standard Output
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This skill is purpose-built for Element NFT drop management, but it uses wallet credentials and has raw commands that can make live remote or blockchain changes without an enforced confirmation gate.
Install only if you are comfortable using a dedicated low-risk wallet and reviewing every preview before execution. Avoid invoking the advanced utility commands directly, treat terminal output/logs as sensitive, and prefer a locked dependency install rather than on-demand unpinned npx execution.
scripts/src/cli.ts:1686Element Authorization Token Disclosed Through Standard Output
scripts/src/config.ts:6Recoverable Shared GraphQL Credentials Embedded in Source Code
If the underlying implementation performs low-level auth and direct collection-edit operations without the required user-facing preview/confirmation controls, the skill could mutate remote state unexpectedly while operating with a sensitive wallet credential. The danger is increased by the mismatch between reassuring user-facing rules and potentially less constrained backend behavior.
If the underlying implementation performs low-level auth and direct collection-edit operations without the required user-facing preview/confirmation controls, the skill could mutate remote state unexpectedly while operating with a sensitive wallet credential. The danger is increased by the mismatch between reassuring user-facing rules and potentially less constrained backend behavior.
If the underlying implementation performs low-level auth and direct collection-edit operations without the required user-facing preview/confirmation controls, the skill could mutate remote state unexpectedly while operating with a sensitive wallet credential. The danger is increased by the mismatch between reassuring user-facing rules and potentially less constrained backend behavior.
If the underlying implementation performs low-level auth and direct collection-edit operations without the required user-facing preview/confirmation controls, the skill could mutate remote state unexpectedly while operating with a sensitive wallet credential. The danger is increased by the mismatch between reassuring user-facing rules and potentially less constrained backend behavior.
If the underlying implementation performs low-level auth and direct collection-edit operations without the required user-facing preview/confirmation controls, the skill could mutate remote state unexpectedly while operating with a sensitive wallet credential. The danger is increased by the mismatch between reassuring user-facing rules and potentially less constrained backend behavior.
If the underlying implementation performs low-level auth and direct collection-edit operations without the required user-facing preview/confirmation controls, the skill could mutate remote state unexpectedly while operating with a sensitive wallet credential. The danger is increased by the mismatch between reassuring user-facing rules and potentially less constrained backend behavior.
If the underlying implementation performs low-level auth and direct collection-edit operations without the required user-facing preview/confirmation controls, the skill could mutate remote state unexpectedly while operating with a sensitive wallet credential. The danger is increased by the mismatch between reassuring user-facing rules and potentially less constrained backend behavior.
The CLI exposes multiple state-changing utility commands such as post-settings, post-design, upload-prereveal, upload-design, post-create-collection, and create-token that execute immediately without the explicit preview/confirmation gate required by the skill contract. In this skill context, those commands can mutate remote drop configuration, upload media, or trigger blockchain-related actions, so an agent or caller that invokes the raw CLI directly can bypass the safety invariant and cause unintended irreversible changes.
This workflow performs a state-changing blockchain action immediately by calling sendTransaction after obtaining the encoded transaction, with no built-in preview-only mode or confirmation gate in this function. In the skill context, the metadata explicitly requires every state-changing flow to show an execution preview first and wait for confirmation, so this code path can cause unintended token creation if invoked by an agent or tool chain without an external safeguard.
The skill explicitly requires a private-key environment variable and describes networked API/transaction behavior, but it does not declare any tool scope such as allowed tools or permissions. That omission weakens reviewability and least-privilege controls, making it harder to constrain environment and network access for a highly sensitive workflow.
Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.
General:
- Use `chainName`; do not ask users for chain IDs.
- Use `slug` as the main identifier for existing drops.
- Resolve backend identifiers internally.
- Do not ask for hidden backend IDs when `slug` is enough.
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.
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.
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.
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.
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.
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.
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.
The documentation states that the script may derive a wallet address from ELEMENT_WALLET_PRIVATE_KEY if walletAddress is omitted, but it does not prominently warn users that a private-key-backed identity may be used implicitly. In the context of a blockchain/NFT management skill, this is security-relevant because users may trigger wallet-associated operations under an unintended identity and underestimate the sensitivity of the environment variable.
The documentation instructs users to run npx tsx without pinning an exact package version, which can cause code to be fetched and executed from the registry at invocation time. In a skill that interacts with blockchain assets and may rely on wallet-related environment variables, this increases supply-chain risk because a compromised or unexpectedly updated package could execute arbitrary code in the user's environment.
The documentation instructs users to run npx tsx without pinning an exact package version, which can cause execution of whatever version npm resolves at runtime. If a malicious or compromised package version is published or dependency resolution is influenced, this can lead to unintended code execution on the operator's machine.
The file describes a state-changing update-drop command that can automatically continue into a publish flow when live settings or prereveal data are changed, yet the execute section presents the live command without an explicit hard stop requiring prior preview review and user confirmation. In a skill that modifies NFT drop configuration and may trigger onchain-affecting publication, this omission materially increases the chance of unintended live changes, financial loss, or irreversible release of incorrect metadata or sale settings.
This code reads a local image file, packages its bytes into multipart form data, and sends it via HTTP POST to input.url. Although the code logs failed responses, there is no confirmation prompt or user-facing disclosure in this file that local file contents will be uploaded to an external service.
The error logger records the full request URL and a recursively summarized response body to stderr, with only length truncation and no redaction of secrets or sensitive business data. In a skill that handles NFT drop configuration, external APIs may return presigned URLs, auth-related metadata, wallet-linked information, or unpublished drop details, which could then be exposed in logs accessible to operators or downstream log systems.
The postJson helper accepts arbitrary input and sends it over the network via fetch after JSON serialization. In this file there is no visible warning, confirmation, or explanatory comment indicating that caller-provided data will be transmitted externally, which matters for a reusable HTTP utility that may handle sensitive user or system data.