Back to skill

Security audit

SeedDrop

Security checks for vulnerabilities and agentic risk

Overview

This skill has a coherent social-media engagement purpose, but it needs Review because it uses authenticated accounts, full cookies, browser automation, and under-scoped safeguards for third-party content and credential checks.

Install only if you are comfortable giving the skill access to your own social-platform sessions and reviewing every generated action before posting. Use a locked local dependency install instead of ad hoc `npx`, restrict browser/cookie access to the intended accounts and platforms, and treat collected post text as untrusted content.

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

Warning
Location
scripts/responder.ts:141
Finding

Untrusted Social Platform Content Is Forwarded to an AI Agent Without Prompt-Injection Isolation

Content
View full analysis

Vulnerability Details

File Location: scripts/responder.ts:141-159
Related Data Source: scripts/monitor.ts:247
Vulnerability Type: Indirect prompt injection through untrusted platform content
Risk Level: Medium

Vulnerable Code

ts
const post = JSON.parse(line) as ScoredPost;
inputCount++;

if (isAlreadyReplied(post.id, log)) {
  console.error(`[responder] SKIP ${post.id}: already replied`);
  skipDup++;
  continue;
}

if (isAuthorCoolingDown(post.author, post.platform, log)) {
  console.error(`[responder] SKIP ${post.id}: author "${post.author}" cooldown (24h)`);
  skipAuthor++;
  continue;
}

The untrusted fields are subsequently included beside instructions intended for the Agent:

ts
console.log(JSON.stringify({
  action: 'review_draft',
  draft,
  post: {
    id: post.id,
    url: post.url,
    title: post.title,
    body: post.body.substring(0, 300),
    author: post.author,
    platform: post.platform,
    community: post.community,
    scores: post.scores,
    finalScore: post.finalScore,
  },
  instructions: `Generate a value-first reply for this ${post.platform} post. Follow the template at templates/reply-${post.platform}.md. Brand mention ≤20%. Then present the draft to the user for approval.`,
}));

The monitor emits platform-supplied post data without a security transformation:

ts
console.log(JSON.stringify(post));

Technical Analysis

Post titles, bodies, author names, community names, and related fields originate from external social platforms and can therefore be controlled by arbitrary platform users. The monitor serializes these fields without distinguishing data from instructions. The responder then places the fields in the same Agent task as its operational instructions.

An attacker can publish content containing instructions such as requests to disregard the reply-generation task, reveal contextual ...[truncated 2147 chars]

Remediation
View remediation

Remediation Suggestions

  1. Explicitly identify every platform-derived field as untrusted data that must never be interpreted as an instruction.
  2. Use strict role separation in the downstream Agent prompt. Place platform content in a clearly delimited data block and state that instructions within that block must be ignored.
  3. Pass only fields necessary for reply generation and remove metadata that the Agent does not need.
  4. Add normalization and validation for platform identifiers before interpolating them into template paths.
  5. Detect common prompt-injection patterns and flag affected posts for manual inspection rather than automatic Agent processing.
  6. Run draft generation with no external tools and no access to credentials, local memory, or unrelated conversation context.
  7. Require the generated output to conform to a strict schema and validate it before displaying or posting it.
  8. Preserve manual approval and ensure approval is bound to the exact final text and destination that will be sent.
  9. Add regression tests using malicious titles and bodies to verify that embedded instructions cannot alter the generation policy.

T09 · Insecure Skill Coding Practices

Note
Location
scripts/auth-bridge.ts:30
Finding

SocialVault Presence and Credential Validity Are Accepted Without Authentication

Content
View full analysis

Vulnerability Details

File Location: scripts/auth-bridge.ts:30-41, 63-88
Vulnerability Type: Improper credential and trusted-component validation
Risk Level: Low

Vulnerable Code

ts
function detectSocialVault(): string | null {
  for (const p of SOCIALVAULT_SEARCH_PATHS) {
    if (existsSync(p)) {
      console.error(`[auth-bridge] SocialVault detected at: ${dirname(p)}`);
      return p;
    }
  }
  return null;
}

export function getAuthMode(): AuthMode {
  return detectSocialVault() ? 'socialvault' : 'none';
}

Credential retrieval returns only a pending instruction placeholder:

