Back to skill

Security audit

AIOZ Storage Skill

Security checks for vulnerabilities and agentic risk

Overview

This skill performs the advertised AIOZ website deployment, but it handles passwords, seed phrases, root keys, and non-expiring grants in ways that can expose them.

Review before installing. Use this only if you are comfortable letting an agent handle AIOZ account credentials, bucket seed phrases, root ZKeys, grants, and S3 keys. Avoid pasting seed phrases into chat, avoid the /tmp config-file alternative, prefer short-lived grants if the platform supports them, review the upload folder before syncing, and revoke or rotate generated credentials after deployment where possible.

Vulnerability Patterns
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (3)

T09 · Insecure Skill Coding Practices

Error
Location
SKILL.md:28
Finding

Sensitive credentials are exposed through Agent conversations and command-line arguments

Content
View full analysis
","password":""}' ``` ``` `SKILL.md:153-158`: ```markdown Ask user for: 1. **Bucket name** — their bucket on aiozstorage.network 2. **12-word seed phrase** — BIP39 passphrase from bucket creation IMPORTANT: AIOZ Storage does NOT store passphrases. If lost, bucket access is lost forever. ``` `SKILL.md:187-213`: ```bash npx ts-node {baseDir}/grant-cli.ts \ --mode per-bucket \ --zkey "" \ --account "" \ --url w3s \ --duration 0 \ --bucket "" \ --passphrase "<12_WORD_SEED_PHRASE>" \ --permissions 1,2,3 \ --output json \ --quiet ``` ```bash npx ts-node {baseDir}/grant-cli.ts \ --mode per-bucket \ --zkey "" \ --account "" \ --url w3s \ --duration 0 \ --bucket "" \ --passphrase "<12_WORD_SEED_PHRASE>" \ --permissions 1,3 \ --output json \ --quiet ``` ### Technical Analysis The workflow tells the Agent to ask the user for an account password and a bucket seed phrase. It then interpolates the password into a `curl` command and passes the root ZKey and seed phrase as command-line arguments to `ts-node`. These values can consequently be retained in Agent conversation transcripts, shell command history, process-monitoring output, execution telemetry, diagnostic logs, or command audit records. Command-line arguments may also be visible to other processes or users where operating-system process inspectio ...[truncated 1516 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
SKILL.md:226
Finding

Root authorization material and seed phrases are written to predictable plaintext temporary files

Content
View full analysis
","accountId":"","url":"w3s","duration":0,"buckets":[{"name":"","passphrase":"","permissions":["1","2","3"]}]}' > /tmp/upload-grant-config.json npx ts-node {baseDir}/grant-cli.ts --config /tmp/upload-grant-config.json --output json --quiet echo '{"mode":"per-bucket","rootZKey":"","accountId":"","url":"w3s","duration":0,"buckets":[{"name":"","passphrase":"","permissions":["1","3"]}]}' > /tmp/website-grant-config.json npx ts-node {baseDir}/grant-cli.ts --config /tmp/website-grant-config.json --output json --quiet ``` ``` The CLI consumes the file in `grant-cli.ts:597-600`: ```typescript const configPath = getArg(args, "config"); if (configPath) { if (!fs.existsSync(configPath)) { console.error(`Config not found: ${configPath}`); process.exit(1); } config = JSON.parse(fs.readFileSync(configPath, "utf-8")); } ``` ### Technical Analysis The documented alternative stores the root ZKey and bucket passphrase in fixed files under the shared `/tmp` directory. The instructions do not establish a restrictive umask, set mode `0600`, perform exclusive file creation, verify ownership, reject symbolic links, or remove the files after use. Predictable temporary paths create two distinct risks: 1. The plaintext files may remain readable to unintended local principals or later processes, depending on the environment's default permissions. 2. An attacker able to manipulate the shared temporary directory may pre-create a symbolic link or otherwise race the file creation, potentially redirecting the shell's truncating write to another path writable by the victim. The shell commands themse ...[truncated 1417 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
grant-cli.ts:622
Finding

Non-expiring authorization grants and derived ZKeys are emitted to standard output

