Back to skill

Security audit

Cover Image

Security checks for vulnerabilities and agentic risk

Overview

This cover-image skill is mostly coherent, but it has review-worthy credential and local-file handling risks before installation.

Install only if you are comfortable giving this skill a WeryAI API key and letting it run local Node/Bun tooling. Prefer an environment variable over `--persist-api-key`, avoid shared or source-controlled project config directories, use only intentional reference images, and treat local reference paths as uploadable to WeryAI until the documentation and runtime are reconciled. A safer version would pin Bun/tooling and prevent bearer-token forwarding to untrusted result URLs.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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
Findings (4)

T09 · Insecure Skill Coding Practices

Error
Location
scripts/vendor/shared-image-generation/scripts/main.ts:194
Finding

Bearer Token Forwarded to an Untrusted Image Result URL

Content
View full analysis
Remediation
View remediation
= {}; if (trustedOrigins.has(parsed.origin)) { headers.Authorization = `Bearer ${getApiKey()}`; } const res = await fetch(parsed, { headers, redirect: "manual", signal: AbortSignal.timeout(DOWNLOAD_TIMEOUT_MS), }); ``` ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/vendor/shared-image-generation/scripts/setup.mjs:114
Finding

Persisted API Key Uses Default Filesystem Permissions

Content
View full analysis
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
package.json:13
Finding

Routine Commands Execute an Unpinned Registry Package Through npx

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/vendor/shared-image-generation/scripts/main.ts:304
Finding

Local Reference Files Are Uploaded Despite the Declared Public-URL-Only Boundary

Content
View full analysis
= referenceImages.length > 0 ? { ...baseBody, images: referenceImages.map(toImagePayloadValue) } : baseBody; const submit = await apiPost(pathSuffix, body); ``` This conflicts with the documented boundary in `SKILL.md:12-16` and `SKILL.md:30`, which states that local paths and `data:` URLs are rejected and that references must be public URLs. ### Technical Analysis Any `--ref` value that does not begin with `http://` or `https://` is resolved as a local path, read in full, encoded as a data URL, and sent to the WeryAI image-to-image endpoint. The implementation does not limit local access to a designated workspace, verify that the file is genuinely an image, or apply a file-size limit before reading it into memory. Unsupported extensions are labeled `application/octet-stream`, meaning arbitrary readable files can be transmitted if selected as a reference. The mismatch between documentation and runtime behavior is security-relevant in an Agent Skill: the Agent or user may rely on the stated guarantee that local paths are rejected and may invoke the runtime without realizing that local bytes will leave the system. The URL branch also accepts plaintext `http://` references, despite HTTPS being the safe transport requireme ...[truncated 1205 chars]
Remediation
View remediation
Vulnerability Patterns
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • System Prompt LeakageDirect Leakage, Indirect Extraction, Tool-Based Exfiltration
  • Rogue AgentSelf-Modification, Session Persistence
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (61)

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The skill openly instructs the agent to call an external API and use an API key, but it does not constrain network scope beyond prose mentioning WeryAI. If the underlying runtime supports configurable base URLs or generic client behavior as the finding suggests, that would enable broader outbound requests and possible secret misuse under a cover-image skill.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The skill openly instructs the agent to call an external API and use an API key, but it does not constrain network scope beyond prose mentioning WeryAI. If the underlying runtime supports configurable base URLs or generic client behavior as the finding suggests, that would enable broader outbound requests and possible secret misuse under a cover-image skill.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

The skill openly instructs the agent to call an external API and use an API key, but it does not constrain network scope beyond prose mentioning WeryAI. If the underlying runtime supports configurable base URLs or generic client behavior as the finding suggests, that would enable broader outbound requests and possible secret misuse under a cover-image skill.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The skill openly instructs the agent to call an external API and use an API key, but it does not constrain network scope beyond prose mentioning WeryAI. If the underlying runtime supports configurable base URLs or generic client behavior as the finding suggests, that would enable broader outbound requests and possible secret misuse under a cover-image skill.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

