Back to skill

Security audit

Clawhub Skill Content Writer

Security checks for vulnerabilities and agentic risk

Overview

The skill matches its Citedy content-publishing purpose, but it can publish content automatically and make persistent account changes without strong confirmation safeguards.

Review this before installing if the connected Citedy account points at production blogs or social accounts. Use it only with clear runtime controls: set auto_publish=false by default, require a final preview and confirmation before posting or deleting, provide an explicit agent name during registration, and check any recurring sessions or webhooks it creates.

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

T09 · Insecure Skill Coding Practices

Note
Location
scripts/register.mjs:10
Finding

Default Registration Discloses the Local Hostname to a Third Party

Content
View full analysis

Vulnerability Details

File Location: scripts/register.mjs, lines 10–24
Vulnerability Type: Unnecessary local system information disclosure
Risk Level: Low

Vulnerable Code

js
import { hostname } from "os";

const BASE_URL = "https://www.citedy.com";

async function main() {
  const agentName = process.argv[2] || `agent-${hostname()}`;

  console.log(`Registering agent "${agentName}" with Citedy...`);

  const res = await fetch(`${BASE_URL}/api/agent/register`, {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({ agent_name: agentName }),
  });

Technical Analysis

When no agent name is supplied, the registration script reads the local machine hostname and incorporates it into the agent_name field. That value is then transmitted to the external Citedy registration API.

A hostname can contain identifying or operational information, including an employee name, organization name, internal asset identifier, environment role, project name, or deployment stage. Registration only needs a logical agent identifier, so transmitting a real hostname is not necessary for the documented functionality.

The recommended setup command in SKILL.md permits omission of the agent name:

bash
node scripts/register.mjs [agent_name]

Consequently, users following the default setup path may disclose local system metadata without understanding that the generated name is derived from their machine.

Attack Path

  1. A user follows the documented setup instructions.
  2. The user runs node scripts/register.mjs without an explicit agent name.
  3. The script calls the Node.js hostname() function.
  4. The hostname is embedded in a value such as agent-internal-prod-cms-01.
  5. The value is sent to https://www.citedy.com/api/agent/register.
  6. Citedy or any party with access to the relevant registration records can observe and retain th ...[truncated 750 chars]
Remediation
View remediation

Remediation Suggestions

  • Do not use the local hostname as the default agent identifier.
  • Generate a neutral random identifier, for example with crypto.randomUUID().
  • Alternatively, require the user to provide an explicit agent name and terminate with a clear error if it is omitted.
  • If hostname-based naming is retained, clearly disclose the external transmission and obtain informed user consent before registration.
  • Validate and length-limit any user-supplied agent name before transmission.
  • Update SKILL.md so the setup instructions accurately explain what information is sent to Citedy.

A safer default would be:

js
import { randomUUID } from "crypto";

const agentName = process.argv[2] || `agent-${randomUUID()}`;

T09 · Insecure Skill Coding Practices

Warning
Location
SKILL.md:413
Finding

Article Generation Can Publish Content Without Explicit User Confirmation

Content
View full analysis

Vulnerability Details

File Location: SKILL.md, lines 413–425
Vulnerability Type: Unsafe default publication behavior
Risk Level: Medium

Vulnerable Instruction

markdown
| Parameter             | Type     | Required                 | Description                                              |
| --------------------- | -------- | ------------------------ | -------------------------------------------------------- |
| `topic`               | string   | one of topic/source_urls | Article topic or title                                   |
| `source_urls`         | string[] | one of topic/source_urls | URLs to base the article on                              |
| `language`            | string   | no                       | Language code, default `en`. 55 languages supported      |
| `size`                | string   | no                       | `mini`, `standard`, `full`, `pillar`. Default `standard` |
| `mode`                | string   | no                       | `standard`, `turbo`. Default `standard`                  |
| `enable_search`       | boolean  | no                       | Enable web intelligence. Default `false`                 |
| `persona`             | string   | no                       | Writing persona slug (call GET /api/agent/personas, e.g. "musk", "hemingway", "jobs") |
| `auto_publish`        | boolean  | no                       | Publish immediately after generation. Default uses tenant setting (if unset, `true`) |
| `illustrations`       | boolean  | no                       | Generate AI illustrations. Default `false`               |
| `audio`               | boolean  | no                       | Generate voice-over audio. Default `false`               |
| `disable_competition` | boolean  | no                       | Skip competitor analysis. Default `false`                |

Technical Analysis

The documented article-generation workflows omit the auto_publish paramet ...[truncated 2360 chars]

Remediation
View remediation

Remediation Suggestions

  • Explicitly set "auto_publish": false in every article-generation workflow unless the user has specifically requested immediate publication.
  • Treat generation and publication as separate operations.
  • Display the generated title, content preview, destination, and publication status before requesting approval.
  • Require an explicit user confirmation immediately before invoking the publish endpoint.
  • Do not infer publication authorization merely from a request to “write,” “create,” or “generate” an article.
  • Change the server-side fallback for unset tenant settings from true to false.
  • Add a mandatory instruction such as: “Never publish generated content unless the user explicitly confirms publication after reviewing the result.”
  • Record publication confirmations in an audit log with the destination, article identifier, timestamp, and initiating user.
  • Apply the same confirmation model to social posts, scheduling, destructive deletion, and changes to persistent autopilot settings.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (11)

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node scripts/register.mjs [agent_name]

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
80% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

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

md
---

### DELETE /api/agent/articles/{id}

Permanently delete an article and its associated storage files (images, audio).

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
80% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

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

md
---

### DELETE /api/agent/products/:id

Remove a product from knowledge base.

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
80% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

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

md
---

### DELETE /api/agent/webhooks/:id

Remove a webhook registration.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
94% confidence
Finding

The skill clearly instructs the agent to make outbound network requests to Citedy APIs, register agents, and manage publishing/webhooks, but it does not declare any explicit tool scope such as allowed-tools or permissions. That mismatch weakens least-privilege controls and makes it harder for a host platform to constrain what network-capable actions the skill is supposed to perform.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The autopilot session workflow states that sessions run automatically and publish articles to a connected blog, but it does not present a clear, upfront safety warning about external side effects before configuration. In agent environments, hidden or underemphasized publishing behavior can lead to unintended posting to production blogs without sufficiently explicit user confirmation.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The micro-post workflow notes that omitting scheduledAt results in immediate publication, but it does not frame this as a high-visibility external side effect requiring explicit user acknowledgment. An agent following this skill could publish directly to connected social platforms from a casual user request without a strong confirmation boundary.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The publish workflow allows action=now for immediate posting to connected social accounts, but the documentation lacks a strong warning and confirmation requirement around this irreversible external action. This increases the risk of accidental or prompt-induced publication to public channels.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The skill contains contradictory execution semantics: examples and API responses describe article generation as asynchronous/processing, while the response guideline says generation is synchronous and returns the full article immediately. This can cause agents to make unsafe assumptions, mishandle state, skip status checks, or misreport publication/generation outcomes to users.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The script defaults the agent name to agent-${hostname()} and transmits the host machine's hostname to a third-party service during registration. Hostnames can reveal internal naming conventions, user identities, environment roles, or infrastructure details, and this disclosure is not clearly necessary for a content-writing skill's stated purpose.

Content

No source excerpt is available for this finding.

Autonomous Decision Making

Medium
Category
Excessive Agency
Confidence
75% confidence
Finding

Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.

Content

Scanner excerpt · scripts/register.mjs (reported line 42)May include surrounding context.

js
const data = await res.json();

  if (!data.approval_url) {
    console.error("Unexpected response — no approval_url:", data);
    process.exit(1);
  }

Static analysis

No suspicious patterns detected.