Content
View full analysis
" \ --account "" \ --url w3s \ --duration 0 \ --bucket "" \ --passphrase "<12_WORD_SEED_PHRASE>" \ --permissions 1,2,3 \ --output json \ --quiet ``` ```bash npx ts-node {baseDir}/grant-cli.ts \ --mode per-bucket \ --zkey "" \ --account "" \ --url w3s \ --duration 0 \ --bucket "" \ --passphrase "<12_WORD_SEED_PHRASE>" \ --permissions 1,3 \ --output json \ --quiet ``` `grant-cli.ts:622-641` emits the resulting credentials to standard output: ```typescript if (jsonOutput) { console.log(JSON.stringify({ grant: result.grant, zkey: result.zkey })); } else { if (!quiet) { console.log("\n" + "=".repeat(60)); console.log("GRANT:"); console.log("=".repeat(60)); } console.log(result.grant); if (!quiet) { console.log("=".repeat(60)); console.log("\nZKEY:"); console.log("=".repeat(60)); } else { console.log(result.zkey); } if (!quiet) { console.log(result.zkey); console.log("=".repeat(60)); console.log(`\nGrant: ${result.grant.length} chars | ZKey: ${result.zkey.length} chars`); } } ``` ### Technical Analysis A duration of zero is documented as “no expiry,” so both the upload grant and website grant remain valid without a time limit. The CLI then prints the generated grant and derived ZKey to standard output in both JSON and text modes. Standard output is frequently retained in Agent tool results, terminal capture, CI logs, automation logs, or observability systems. Because the values ...[truncated 1516 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (27)

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The stated purpose is website deployment, but the skill also performs privileged authentication, key derivation, grant creation, secret registration, and cloud credential issuance. This mismatch matters because users may consent to a simple content deployment workflow without realizing the skill will process root ZKeys, seed phrases, and access credentials with broader security implications.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The workflow instructs the user to provide a 12-word bucket seed phrase and later derives grants and credentials from it, but gives no strong warning about handling this recovery secret in chat or temporary files. A seed phrase is effectively account-grade secret material for bucket access, so exposure could enable unauthorized decryption/access and persistent compromise of stored content.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
91% confidence
Finding

The skill performs multiple network operations and handles sensitive authentication material, but it does not declare an explicit tool scope or allowed-tools policy. That increases the chance an agent may invoke broader network capabilities than a user expects, especially in a workflow that collects credentials, seed phrases, grants, and cloud access keys.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill asks the user to provide an account email and password directly in the agent workflow without an explicit warning about secret exposure in chat history, logs, or tool traces. In an agent setting, this is dangerous because credentials may be retained, echoed, mishandled, or sent to tools beyond the user's expectation.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
77% confidence
Finding

This login request transmits highly sensitive credentials to an external service. The transmission itself is expected for the workflow, but in an agent context it is still risky because user secrets are collected and sent programmatically, potentially exposing them through logs, prompts, or unauthorized execution paths.

Content

Scanner excerpt · SKILL.md (reported line 31)May include surrounding context.

Ask user for AIOZ Storage email and password.

bash
curl -s 'https://api.aiozstorage.network/api/v1/login' \
  -H 'accept: application/json' \
  -H 'content-type: application/json' \
  -H 'origin: https://aiozstorage.network' \

External Transmission

Medium
Category
Data Exfiltration
Confidence
77% confidence
Finding

This login request transmits highly sensitive credentials to an external service. The transmission itself is expected for the workflow, but in an agent context it is still risky because user secrets are collected and sent programmatically, potentially exposing them through logs, prompts, or unauthorized execution paths.

Content

Scanner excerpt · SKILL.md (reported line 31)May include surrounding context.

Ask user for AIOZ Storage email and password.

bash
curl -s 'https://api.aiozstorage.network/api/v1/login' \
  -H 'accept: application/json' \
  -H 'content-type: application/json' \
  -H 'origin: https://aiozstorage.network' \

External Transmission

Medium
Category
Data Exfiltration
Confidence
72% confidence
Finding

The skill sends an authenticated request to generate or retrieve a root ZKey from an external API. Although this is part of the intended service integration, it extends the workflow into sensitive cryptographic material handling, so unauthorized or unexpected execution could materially increase the risk of account or bucket compromise.

Content

Scanner excerpt · SKILL.md (reported line 159)May include surrounding context.

STEP 5: GET ROOT ZKEY

bash
curl -s 'https://api.aiozstorage.network/api/v1/zkeys' \
  -H 'accept: application/json' \
  -H 'content-type: application/json' \
  -H 'authorization: Bearer <BEARER_TOKEN>' \

External Transmission

Medium
Category
Data Exfiltration
Confidence
72% confidence
Finding

The skill sends an authenticated request to generate or retrieve a root ZKey from an external API. Although this is part of the intended service integration, it extends the workflow into sensitive cryptographic material handling, so unauthorized or unexpected execution could materially increase the risk of account or bucket compromise.

Content

Scanner excerpt · SKILL.md (reported line 159)May include surrounding context.

STEP 5: GET ROOT ZKEY

bash
curl -s 'https://api.aiozstorage.network/api/v1/zkeys' \
  -H 'accept: application/json' \
  -H 'content-type: application/json' \
  -H 'authorization: Bearer <BEARER_TOKEN>' \

Rp1