The skill openly instructs the agent to call an external API and use an API key, but it does not constrain network scope beyond prose mentioning WeryAI. If the underlying runtime supports configurable base URLs or generic client behavior as the finding suggests, that would enable broader outbound requests and possible secret misuse under a cover-image skill.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The skill openly instructs the agent to call an external API and use an API key, but it does not constrain network scope beyond prose mentioning WeryAI. If the underlying runtime supports configurable base URLs or generic client behavior as the finding suggests, that would enable broader outbound requests and possible secret misuse under a cover-image skill.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The skill openly instructs the agent to call an external API and use an API key, but it does not constrain network scope beyond prose mentioning WeryAI. If the underlying runtime supports configurable base URLs or generic client behavior as the finding suggests, that would enable broader outbound requests and possible secret misuse under a cover-image skill.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The skill openly instructs the agent to call an external API and use an API key, but it does not constrain network scope beyond prose mentioning WeryAI. If the underlying runtime supports configurable base URLs or generic client behavior as the finding suggests, that would enable broader outbound requests and possible secret misuse under a cover-image skill.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

The skill openly instructs the agent to call an external API and use an API key, but it does not constrain network scope beyond prose mentioning WeryAI. If the underlying runtime supports configurable base URLs or generic client behavior as the finding suggests, that would enable broader outbound requests and possible secret misuse under a cover-image skill.

Content

No source excerpt is available for this finding.

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
- `scripts/build-batch.ts`

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
- `scripts/build-batch.ts`

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
- `scripts/build-batch.ts`

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
| `./scripts/vendor/compression-runtime/scripts/main.ts` | Compress output for delivery |

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The script invokes npm install as a subprocess, which can execute dependency lifecycle scripts and fetch untrusted code from registries. In a skill whose stated purpose is generating cover images, this capability is not inherently necessary and makes the skill materially more dangerous because setup can lead to code execution on the host.

Content

No source excerpt is available for this finding.

Self-Modification

High
Category
Rogue Agent
Confidence
85% confidence
Finding

Skill modifies its own code, configuration, or behavior at runtime. Self-modification enables an agent to escalate privileges, disable safety constraints, or install persistent backdoors.

Content

Scanner excerpt · scripts/scaffold.ts (reported line 37)May include surrounding context.