ts
export function getCredential(platform: string, profile: string = 'default'): Credential | null {
  const mode = getAuthMode();

  if (mode === 'socialvault') {
    const instruction = getSocialVaultInstruction('token', platform, profile);
    console.error(`[auth-bridge] SocialVault mode — Agent should run: ${instruction}`);
    return {
      authType: 'oauth',
      value: `__socialvault_pending__:${instruction}`,
      profile,
      source: 'socialvault',
    };
  }

  console.error(`[auth-bridge] SocialVault is required but not detected. Please install: clawhub install socialvault`);
  return null;
}

The placeholder is then reported as valid solely because its declared source is socialvault:

ts
export function checkCredential(platform: string, profile: string = 'default'): CheckResult {
  const cred = getCredential(platform, profile);
  if (!cred) {
    return { valid: false, error: `No credential found for ${platform}/${profile}` };
  }
  if (cred.source === 'socialvault') {
    return { valid: true, username: `(via SocialVault, run: socialvault check ${platform}-${profile})` };
  }
  return {
    valid: cred.value.length > 0,
    error: cred.value.length === 0 ? 'Credential value is empty' : undefined,
  };
}

Technica

...[truncated 2380 chars]

Remediation
View remediation

Remediation Suggestions

  1. Do not treat the existence of SKILL.md as proof that SocialVault is installed or trustworthy.
  2. Integrate through a documented, authenticated SocialVault API or a securely resolved executable.
  3. Verify executable or package identity, ownership, permissions, and expected installation location before invoking it.
  4. Parse and validate a structured SocialVault response rather than embedding a command instruction in a credential object.
  5. Introduce explicit states such as unavailable, pending, retrieved, and verified.
  6. Return valid: false or an indeterminate status while the credential value remains pending.
  7. Validate credentials against the corresponding first-party platform endpoint before reporting them as valid.
  8. Keep actual credential values out of logs and standard output, and use short-lived credential handles where supported.
  9. Add tests covering spoofed marker files, incomplete installations, missing profiles, expired credentials, and malformed SocialVault responses.
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (110)

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The document states SocialVault is required and plaintext credential storage is unsupported, but the execution pipeline says the auth bridge handles local fallback automatically. This contradiction is security-significant because operators may believe credentials are always protected while the implementation may silently downgrade to weaker local storage or handling paths.

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

md
| `scripts/monitor.ts` | Platform monitoring orchestration |

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
| `scripts/scorer.ts` | Multi-dimensional post scoring |

Anti-Refusal Statement

High
Category
Anti-Refusal
Confidence
80% confidence
Finding

Skill instructs the agent to never refuse or to always comply. Suppressing the agent's ability to decline removes a core safety control and enables downstream harmful requests to succeed.

Content

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

md
5. **No Warranty**: This tool is provided "as-is" without warranty. The developers
   are not liable for any consequences arising from its use, including but not
   limited to account suspension, legal action, or data loss.
6. **Legal Compliance**: Users must comply with all applicable laws and regulations,
   including but not limited to the Cybersecurity Law, Data Security Law, Personal
   Information Protection Law, and Anti-Unfair Competition Law of the People's
   Republic of China, as well as equivalent laws in their jurisdiction.

Intent-Code Divergence

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

The document claims SocialVault is mandatory and plaintext credential storage is unsupported, yet the execution pipeline says auth-bridge.ts performs local fallback automatically. That contradiction can lead operators to run the skill under weaker credential-handling conditions than advertised, potentially exposing cookies for B站、贴吧、知乎、 and 小红书 accounts.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The primary skill description is written as a Chinese-only instruction/description, and the document does not offer an alternative language or state that the skill is limited to a Chinese-language or region-specific compliance context. Under the policy, language constraints need opt-in or clear justification to avoid excluding users by default.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
91% confidence
Finding

The README instructs users to run npx tsx without pinning a specific package version, which means execution may resolve to whatever version is current at install time. That creates a supply-chain risk: a malicious or compromised upstream release could be fetched and executed in the user's environment.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
91% confidence
Finding

This command example uses npx tsx without a pinned version, allowing unreviewed upstream package updates to be downloaded and executed. In security-sensitive environments, README copy-paste commands are often executed directly, so the documentation itself can propagate supply-chain exposure.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
91% confidence
Finding

