Back to skill

Security audit

Multi-Channel Engagement Agent

Security checks for vulnerabilities and agentic risk

Overview

The skill is a disclosed social engagement bot, but it needs Review because it can post publicly, use wallet/API credentials, spend small Farcaster write fees, and contains unsafe shell execution around Farcaster keys.

Install only if you are comfortable giving it social posting authority and Farcaster wallet/signing keys. Use dedicated low-privilege accounts and a minimally funded wallet, avoid cron until behavior is tested, review every generated reply path, and fix the Farcaster shell execution before providing real keys.

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

Error
Location
scripts/engage.mjs:131
Finding

PowerShell Command Injection and Wallet Secret Exposure in Farcaster Posting

Content
View full analysis
`$env:${k}="${v}"`).join('; '); const cmd = `${envStr}; node skills/farcaster-agent/src/post-cast.js "${replyText.replace(/"/g, '\\"')}"`; try { const output = execSync(cmd, { encoding: 'utf8', shell: 'powershell.exe' }); ``` ### Technical Analysis The function constructs executable PowerShell source by directly interpolating configuration values, Farcaster metadata, and generated reply text. Replacing double quotes with `\"` does not safely escape a value for PowerShell. PowerShell recognizes additional control and interpolation syntax, including semicolons, backticks, newlines, variable references, and `$()` subexpressions. The reply may contain a phrase selected from the configurable `persona.phrases` array. Consequently, a crafted configuration can introduce PowerShell syntax into `replyText`. The values used for `FID`, `PARENT_FID`, and `PARENT_HASH` are also interpolated without strict validation. In addition, `PRIVATE_KEY` and `SIGNER_PRIVATE_KEY` are embedded directly in the command string. This unnecessarily exposes high-value wallet credentials to the shell command channel and may reveal them through process inspection, command logging, debugging output, monitoring systems, or exceptions containing command details. Executing through `powershell.exe` is unnecessary for the declared task. The child process can be launched directly with a ...[truncated 1749 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
references/platform-apis.md:64
Finding

Documentation Recommends Shell Execution with Unescaped Reply Content

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (33)

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node scripts/engage.mjs --platform twitter

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node scripts/engage.mjs --platform twitter

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node scripts/engage.mjs --platform twitter

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node scripts/engage.mjs --platform twitter

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node scripts/engage.mjs --platform twitter

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node scripts/engage.mjs --platform twitter

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node scripts/engage.mjs --platform twitter

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node scripts/engage.mjs --platform twitter

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · references/platform-apis.md (reported line 6)May include surrounding context.

Twitter (OAuth 1.0a)

Authentication

Uses OAuth 1.0a with consumer keys + access tokens.

javascript
import { TwitterApi } from 'twitter-api-v2';

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
95% confidence
Finding

The skill clearly performs network operations across multiple third-party services, but the manifest does not declare an explicit tool scope such as allowed network destinations or permissions. That creates a governance and consent gap: users and orchestrators are not warned up front that the skill can fetch from and post to external services, including public social platforms.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The trigger phrases are broad enough to match ordinary requests for help with social media engagement, which increases the chance the skill is invoked when a user only wanted advice rather than autonomous posting. In this skill, accidental invocation is more dangerous because its core behavior is to generate and publish public replies across multiple platforms.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The description markets the skill as engagement automation but does not clearly warn that it can autonomously post public replies and store engagement/state data. In context, this omission is significant because the skill is not merely reading content; it can act on behalf of the user on public services, creating reputational, privacy, and operational risk if invoked unexpectedly.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

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

md
- Rate limits: Tweets 50/15min, Searches 450/15min

**Option B: AISA API (alternative, good for trending)**
- AISA API endpoint: `https://api.aisa.one/apis/v1/twitter/tweet/advanced_search`
- Get API key at https://aisa.one
- Searches via AISA are fast and reliable for trending
- Config: add `aisaTwitterApiKey` to twitter platform

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

This manifest/config restricts processing to "en" via languageFilter, which imposes a language constraint in configuration without any nearby explanation, opt-in mechanism, or region-specific justification. Under the policy rules, forcing a specific language can be a natural-language policy issue when users are not offered a choice.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

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

Fetch Trending

javascript
const response = await fetch(
  'https://api.neynar.com/v2/farcaster/feed/trending?limit=5',
  { headers }
);
const { casts } = await response.json();

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/platform-apis.md (reported line 65)May include surrounding context.

Fetch Trending

javascript
const response = await fetch(
  'https://api.neynar.com/v2/farcaster/feed/trending?limit=5',
  { headers }
);
const { casts } = await response.json();

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/platform-apis.md (reported line 74)May include surrounding context.

Fetch Trending

javascript
const response = await fetch(
  'https://api.neynar.com/v2/farcaster/feed/trending?limit=5',
  { headers }
);
const { casts } = await response.json();

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · scripts/engage.mjs (reported line 103)May include surrounding context.

js
### Fetch Trending
```javascript
const response = await fetch(
  'https://api.neynar.com/v2/farcaster/feed/trending?limit=5',
  { headers }
);
const { casts } = await response.json();

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The posting flow instructs users to place private keys in environment variables and invoke a subprocess to post content, without any safety guidance on key handling, process isolation, logging, or external side effects. In an autonomous multi-platform bot, this creates elevated risk of credential leakage or misuse and can trigger unintended posting actions with signing authority.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The file documents that Farcaster write operations incur a real-money x402 payment but does not provide any warning about transactional side effects, spending limits, or approval requirements. In an autonomous engagement skill, omitted spend warnings raise the risk of unintended financial loss through repeated automated writes.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The documentation includes an automated captcha-solving flow for posting Moltbook comments, including code that programmatically answers a verification challenge. In a social engagement bot, this bypass-oriented automation is not necessary for safe read-only reference material and meaningfully increases abuse potential by facilitating automated posting despite anti-bot controls.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

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

javascript
// Step 1: Submit comment
const response = await fetch('https://www.moltbook.com/api/v1/comments', {
  method: 'POST',
  headers,
  body: JSON.stringify({ post_id: postId, content: replyText })

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/platform-apis.md (reported line 129)May include surrounding context.

javascript
// Step 1: Submit comment
const response = await fetch('https://www.moltbook.com/api/v1/comments', {
  method: 'POST',
  headers,
  body: JSON.stringify({ post_id: postId, content: replyText })

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · scripts/engage.mjs (reported line 191)May include surrounding context.

js
```javascript
// Step 1: Submit comment
const response = await fetch('https://www.moltbook.com/api/v1/comments', {
  method: 'POST',
  headers,
  body: JSON.stringify({ post_id: postId, content: replyText })

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/platform-apis.md (reported line 140)May include surrounding context.

md
const answer = solveMathChallenge(verification.challenge);

// Step 3: Verify
await fetch('https://www.moltbook.com/api/v1/verify', {
  method: 'POST',
  headers,
  body: JSON.stringify({

Static analysis

Detected: suspicious.dangerous_exec, suspicious.exposed_secret_literal

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
scripts/engage.mjs:141

File appears to expose a hardcoded API secret or token.

Critical
Code
suspicious.exposed_secret_literal
Location
references/platform-apis.md:14

File appears to expose a hardcoded API secret or token.

Critical
Code
suspicious.exposed_secret_literal
Location
scripts/engage.mjs:61

File appears to expose a hardcoded API secret or token.

Critical
Code
suspicious.exposed_secret_literal
Location
SKILL.md:132