ts
--mood <level>        Mood level (default: balanced)
  --aspect <ratio>      Aspect ratio (default: 16:9)
  --lang <code>         On-canvas text language when needed (default placeholder: en)
  --force               Overwrite existing files
  -h, --help            Show help`);
}

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · scripts/vendor/shared-image-generation/scripts/doctor.mjs (reported line 90)May include surrounding context.

js
const projectSkillDir = path.join(projectRoot, ".image-skills", skillNamespace);
  const homeSkillDir = homeRoot ? path.join(homeRoot, ".image-skills", skillNamespace) : null;

  const projectEnvPath = path.join(projectRoot, ".image-skills", skillNamespace, ".env");
  const projectEnvFile = pathExists(projectEnvPath);
  let apiKeyInProjectEnv = false;
  if (projectEnvFile) {

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · scripts/vendor/shared-image-generation/scripts/main.ts (reported line 403)May include surrounding context.

ts
const projectSkillDir = path.join(projectRoot, ".image-skills", skillNamespace);
  const homeSkillDir = homeRoot ? path.join(homeRoot, ".image-skills", skillNamespace) : null;

  const projectEnvPath = path.join(projectRoot, ".image-skills", skillNamespace, ".env");
  const projectEnvFile = pathExists(projectEnvPath);
  let apiKeyInProjectEnv = false;
  if (projectEnvFile) {

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · scripts/vendor/shared-image-generation/scripts/main.ts (reported line 476)May include surrounding context.

ts
const projectSkillDir = path.join(projectRoot, ".image-skills", skillNamespace);
  const homeSkillDir = homeRoot ? path.join(homeRoot, ".image-skills", skillNamespace) : null;

  const projectEnvPath = path.join(projectRoot, ".image-skills", skillNamespace, ".env");
  const projectEnvFile = pathExists(projectEnvPath);
  let apiKeyInProjectEnv = false;
  if (projectEnvFile) {

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · scripts/vendor/shared-image-generation/scripts/main.ts (reported line 477)May include surrounding context.

ts
const projectSkillDir = path.join(projectRoot, ".image-skills", skillNamespace);
  const homeSkillDir = homeRoot ? path.join(homeRoot, ".image-skills", skillNamespace) : null;

  const projectEnvPath = path.join(projectRoot, ".image-skills", skillNamespace, ".env");
  const projectEnvFile = pathExists(projectEnvPath);
  let apiKeyInProjectEnv = false;
  if (projectEnvFile) {

Direct Prompt Extraction

High
Category
System Prompt Leakage
Confidence
85% confidence
Finding

Skill contains instructions that could directly expose system prompts, internal rules, or hidden instructions to users or external parties.

Content

Scanner excerpt · scripts/vendor/shared-image-generation/scripts/main.ts (reported line 602)May include surrounding context.

ts
}

function applyStylePreset(prompt: string, style: StylePreset | null | undefined): string {
  if (!style) return prompt;
  return `${prompt.trim()}\n\nStyle preset (${style}): ${STYLE_PRESETS[style]}.`;
}

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · scripts/vendor/shared-image-generation/scripts/doctor.mjs (reported line 284)May include surrounding context.

js
-h, --help            Show help

What this does:
  1) Optionally writes IMAGE_GEN_API_KEY into the local skill .env
  2) Runs doctor (read-only)
  3) Ensures a MODELS.json exists (writes the bundled starter if missing)
  4) Initializes EXTEND.md with Nano Banana 2 if no default model exists yet

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · scripts/vendor/shared-image-generation/scripts/main.ts (reported line 577)May include surrounding context.

ts
-h, --help            Show help

What this does:
  1) Optionally writes IMAGE_GEN_API_KEY into the local skill .env
  2) Runs doctor (read-only)
  3) Ensures a MODELS.json exists (writes the bundled starter if missing)
  4) Initializes EXTEND.md with Nano Banana 2 if no default model exists yet

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · scripts/vendor/shared-image-generation/scripts/setup.mjs (reported line 33)May include surrounding context.

js
-h, --help            Show help

What this does:
  1) Optionally writes IMAGE_GEN_API_KEY into the local skill .env
  2) Runs doctor (read-only)
  3) Ensures a MODELS.json exists (writes the bundled starter if missing)
  4) Initializes EXTEND.md with Nano Banana 2 if no default model exists yet

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
95% confidence
Finding

The skill declares network access and use of an API key in metadata and instructions, but it does not define an explicit tool scope such as allowed-tools or permissions. That creates an authorization ambiguity where an agent may grant broader capabilities than intended, especially for network and secret-bearing operations.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
Confidence
91% confidence
Finding

The skill instructs persistence of the IMAGE_GEN_API_KEY to local project or home directories and mentions continuing the workflow after storing it on the user's behalf. Persisting secrets increases exposure through accidental commits, local compromise, overly broad file permissions, or reuse across sessions beyond the user's immediate intent.

Content

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

md
---
name: cover-image
description: Generate article cover images with structured dimensions and bundled generation tooling. Use when the user asks to create a cover image, article cover, blog header, newsletter hero image, or banner-style key visual.
metadata: { "pattern": ["generator", "pipeline"], "openclaw": { "emoji": "🖼️", "primaryEnv": "IMAGE_GEN_API_KEY", "requires": { "env": ["IMAGE_GEN_API_KEY"], "anyBins": ["bun", "npx"], "bins": ["node", "npm"] } } }
---