Back to skill

Security audit

AI Content Generator Pro

Security checks for vulnerabilities and agentic risk

Overview

The skill matches a content-generation purpose, but it needs Review because it can expose API keys, read or write arbitrary local files, and asks for unused exec and web permissions.

Review before installing. Do not store real API keys in this skill's config until secrets are redacted or moved to a secret manager, avoid running optimize/analyze/export on sensitive paths, and grant only the permissions actually needed. Treat generated HTML exports as unsafe unless content is escaped or sanitized.

Vulnerability Patterns
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • 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
index.js:155
Finding

Unrestricted Local File Read and Derived-Path Write

Content
View full analysis
\nOptimizes existing content for SEO and readability.'; } if (!fs.existsSync(filepath)) { return `File not found: ${filepath}`; } const content = fs.readFileSync(filepath, 'utf8'); const config = loadConfig(); const optimized = await optimizeContent(content, config); const newPath = filepath.replace(/\.(\w+)$/, '-optimized.$1'); fs.writeFileSync(newPath, optimized); return `✅ Content optimized!\n📁 Saved to: ${newPath}\n\nKey improvements:\n- SEO score increased\n- Readability enhanced\n- Tone adjusted to ${config.tone}`; } ``` The same unrestricted path behavior is present in the analysis and export handlers: ```js const filepath = args[0]; if (!fs.existsSync(filepath)) { return `File not found: ${filepath}`; } const content = fs.readFileSync(filepath, 'utf8'); ``` ```js const filepath = args[1]; if (!fs.existsSync(filepath)) { return `File not found: ${filepath}`; } const content = fs.readFileSync(filepath, 'utf8'); const exported = await exportContent(content, format); const ext = format === 'html' ? 'html' : format === 'pdf' ? 'pdf' : format === 'docx' ? 'docx' : 'md'; const newPath = filepath.replace(/\.\w+$/, `.${ext}`); fs.writeFileSync(newPath, exported); ``` ### Technical Analysis The `optimize`, `analyze`, and `export` commands accept a caller-controlled path and pass it directly to `fs.existsSync`, `fs.readFileSync`, and, in some cases, `fs.writeFileSync`. The path is not canonicalized, restricted to the Skill's content directory, checked for symbolic links, or validated against an allowli ...[truncated 1899 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
index.js:290
Finding

Plaintext API-Key Storage and Unredacted Credential Disclosure

Content
View full analysis
\nExample: content config set tone casual'; } const config = loadConfig(); const keys = key.split('.'); let current = config; for (let i = 0; i < keys.length - 1; i++) { if (!current[keys[i]]) current[keys[i]] = {}; current = current[keys[i]]; } current[keys[keys.length - 1]] = value; const configPath = path.join(CONFIG_DIR, 'config.json'); fs.writeFileSync(configPath, JSON.stringify(config, null, 2)); return `✅ Configuration updated: ${key} = ${value}`; } else if (action === 'show') { const config = loadConfig(); return `Current configuration:\n\`\`\`json\n${JSON.stringify(config, null, 2)}\n\`\`\``; } else { return 'Usage: content config \nManage skill configuration.'; } } ``` The configuration schema explicitly stores API keys in the JSON document: ```json { "openai": { "apiKey": "", "model": "gpt-4" }, "anthropic": { "apiKey": "", "model": "claude-3-opus" }, "xai": { "apiKey": "", "model": "grok-beta" } } ``` ### Technical Analysis The configuration command accepts secret values through command arguments and persists the entire configuration as plaintext JSON. No restrictive file mode is specified, and no secret manager or environment-based credential provider is used. The update response also echoes the complete supplied value: ```js return `✅ Configuration updated: ${key} = ${value}`; ``` Furt ...[truncated 1545 chars]
Remediation
View remediation

T05 · Unauthorized Access and Privilege Escalation

Warning
Location
package.json:45
Finding

Declared Execution and Network Permissions Exceed Current Functional Requirements

Content
View full analysis
=1.5.0", "permissions": [ "read", "write", "exec", "web_search", "web_fetch" ], ``` The implementation also initializes command-execution functionality even though it is never used: ```js import { exec } from 'child_process'; import { promisify } from 'util'; import fs from 'fs'; import path from 'path'; import { fileURLToPath } from 'url'; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); const execAsync = promisify(exec); ``` ### Technical Analysis The current implementation performs simulated content generation and local filesystem operations. It does not execute shell commands, perform web searches, fetch web content, or call the advertised AI APIs. Despite this, the Skill requests `exec`, `web_search`, and `web_fetch`. These capabilities are not necessary for its present behavior and broaden the authority granted at installation or runtime. The unused `child_process.exec` wrapper further creates an unnecessary command-execution primitive that could become reachable through a future coding mistake or compromised update. This finding concerns excessive capability exposure rather than a confirmed current command-injection or exfiltration path. ### Attack Path 1. A user installs or enables the Skill and grants all declared permissions. 2. The Skill receives command-execution and network capabilities that its current implementation does not require. 3. A later vulnerable code path, dependency compromise, malicious update, or prompt-driven integration error reaches one of these capabilities. 4. The unnecessary permissions allow shell execution or outbound network ...[truncated 650 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
index.js:272
Finding

Untrusted Content Is Exported to HTML Without Escaping or Sanitization

Content
View full analysis

Exported Content

${content.replace(/\n/g, '
')}
`; case 'pdf': return `%PDF-1.4\n1 0 obj\n<< /Type /Catalog /Pages 2 0 R >>\nendobj\n2 0 obj\n<< /Type /Pages /Kids [3 0 R] /Count 1 >>\nendobj\n3 0 obj\n<< /Type /Page /Parent 2 0 R /MediaBox [0 0 612 792] /Contents 4 0 R >>\nendobj\n4 0 obj\n<< /Length 44 >>\nstream\nBT\n/F1 12 Tf\n72 720 Td\n(${content.substring(0, 50)}...) Tj\nET\nendstream\nendobj\nxref\n0 5\n0000000000 65535 f\n0000000010 00000 n\n0000000053 00000 n\n0000000106 00000 n\n0000000176 00000 n\ntrailer\n<< /Size 5 /Root 1 0 R >>\nstartxref\n246\n%%EOF\n\n*Simulated PDF - full version generates actual PDF files.*`; ``` ### Technical Analysis The HTML export branch inserts source content directly inside a `
` and only replaces newline characters with `
`. It does not encode HTML metacharacters and does not sanitize active elements or attributes. An input file containing elements such as `
Remediation
View remediation
`, `"`, and `'` when the desired output is plain text. 3. If Markdown rendering is intended, use a maintained Markdown parser with raw HTML disabled. 4. Sanitize rendered HTML using a maintained allowlist-based sanitizer before writing the result. 5. Disallow script elements, event-handler attributes, dangerous URL schemes, embedded frames, and unsafe SVG or MathML content. 6. Add a restrictive Content Security Policy to exported documents as defense in depth, while not treating CSP as a replacement for sanitization. 7. Add regression tests using script elements, image error handlers, `javascript:` links, iframes, and malicious SVG payloads. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Rogue AgentSelf-Modification, Session Persistence
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
Findings (35)

Missing User Warnings

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

The statement 'Your content stays private on your machine' conflicts with the product's own description of generating content through external AI APIs. This is dangerous because it creates a false sense of privacy and may cause users to submit confidential content, believing no third-party transmission occurs, when in fact prompts and content may be sent off-device.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

The config show command returns the full JSON configuration, including stored API keys such as openai.apiKey and anthropic.apiKey, directly to the caller. In an agent/skill context, command output may be exposed to logs, other tools, chat transcripts, or untrusted users, making credential disclosure highly likely and enabling downstream abuse of paid AI accounts or related services.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: js-yaml==3.14.2 — 4 advisory(ies): CVE-2026-84375 (js-yaml: maxTotalMergeKeys does not limit CPU use for empty merge sources); CVE-2026-59869 (js-yaml: YAML merge-key chains can force quadratic CPU consumption); GHSA-5p4m-2wfm-xmqj (JS-YAML: Quadratic CPU consumption in !!omap resolution (3.x and 4.x) — CVE-2026) +1 more

High
Category
Supply Chain
Confidence
88% confidence
Finding

js-yaml 3.14.2 is a known vulnerable parser version, and parser bugs causing quadratic CPU consumption can be exploited with crafted YAML inputs to trigger denial of service. Even though this instance is nested under dev tooling, dependency-processing and test/config parsing pipelines often ingest external or semi-trusted files, so keeping a vulnerable parser increases risk.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: brace-expansion==1.1.12 — 4 advisory(ies): CVE-2026-13149 (brace-expansion: DoS via exponential-time expansion of consecutive non-expanding); CVE-2026-33750 (brace-expansion: Zero-step sequence causes process hang and memory exhaustion); CVE-2026-14257 (brace-expansion: DoS via unbounded expansion length causing an out-of-memory pro) +1 more

High
Category
Supply Chain
Confidence
85% confidence
Finding

brace-expansion 1.1.12 has known denial-of-service issues from pathological expansion patterns, and it is commonly reached through globbing/matching libraries. While present transitively in dev/tooling paths, malicious repository content, crafted patterns, or CI inputs can potentially trigger excessive CPU or memory consumption.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: browserslist==4.28.1 — 2 advisory(ies): CVE-2026-73088 (Browserslist: Uncaught crash / prototype write via untrusted browserslist-stats.); CVE-2026-73089 (Browserslist: Unbounded memory growth (no cache eviction) via distinct query res)

High
Category
Supply Chain
Confidence
80% confidence
Finding

browserslist 4.28.1 is flagged for crash/prototype-write and memory-growth issues when processing untrusted stats or crafted query inputs. Although this is most likely a build/dev dependency, many CI and automation paths consume project-controlled or externally supplied configuration, making denial-of-service or corrupted processing plausible.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: flatted==3.4.1 — 1 advisory(ies): CVE-2026-33228 (Prototype Pollution via parse() in NodeJS flatted)

High
Category
Supply Chain
Confidence
80% confidence
Finding

Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: form-data==4.0.5 — 1 advisory(ies): CVE-2026-12143 (form-data: CRLF injection in form-data via unescaped multipart field names and f)

High
Category
Supply Chain
Confidence
80% confidence
Finding

Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

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 · references/api-docs.md (reported line 333)May include surrounding context.

md
### Updates
1. Backup configuration
2. Update skill files
3. Run migration scripts if needed
4. Verify functionality

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The listing advertises use of external AI models and tells users to provide their own API keys, but it does not clearly warn that prompts, source content, or other user data will be transmitted to third-party providers. This can mislead users into sharing sensitive business, customer, or proprietary content under the assumption that processing is local/private.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The skill explicitly integrates with third-party AI providers and instructs users to configure API keys, but it does not warn that prompts, uploaded content, or generated workflows may transmit user data to external services. In a content-generation skill, users are likely to submit drafts, marketing plans, client materials, or other sensitive business content, so the omission creates a meaningful privacy and data-handling risk.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The brand voice training feature implies ingesting existing content to learn style, but it provides no warning that such source material may contain proprietary, client-confidential, or copyrighted information. Because this skill is designed for marketers, agencies, and businesses, the feature context makes accidental exposure of sensitive materials to external AI services or local storage more likely and therefore more dangerous.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The help text advertises "Multi-model AI support (OpenAI, Claude, Grok)", which implies actual integration with those providers. However, the core implementation explicitly states it is a prototype and only returns hardcoded simulated responses rather than invoking any AI service.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The documentation explicitly describes sending user content to third-party AI providers and storing generated content locally, but it does not prominently warn users about privacy, retention, or data handling implications. In a content-generation skill, users may submit sensitive business or personal text, so omission of an explicit warning can lead to unintended disclosure or storage of sensitive data.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The script writes config/config.json automatically when the file is missing, which changes repository state and may overwrite a user's intended setup path without an interactive confirmation step. Although it only creates the file when absent and uses placeholder credentials, silent config creation can mislead users, interfere with existing workflows, or normalize unsafe handling of secrets in local config files.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The script unconditionally removes the test-output directory with rm -rf and no confirmation, which can destroy local data if the directory contains unexpected or user-valued files. In this script the target is a fixed relative path, so the risk is limited, but recursive deletion without safeguards is still unsafe shell practice.

Content

No source excerpt is available for this finding.

Scope Creep

Low
Category
Excessive Agency
Confidence
75% confidence
Finding

Skill's behavior or capabilities extend beyond its stated purpose. Scope creep allows an agent to perform actions unrelated to its documented functionality, increasing the attack surface.

Content

Scanner excerpt · CLAWHUB_LISTING.md (reported line 146)May include surrounding context.

md
**A:** Yes! 30 days of email support included. Community support via OpenClaw Discord.

### ❓ Can I customize the skill?
**A:** Yes! The skill is open for modification. Advanced users can extend functionality using our API documentation.

## Technical Requirements

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
83% confidence
Finding

The summary explicitly plans third-party API integrations and local SQLite storage but provides no user-facing disclosure about what data may be transmitted externally or retained locally. In a content-generation skill, users may submit proprietary business drafts, marketing plans, or customer-related text, so omission of privacy/storage warnings can lead to unintended data exposure and poor consent.

Content

No source excerpt is available for this finding.

Vague Triggers

Low
Category
Not specified by scanner
Confidence
83% confidence
Finding

This JSON manifest-style file identifies the package as "ai-content-generator-pro" and lists AI SDK dependencies, but provides no narrow invocation criteria, exclusions, or trigger constraints. For manifest files, that absence can contribute to overly broad or ambiguous skill activation when other tooling infers behavior from package metadata alone.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: @babel/core==7.29.0 — 1 advisory(ies): CVE-2026-49356 (@babel/core: Arbitrary File Read via sourceMappingURL Comment)

Low
Category
Supply Chain
Confidence
60% confidence
Finding

Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: @tootallnate/once==1.1.2 — 1 advisory(ies): CVE-2026-3449 (@tootallnate/once vulnerable to Incorrect Control Flow Scoping)

Low
Category
Supply Chain
Confidence
60% confidence
Finding

Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: baseline-browser-mapping==2.10.7 — 1 advisory(ies): CVE-2026-45819 (baseline-browser-mapping process termination on invalid input causes denial of s)

Low
Category
Supply Chain
Confidence
60% confidence
Finding

Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

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 29)May include surrounding context.

json
"author": "Jaceal LLC",
  "license": "Proprietary",
  "dependencies": {
    "openai": "^4.0.0",
    "@anthropic-ai/sdk": "^0.24.0",
    "date-fns": "^3.6.0",
    "marked": "^12.0.0",

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 30)May include surrounding context.

json
"license": "Proprietary",
  "dependencies": {
    "openai": "^4.0.0",
    "@anthropic-ai/sdk": "^0.24.0",
    "date-fns": "^3.6.0",
    "marked": "^12.0.0",
    "cheerio": "^1.0.0",

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 31)May include surrounding context.

json
"dependencies": {
    "openai": "^4.0.0",
    "@anthropic-ai/sdk": "^0.24.0",
    "date-fns": "^3.6.0",
    "marked": "^12.0.0",
    "cheerio": "^1.0.0",
    "sqlite3": "^5.1.6",

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 32)May include surrounding context.

json
"openai": "^4.0.0",
    "@anthropic-ai/sdk": "^0.24.0",
    "date-fns": "^3.6.0",
    "marked": "^12.0.0",
    "cheerio": "^1.0.0",
    "sqlite3": "^5.1.6",
    "yaml": "^2.3.0",

Static analysis

Detected: suspicious.obfuscated_code

Potential obfuscated payload detected.

Warn
Code
suspicious.obfuscated_code
Location
index.js:278