Back to skill

Security audit

Clawhub Skill Trend Scout

Security checks for vulnerabilities and agentic risk

Overview

This skill is a disclosed Citedy API integration for trend and competitor research, with low-risk notes around external data sharing, API-credit spending, and a hostname-based default registration name.

Before installing, be comfortable sending market-research terms, competitor URLs, and selected subreddits to Citedy and spending Citedy credits when runs are started. Provide an explicit non-sensitive agent name during registration instead of relying on the hostname default, and store the Citedy API key like any other service credential.

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

Note
Location
scripts/register.mjs:13
Finding

Local Hostname Disclosed During Default Agent Registration

Content
View full analysis

Vulnerability Details

File Location: scripts/register.mjs, lines 13–19
Vulnerability Type: Unnecessary disclosure of local system metadata
Risk Level: Low

Vulnerable Code

js
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 }),
});

The behavior is also documented in SKILL.md, lines 66–69:

markdown
**Preferred: run the included registration script:**

```bash
node scripts/register.mjs [agent_name]

The script calls the registration API and prints the approval URL. If agent_name is omitted, it defaults to agent-<hostname>.

text

### Technical Analysis

When the optional command-line argument is omitted, the registration script obtains the machine's hostname through Node.js's `os.hostname()` function. It incorporates that value into `agent_name` and transmits it to `https://www.citedy.com/api/agent/register`.

A hostname can contain identifying or operational information, including a username, employee or asset identifier, organization name, internal naming convention, environment type, or infrastructure role. Registration only needs an agent identifier, so transmitting the actual hostname is not necessary for the stated functionality.

This is an unnecessary metadata disclosure rather than arbitrary file access or credential theft. The request uses HTTPS, and the reviewed code sends the hostname only to the declared Citedy endpoint.

### Attack Path

1. A user follows the documented setup command without providing an explicit agent name:
   `node scripts/register.mjs`.
2. The script calls `hostname()` and constructs an identifier such as `agent-workstation-alice`.
3. The identifier is included in the JSON registra
...[truncated 890 chars]
Remediation
View remediation

Remediation Suggestions

  • Do not use the local hostname as the default external identifier.
  • Require the user to provide an explicit, non-sensitive agent name, or generate a random identifier such as agent-<random UUID>.
  • If hostname use remains available, require explicit informed consent before reading and transmitting it.
  • Update SKILL.md to state precisely which local metadata is collected, its destination, purpose, and retention policy.
  • Apply data minimization by transmitting only values required for registration.
  • Consider validating explicit agent names to reject accidental secrets, filesystem paths, email addresses, or other sensitive identifiers.

A safer implementation would be:

js
import { randomUUID } from "crypto";

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

Alternatively, terminate with a usage message when no explicit agent name is supplied.

Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (5)

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node scripts/register.mjs [agent_name]

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
94% confidence
Finding

The skill performs external network operations against Citedy endpoints but does not declare an explicit tool scope such as allowed network access. That weakens least-privilege controls and transparency, increasing the chance that a host agent may permit broader outbound access than users or platform policy expect.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The workflow sends user-supplied research queries, subreddit selections, and competitor URLs to a third-party API, but the skill does not clearly warn the user at the point of use that this data leaves the local environment. This creates a privacy and confidentiality risk, especially when users may submit sensitive market research terms, internal strategy topics, or non-public competitor targets.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The limitations section states that X scouting requires sufficient public English-language conversation, which introduces a language-specific constraint. The file does not offer user opt-in, alternatives for other languages, or a clear justification that this is a region- or compliance-specific tool, so it appears to enforce a language policy unilaterally.

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.