Medium
Category
MCP Rug Pull
Confidence
84% confidence
Finding

Using npx ts-node without pinning a version allows execution to depend on whatever package version is resolved in the environment at runtime. In a security-sensitive flow that processes root keys, grants, and bucket passphrases, an unexpected or malicious package version could alter behavior or leak secrets.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
84% confidence
Finding

This unpinned npx ts-node invocation has the same supply-chain risk as the earlier one: runtime package resolution can execute an unintended version. Because this command handles secret material for grant generation, compromise could expose passphrases or generated grants.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
84% confidence
Finding

The alternative config-file flow still relies on unpinned npx ts-node, preserving the same package-resolution risk. Since it also reads local JSON containing root keys, account IDs, and passphrases, any compromised runtime can directly access highly sensitive data.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
84% confidence
Finding

This second config-file invocation repeats the same unpinned dependency execution in a secret-bearing workflow. The combination of plaintext secret files and dynamic package resolution increases the blast radius of a supply-chain compromise.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
74% confidence
Finding

This request registers a grant and returns S3 access credentials from an external service. External transmission is especially sensitive here because the resulting access key and secret key can be used to access bucket contents, making any leakage or unintended invocation higher impact than a normal API call.

Content

Scanner excerpt · SKILL.md (reported line 256)May include surrounding context.

Use the upload grant (permissions 1,2,3):

bash
curl -s 'https://reg-api.aiozstorage.network/api/v1/access' \
  -H 'accept: application/json' \
  -H 'content-type: application/json' \
  -H 'authorization: Bearer <BEARER_TOKEN>' \

Cloud Storage Exfiltration

Medium
Category
Data Exfiltration
Confidence
69% confidence
Finding

The skill uploads a local project directory to cloud storage using generated S3 credentials. While this is aligned with the stated deployment purpose, cloud upload remains a data-exfiltration primitive in an agent environment because a mis-scoped path, malicious modification, or user confusion could cause unintended local files to be synced externally.

Content

Scanner excerpt · SKILL.md (reported line 275)May include surrounding context.

bash
AWS_ACCESS_KEY_ID="<ACCESS_KEY_ID>" \
AWS_SECRET_ACCESS_KEY="<SECRET_KEY>" \
aws s3 sync ./<project_folder>/ s3://<BUCKET_NAME>/ \
  --endpoint-url https://s3.aiozstorage.network \
  --region us-east-1

External Transmission

Medium
Category
Data Exfiltration
Confidence
68% confidence
Finding

The website creation call transmits a bearer token and a website grant to an external API. That is functionally necessary, but still security-relevant because the grant encodes authorization to bucket content and could be abused if exposed.

Content

Scanner excerpt · SKILL.md (reported line 291)May include surrounding context.

Use the website grant (permissions 1,3 — Read+List only):

bash
curl -s 'https://api.aiozstorage.app/api/v1/websites' \
  -H 'accept: application/json' \
  -H 'content-type: application/json' \
  -H 'authorization: Bearer <BEARER_TOKEN>' \

External Transmission

Medium
Category
Data Exfiltration
Confidence
68% confidence
Finding

The website creation call transmits a bearer token and a website grant to an external API. That is functionally necessary, but still security-relevant because the grant encodes authorization to bucket content and could be abused if exposed.

Content

Scanner excerpt · SKILL.md (reported line 291)May include surrounding context.

Use the website grant (permissions 1,3 — Read+List only):

bash
curl -s 'https://api.aiozstorage.app/api/v1/websites' \
  -H 'accept: application/json' \
  -H 'content-type: application/json' \
  -H 'authorization: Bearer <BEARER_TOKEN>' \

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.

Content

No source excerpt is available for this finding.

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.

Content

No source excerpt is available for this finding.

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.

Content

No source excerpt is available for this finding.

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.

Content

No source excerpt is available for this finding.

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.

Content

No source excerpt is available for this finding.

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.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The CLI explicitly instructs users to pass sensitive passphrases as command-line arguments. On many systems, command-line arguments are exposed via shell history, process listings, audit logs, and CI job output, allowing local users or log readers to recover secrets used to derive encryption keys and grants.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
88% confidence
Finding

The grant script invokes npx ts-node, which can resolve and execute packages from the registry if the local environment is missing or manipulated, creating a supply-chain risk at execution time. In a privileged "grant" workflow, this is more sensitive because any substituted tool would run arbitrary code with the operator's permissions.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Content

Scanner excerpt · package.json (reported line 10)May include surrounding context.

json
"grant": "npx ts-node grant-cli.ts"
    },
    "dependencies": {
        "argon2-browser": "^1.18.0"
    },
    "devDependencies": {
        "ts-node": "^10.9.2",

Static analysis

No suspicious patterns detected.