Back to skill

Security audit

Readdy.ai WebSite Builder

Security checks for vulnerabilities and agentic risk

Overview

This Readdy website-management skill is mostly coherent, but it handles an account API key and can publish or delete remote projects with some weak safeguards.

Review before installing. Use this only if you want an agent to manage your Readdy.ai projects. Treat publish and delete as high-impact actions, confirm the exact project and version, and avoid putting secrets in website prompts. Be aware that the setup command can leave the API key in shell history or process logs, and that Readdy project history may store and reuse prior prompts and generated event data.

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 (1)

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/readdy.mjs:1428
Finding

API Key Exposure Through Command-Line Arguments

Content
View full analysis

Vulnerability Details

File Location: scripts/readdy.mjs:1428-1457
Related Documentation: SKILL.md:27-33, 88
Vulnerability Type: Sensitive information exposure through process arguments
Risk Level: Medium

Vulnerable Code

js
function configCommand(opts) {
  if (opts.apiKey) {
    saveApiKey(opts.apiKey);
    info(`apiKey saved → ${CREDENTIALS_FILE}`);
  } else {
    const key = loadApiKey();
    if (key) {
      info(`apiKey: ${key.slice(0, 8)}***  ← ${CREDENTIALS_FILE}`);
    } else {
      die('API Key not configured. Run: node readdy.mjs config --apiKey <your-key>');
    }
  }
}

function parseArgs(argv) {
  const args = argv.slice(2);
  const command = args[0];
  const opts = {};
  for (let i = 1; i &lt; args.length; i++) {
    if (args[i].startsWith('--')) {
      const key = args[i].slice(2);
      const next = args[i + 1];
      if (next &amp;&amp; !next.startsWith('--')) {
        opts[key] = next;
        i++;
      } else {
        opts[key] = true;
      }
    }
  }
  return { command, opts };
}

The documented invocation is:

bash
node &lt;SCRIPT&gt; config --apiKey &lt;your-key&gt;

Technical Analysis

The configuration interface requires the Readdy API key to be supplied as a command-line argument and retrieves it from process.argv. Secrets passed this way may be:

  • Recorded in shell history.
  • Visible in process listings while the command is running.
  • Collected by process-monitoring, auditing, or telemetry software.
  • Retained in terminal logs or automation execution records.

The key is subsequently saved to a credentials file with mode 0600, which appropriately restricts the stored file on supported systems. However, those permissions do not protect the secret during command invocation or remove copies retained by the shell or monitoring infrastructure.

Sending the key to `https://readdy.ai/api ...[truncated 1552 chars]

Remediation
View remediation

Remediation Suggestions

  1. Replace command-line secret entry with hidden interactive input that disables terminal echo.
  2. Support reading the key from standard input or a dedicated file descriptor so it does not appear in process.argv.
  3. If automation support is required, accept a path to a protected credentials file rather than accepting the key value directly.
  4. Avoid recommending environment variables as the only alternative because they can also leak through diagnostics, child processes, and deployment metadata.
  5. Update SKILL.md, usage output, and error messages to remove examples that place the key directly on the command line.
  6. Warn existing users that keys configured through the current workflow may remain in shell history and recommend deleting relevant history entries and rotating exposed keys.
  7. Continue storing the credentials file with restrictive permissions, and explicitly apply or verify 0600 after writes to protect pre-existing files consistently.
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Rogue AgentSelf-Modification, Session Persistence
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (15)

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
Requires a Readdy API Key. Run: node scripts/readdy.mjs config --apiKey <your-key> to configure.

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
Requires a Readdy API Key. Run: node scripts/readdy.mjs config --apiKey <your-key> to configure.

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
Requires a Readdy API Key. Run: node scripts/readdy.mjs config --apiKey <your-key> to configure.

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
KILL.md. Derive the absolute path from this SKILL.md's `fullPath` by replacing `SKILL.md` with `scripts/readdy.mjs`.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
93% confidence
Finding

The skill invokes a Node script that performs networked project-management actions against Readdy.ai, but the manifest does not declare a restrictive tool scope such as explicit permissions or allowed-tools. That weakens policy enforcement and increases the chance the skill can be activated with capabilities broader than users or the platform expect.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
Confidence
60% confidence
Finding

Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Content

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

md
---
name: readdy
description: >-
  This skill should be used when the user asks to "create a website",
  "generate a website", "build a website", "modify a website",
  "update my Readdy project", "preview my website", "delete a project", "list my projects"
  or mentions Readdy.ai project management. Provides CLI-based website

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The activation language is broad enough to match generic requests like 'create a website' or 'build a website,' which can cause this skill to trigger in many unrelated contexts. Because the skill can create, modify, publish, and delete remote projects, over-broad routing raises the risk of unintended high-impact actions being proposed or executed under the wrong user intent.

Content

No source excerpt is available for this finding.

Skill Enumeration

Medium
Category
Agent Snooping
Confidence
80% confidence
Finding

Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.

Content

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

md
`readdy.mjs` is located in the `scripts/` subdirectory relative to this SKILL.md. Derive the absolute path from this SKILL.md's `fullPath` by replacing `SKILL.md` with `scripts/readdy.mjs`.

Example: If SKILL.md path is `/Users/me/.claude/skills/readdy/SKILL.md`, then the script path is `/Users/me/.claude/skills/readdy/scripts/readdy.mjs`.

`<SCRIPT>` in this document refers to that absolute path.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The command reference lists publish operations without clearly warning that publishing changes a live website state visible to others. In a skill that manages production website deployments, omission of that warning can lead to accidental release of unreviewed or incorrect content, making the context more dangerous than a normal read-only CLI skill.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The function writes an API key to a persistent file in the user's home directory, which is a safety-relevant credential storage operation. Although the file comment describes local read/write behavior, there is no user-facing prompt, log message, or explicit warning in this code about saving sensitive credentials to disk.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The create flow hard-codes browser.language to 'zh-CN' and a default timezone, causing requests to misrepresent the user's locale without consent. While not directly leading to code execution or account compromise, it can affect generated content, data handling expectations, and user privacy by overriding contextual preferences.

Content

No source excerpt is available for this finding.

Ssd 3

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The skill stores user prompts and AI event data in persistent project message records, then later relies on those records for subsequent operations. This creates a durable transcript that may contain sensitive user input, generated content, internal tool outputs, or metadata, expanding exposure if project history is later accessed, shared, or reused unexpectedly.

Content

No source excerpt is available for this finding.

Ssd 3

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The modification flow reconstructs prior user/AI conversation history from stored messages and sends it back as plain-language history in new generate requests. This broad replay of prior context can leak sensitive earlier prompts or tool-derived data into later requests beyond the user's immediate intent, increasing privacy and data-minimization risk.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The modify flow also forces browser.language to 'zh-CN' and a preset timezone rather than using user-selected settings. This can cause unintended behavior, inconsistent outputs, and unnecessary disclosure or falsification of contextual metadata in downstream API requests.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The delete command immediately issues a DELETE request for the specified project with no confirmation prompt, dry-run, or explicit warning. In an agent skill context, this increases the chance of accidental or prompt-induced destructive actions, especially when a user request is ambiguous or manipulated.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.