Back to skill

Security audit

LinkedIn Post Generator

Security checks for vulnerabilities and agentic risk

Overview

The skill is a disclosed paid LinkedIn post generator, but it ships an embedded payment merchant key and has supply-chain and scoping issues that need Review before installation.

Install only if you are comfortable with a paid, networked skill that contacts SkillPay and a local OpenClaw/Sloan agent. The publisher should remove and rotate the embedded merchant key, add explicit billing confirmation or clearer first-run consent, pin reviewed install/dependency versions, regenerate the lockfile from HTTPS sources, and fix the current JavaScript syntax error before users rely on it.

Vulnerability Patterns
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • 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 (3)

T09 · Insecure Skill Coding Practices

Error
Location
index.js:11
Finding
Hardcoded Payment Merchant Credential Distributed in Source Code<![CDATA[ ## Vulnerability Details **File Location**: `index.js:11-18`, `index.js:147-159` **Vulnerability Type**: Hardcoded secret and insecure credential handling **Risk Level**: High ### Vulnerable Code ```javascript const CONFIG = { skillpay_api: 'https://api.skillpay.me/v1', merchant_key: process.env.SKILLPAY_MERCHANT_KEY || 'sk_91fff75ae2a7a71f8eceadcbcd816e24d57e58d9d04ccca45f0b3856af130aea', price_per_use: 0.002, currency: 'USDT', max_linkedin_length: 3000, default_tone: 'professional', sloan_agent_id: 'sloan' }; ``` The embedded credential is subsequently transmitted to the billing API: ```javascript async function processPayment() { try { const response = await axios.post(`${CONFIG.skillpay_api}/billing/charge`, { amount: CONFIG.price_per_use, currency: CONFIG.currency, merchant_key: CONFIG.merchant_key, description: 'LinkedIn post generation by Sloan' }, { headers: { 'Content-Type': 'application/json' }, timeout: 10000 }); ``` ### Technical Analysis The application contains a payment merchant key directly in distributed source code and uses it whenever `SKILLPAY_MERCHANT_KEY` is not configured. Source code and published packages are not appropriate secret-storage mechanisms because every user who downloads the package can retrieve the credential without executing the application. The key is used as an authorization-related value in requests to the SkillPay billing API. Its exact permissions cannot be determined from the repository, but any permissions granted to it become available to anyone who extracts it. HTTPS protects the key in transit but does not mitigate disclosure from the source package. Because the key has already been committed and distributed, removing it in a later release alone is insufficient; it must be treated as compromised and rotated. ### Attack Path 1. An attacker downloads or inspects the skill package. 2. The attacker reads `index.js` and e ...[truncated 913 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Immediately revoke and rotate the exposed merchant key. 2. Remove the embedded fallback credential from all source files, package releases, examples, and documentation. 3. Require `SKILLPAY_MERCHANT_KEY` to be supplied through protected runtime configuration and fail closed when it is absent: ```javascript const merchantKey = process.env.SKILLPAY_MERCHANT_KEY; if (!merchantKey) { throw new Error('SKILLPAY_MERCHANT_KEY is required'); } ``` 4. Prefer a server-side billing broker so merchant credentials are never distributed to untrusted client installations. 5. Use narrowly scoped, short-lived credentials where the payment provider supports them. 6. Add automated secret scanning to source-control and release pipelines. 7. Review provider logs for use of the disclosed key and investigate unexpected transactions. 8. Avoid placing credentials in command output, error messages, documentation, or client-side telemetry. ]]>

T01 · Skill Instruction Hijacking

Warning
Location
index.js:45
Finding
Agent Prompt Injection Through Untrusted Topic and Option Values<![CDATA[ ## Vulnerability Details **File Location**: `index.js:45-76`, `index.js:217-226` **Vulnerability Type**: Untrusted input incorporated into agent instructions **Risk Level**: Medium ### Vulnerable Code The topic and options are inserted directly into the agent prompt: ```javascript function buildPrompt(topic, options) { const { tone, type, includeEmoji, includeHashtags } = options; let prompt = `You are Sloan, a professional content creator specializing in LinkedIn posts. Generate a LinkedIn post about "${topic}".\n\n`; prompt += `Tone: ${tone}\n`; prompt += `Type: ${type}\n\n`; prompt += `Guidelines:\n`; prompt += `- Start with a strong hook (question, stat, or bold statement)\n`; prompt += `- Use short paragraphs (2-3 lines max)\n`; prompt += `- Include personal insights or lessons learned\n`; prompt += `- End with a call-to-action or question\n`; if (includeEmoji) { prompt += `- Use emojis sparingly and professionally\n`; } if (includeHashtags) { prompt += `- Include 3-5 relevant hashtags at the end\n`; } prompt += `\nLinkedIn-specific tips:\n`; prompt += `- No clickbait\n`; prompt += `- Authentic voice\n`; prompt += `- Add value, don't just sell\n`; prompt += `- Maximum ${CONFIG.max_linkedin_length} characters\n`; prompt += `\nReturn ONLY the post content, no explanations.`; return prompt; } ``` The values originate from command-line input without allow-list validation: ```javascript const topic = args[0]; // Parse options const options = { tone: getArg(args, '--tone', CONFIG.default_tone), type: getArg(args, '--type', 'general'), includeEmoji: !args.includes('--no-emoji'), includeHashtags: !args.includes('--no-hashtags'), testMode: args.includes('--test') }; ``` ### Technical Analysis The application treats attacker-controlled `topic`, `tone`, and `type` values as part of the same natural-language instruction channel used for trusted agent directives. Quoting ...[truncated 2508 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Treat every topic and option as untrusted data rather than agent instructions. 2. Validate `tone` and `type` against explicit allow lists: ```javascript const ALLOWED_TONES = new Set(['professional', 'casual', 'inspiring']); const ALLOWED_TYPES = new Set([ 'general', 'thought-leadership', 'celebration', 'announcement' ]); ``` 3. Reject control characters and enforce reasonable length limits for all user-controlled fields. 4. Use a structured agent interface with separate system-instruction and user-data fields where available. 5. Clearly delimit user content and explicitly state that instructions found inside the data must not be followed. Delimiting reduces risk but should not be considered a complete security boundary. 6. Run Sloan with the minimum possible tools, filesystem access, network access, credentials, and contextual data. 7. Require user confirmation before publishing or performing any external side effect. 8. Validate generated output for length and expected format before displaying or using it. 9. Add adversarial tests containing quotation marks, newlines, prompt overrides, encoded instructions, and misleading delimiters. 10. Correct the malformed process-spawning implementation and add automated syntax and execution tests without weakening input isolation. ]]>

T08 · Insecure Dependencies

Warning
Location
package-lock.json:23
Finding
Dependencies Locked to a Plaintext Third-Party Registry Mirror<![CDATA[ ## Vulnerability Details **File Location**: `package-lock.json:23-52` **Vulnerability Type**: Unsafe dependency source and supply-chain configuration **Risk Level**: Medium ### Vulnerable Code The lockfile resolves packages through a third-party mirror over plaintext HTTP: ```json "node_modules/asynckit": { "version": "0.4.0", "resolved": "http://mirrors.tencentyun.com/npm/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "license": "MIT" }, "node_modules/axios": { "version": "1.13.6", "resolved": "http://mirrors.tencentyun.com/npm/axios/-/axios-1.13.6.tgz", "integrity": "sha512-ChTCHMouEe2kn713WHbQGcuYrr6fXTBiu460OTwWrWob16g1bXn4vtz07Ope7ewMozJAnEquLk5lWQWtBig9DQ==", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.11", "form-data": "^4.0.5", "proxy-from-env": "^1.1.0" } } ``` Equivalent plaintext mirror URLs are used throughout the lockfile. The documented installation command also selects a mutable latest installer version: ```bash npx clawhub@latest install linkedin-post-generator ``` ### Technical Analysis Dependency archives are obtained from an unofficial third-party mirror using HTTP rather than authenticated HTTPS. Plaintext transport allows a network-positioned attacker to observe or modify responses. Trust is also extended to the mirror operator and its infrastructure rather than being limited to the official npm registry. The lockfile includes SHA-512 integrity values, which materially reduces straightforward archive substitution: npm should reject an archive whose bytes do not match the recorded digest. Therefore, plaintext transport alone does not establish arbitrary code execution. Residual risk remains from unsafe registry trust, environments that disable or bypass integrity checks, lockfile manipulation, compromised mirror content corresponding to a malicious lock update, and workflows tha ...[truncated 1972 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Regenerate `package-lock.json` using the official npm registry over HTTPS: ```bash npm config set registry https://registry.npmjs.org/ rm -rf node_modules package-lock.json npm install ``` 2. Confirm that every `resolved` URL uses HTTPS and an approved registry before committing the regenerated lockfile. 3. Enforce registry allow lists and HTTPS-only sources in local, CI, and release environments. 4. Keep lockfile integrity verification enabled and fail builds on integrity mismatches. 5. Pin the documented `clawhub` installer to a specifically reviewed version rather than `@latest`. 6. Verify package provenance, signatures, or attestations where the ecosystem supports them. 7. Use reproducible builds and review lockfile changes as security-sensitive modifications. 8. Run dependency installation in a restricted build environment without unnecessary secrets. 9. Add automated dependency auditing and registry-policy checks to CI. 10. Reconcile the inconsistent versions in `SKILL.md`, `package.json`, and `package-lock.json` so reviewers and installers can identify the exact audited release. ]]>
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
  • System Prompt LeakageDirect Leakage, Indirect Extraction, Tool-Based Exfiltration
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
Findings (16)

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding
The declared purpose is benign LinkedIn post generation, but the skill metadata indicates additional behaviors: payment processing via skillpay.me, fallback use of an embedded merchant key, and external/local agent execution through a gateway token. This mismatch is dangerous because users and reviewers may not realize the skill can make billable or authenticated external calls, increasing the risk of unauthorized charges, secret misuse, and hidden network interactions.

Direct Prompt Extraction

High
Category
System Prompt Leakage
Content
prompt += `\nReturn ONLY the post content, no explanations.`;
  
  return prompt;
}

/**
Confidence
85% confidence
Finding
Skill contains instructions that could directly expose system prompts, internal rules, or hidden instructions to users or external parties.

Known Vulnerable Dependency: axios==1.13.6 — 16 advisory(ies): CVE-2026-44494 (axios Vulnerable to Full Man-in-the-Middle via Prototype Pollution Gadget in `co); CVE-2026-44495 (axios Vulnerable to Credential Theft and Response Hijacking via Prototype Pollut); CVE-2025-62718 (Axios has a NO_PROXY Hostname Normalization Bypass that Leads to SSRF) +13 more

High
Category
Supply Chain
Confidence
95% confidence
Finding
The lockfile pins axios to 1.13.6, and the static analysis indicates multiple known advisories affecting that version, including SSRF-related proxy bypass and prototype-pollution-adjacent request/response manipulation risks. In a skill that generates LinkedIn posts and likely makes outbound API requests, a vulnerable HTTP client increases the chance of server-side request forgery, credential leakage, or tampering with request handling if untrusted input influences destinations or config.

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
89% confidence
Finding
form-data 4.0.5 is reported vulnerable to CRLF injection via unescaped multipart field names/filenames. If this skill ever uploads files or constructs multipart requests using attacker-influenced metadata, an attacker may be able to inject crafted headers or manipulate request structure, potentially leading to request smuggling-like effects or downstream abuse.

Known Vulnerable Dependency: axios==1.13.6 — 16 advisory(ies): CVE-2026-44494 (axios Vulnerable to Full Man-in-the-Middle via Prototype Pollution Gadget in `co); CVE-2026-44495 (axios Vulnerable to Credential Theft and Response Hijacking via Prototype Pollut); CVE-2025-62718 (Axios has a NO_PROXY Hostname Normalization Bypass that Leads to SSRF) +13 more

High
Category
Supply Chain
Confidence
96% confidence
Finding
The package allows installation of an axios version identified by the scanner as having multiple known security advisories, including SSRF/proxy-bypass and prototype-pollution-related issues. If the skill uses axios for outbound requests, these flaws could enable request redirection, credential leakage, response tampering, or abuse of network trust boundaries depending on how HTTP input is handled.

Rp1

Medium
Category
MCP Rug Pull
Confidence
89% confidence
Finding
The README instructs users to run `npx clawhub@latest install linkedin-post-generator`, which pulls and executes the latest version of a remote package at install time rather than a pinned, reviewed version. If the upstream package is compromised or a malicious update is published, users could execute attacker-controlled code simply by following the installation instructions.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The README states that payment is handled automatically using an embedded merchant key and notes only a `--test` flag, but it does not prominently warn that normal usage may trigger real charges. This creates a significant risk of unexpected financial transactions and reduces informed user consent, especially because users may treat a content-generation CLI as harmless to try.

Lp3

Medium
Category
MCP Least Privilege
Confidence
86% confidence
Finding
The skill advertises environment-variable-based capabilities (`SKILLPAY_MERCHANT_KEY`, `OPENCLAW_GATEWAY_TOKEN`) but declares no explicit tool scope or permissions. That creates an authorization and transparency gap: a user or platform may treat the skill as simple content generation while it can access sensitive runtime configuration and potentially trigger authenticated behaviors.

External Transmission

Medium
Category
Data Exfiltration
Content
// Configuration
const CONFIG = {
  skillpay_api: 'https://api.skillpay.me/v1',
  merchant_key: process.env.SKILLPAY_MERCHANT_KEY || 'sk_91fff75ae2a7a71f8eceadcbcd816e24d57e58d9d04ccca45f0b3856af130aea',
  price_per_use: 0.002,
  currency: 'USDT',
Confidence
80% confidence
Finding
The code is configured to communicate with an external billing service (`api.skillpay.me`). External transmission is not inherently unsafe, but in this case it is security-relevant because the skill's stated purpose does not mention payment processing, and the transmission involves billing operations and credentials. The mismatch between advertised function and actual data flow makes the behavior more dangerous.

Context-Inappropriate Capability

Medium
Confidence
91% confidence
Finding
The skill spawns an external CLI (`openclaw`) to process user-controlled prompt content. For a simple LinkedIn post generator, invoking a subprocess materially expands the attack surface, introduces dependency on local executables and PATH trust, and is not clearly disclosed by the skill description. In this context, the capability is more dangerous because it allows unexpected local code execution paths in an otherwise content-generation skill.

Missing User Warnings

Medium
Confidence
87% confidence
Finding
The skill sends user-provided topic content to a local HTTP agent endpoint without explicit disclosure. Even though the destination is localhost, this still transmits potentially sensitive user input to another service boundary, and localhost services may be privileged, developer-only, or differently secured than the skill runtime. The context makes this concerning because users would reasonably expect local text generation, not hidden forwarding to another service.

Internal Network Request

Medium
Category
Server-Side Request Forgery
Content
return parseAgentResponse(result);
  } catch (cliError) {
    try {
      const response = await axios.post('http://localhost:18789/api/agent/run', {
        agentId: 'sloan',
        prompt: prompt,
        stream: false
Confidence
70% confidence
Finding
Code issues a request to a loopback, link-local, or private-range host. This can reach internal services not meant to be exposed and is a common SSRF pivot.

Description-Behavior Mismatch

Medium
Confidence
97% confidence
Finding
The skill performs billing and charge operations even though the manifest describes only LinkedIn post generation. Hidden monetization behavior is dangerous because users and host platforms may not expect outbound payment requests or balance deductions, creating consent, trust, and abuse risks. The context increases severity because charging is embedded in normal execution rather than clearly separated as an explicit purchase flow.

Missing User Warnings

Medium
Confidence
98% confidence
Finding
The payment request transmits a merchant credential and even includes a hardcoded fallback secret in source. Embedded or silently transmitted credentials are dangerous because they can be extracted from the package, reused for unauthorized charges, and expose the merchant account to fraud or abuse. In this skill context, there is no clear disclosure or secure secret handling boundary, making misuse more likely.

Known Vulnerable Dependency: follow-redirects==1.15.11 — 1 advisory(ies): CVE-2026-40895 (follow-redirects leaks Custom Authentication Headers to Cross-Domain Redirect Ta)

Low
Category
Supply Chain
Confidence
87% confidence
Finding
follow-redirects 1.15.11 is flagged for leaking custom authentication headers across cross-domain redirects. Because axios depends on this package, any authenticated outbound request that follows redirects could accidentally disclose bearer tokens or API keys to an attacker-controlled host if redirect targets are not tightly controlled.

Unpinned Dependencies

Low
Category
Supply Chain
Content
"author": "Matt",
  "license": "MIT",
  "dependencies": {
    "axios": "^1.6.0"
  },
  "engines": {
    "node": ">=18.0.0"
Confidence
93% confidence
Finding
The dependency is specified with a caret range (^1.6.0), which permits automatic installation of newer minor and patch releases rather than a fully fixed version. In a skill that may be installed and executed in different environments, this reduces supply-chain determinism and can unintentionally pull in vulnerable or behavior-changing releases, as reflected by the separate vulnerable-dependency finding for axios.

Static analysis

Detected: suspicious.dangerous_exec, suspicious.env_credential_access

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
index.js:91

Environment variable access combined with network send.

Critical
Code
suspicious.env_credential_access
Location
index.js:15