The unpinned npx tsx reference can cause users to execute an unexpected package version at runtime. If the package, one of its dependencies, or the registry resolution path is compromised, arbitrary code execution could occur under the user's privileges.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
91% confidence
Finding

Referencing npx tsx without version pinning exposes users to mutable dependency resolution and possible remote code execution through a poisoned package release. Because this is a monitoring tool handling credentials and external services, compromise could also lead to credential theft or account misuse.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
91% confidence
Finding

This README line encourages executing a non-pinned package from the registry, which is a well-known supply-chain weakness. Since users may run it in trusted environments with access to local files, tokens, and network resources, the blast radius can exceed the script's apparent purpose.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
91% confidence
Finding

An unversioned npx tsx call allows package contents to change over time without user review, creating a repeatability and integrity problem. Attackers exploiting the package supply chain could gain code execution when users follow the documented analytics command.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
83% confidence
Finding

The disclaimer explicitly says the tool is not a crawler, but the rest of the README describes continuous monitoring of discussions across multiple platforms, including browser-based fallback collection on Zhihu and Xiaohongshu. That is an active contradiction in the documentation itself about the nature of the tool's behavior.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
89% confidence
Finding

The skill clearly orchestrates network-capable actions across multiple third-party platforms and browser-based access, but it does not declare an explicit tool scope such as allowed-tools or permissions. That mismatch weakens containment and review, making it easier for the skill to be granted broader capabilities than intended or for operators to misunderstand its runtime privileges.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The trigger list includes broad terms like community engagement and social listening that could match benign user conversation and invoke the skill unexpectedly. In a skill that can access credentials, browse platforms, and generate engagement workflows, accidental invocation increases the chance of unintended data access or action suggestions.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
88% confidence
Finding

Using npx tsx without pinning an exact package version introduces supply-chain risk because dependency resolution may pull a changed or malicious version at execution time. Since this skill handles authentication material and platform interaction, a compromised runtime package could intercept credentials or alter behavior silently.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
88% confidence
Finding

The unpinned npx tsx invocation for monitoring creates the same supply-chain exposure at a stage that processes external data and may trigger browser fallback behavior. A malicious or updated package could exfiltrate search terms, session cookies, or monitoring output while appearing to function normally.

Content

No source excerpt is available for this finding.

Ssd 4

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill explicitly instructs anti-detection fallback using authenticated browser sessions and complete cookie injection when API monitoring is blocked. That normalizes bypass behavior and increases the likelihood of covert scraping, account compromise impact, and misuse of sensitive session material beyond intended platform APIs.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
87% confidence
Finding

Running the scorer through unpinned npx tsx still exposes the pipeline to dependency hijacking, even if this phase seems lower risk. Because it consumes untrusted platform content and influences downstream reply generation, tampering here could manipulate outputs or embed malicious content into drafts.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
88% confidence
Finding

The responder stage uses unpinned npx tsx while generating user-facing content and likely operating near credentialed workflows. A compromised package at this point could leak account data, alter reply drafts, or introduce unauthorized actions under the guise of normal operation.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The disclaimer claims the tool is not a scraper, yet the workflow explicitly instructs browser-based extraction of rendered third-party search results. This misleading framing can cause reviewers and users to underestimate the privacy, compliance, and detection risks of the skill's actual behavior.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The documentation says only the user's own reply history is stored, but the monitor and browser-search steps direct extraction of third-party post data. Even if not persistently stored, this still processes third-party content and may create transient or logged artifacts, so the claim materially understates data handling risk.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
86% confidence
Finding

The disclaimer instructs users to comply specifically with PRC laws, presented as a mandatory policy statement for all users of the skill. Because the skill description elsewhere is not limited to a China-only deployment or region-specific compliance context, this imposes a locale-specific policy without offering a user choice or clearly justifying the regional constraint.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The description states the skill will monitor discussions across multiple platforms and generate replies, but it does not define clear activation boundaries, target criteria, or approval gates. In an agent ecosystem, this broad scope can cause over-collection of content, unintended engagement, or autonomous actions on third-party services beyond what a user explicitly intended.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
81% confidence
Finding

The guide forces a single language presentation throughout the file and does not indicate that the language choice is optional or region-specific. Under the stated policy, a fixed language without user opt-in or documented justification is a natural-language policy concern.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.