Back to skill

Security audit

X Founder Operations

Security checks for vulnerabilities and agentic risk

Overview

The skill is a disclosed X/Twitter strategy and analytics assistant with no hidden installer or persistence, but users should keep manual control over posting and DMs.

Install only if you want an agent to help with X/Twitter account operations. Review any generated posts, replies, or DMs before publishing, provide only the account/config data you intend it to use, and treat analytics recommendations cautiously until the validation script rejects anomalous records instead of merely flagging them.

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

Warning
Location
scripts/x_data_validator.py:203
Finding
Invalid X Records Remain Accepted After Integrity and Sanity-Check Failures<![CDATA[ ## Vulnerability Details **File Location**: `scripts/x_data_validator.py:203-294` **Vulnerability Type**: Fail-open validation and inconsistent validation status **Risk Level**: Medium ### Vulnerable Code ```python timeline_author = self.timeline_cache.get(tweet_id, {}).get("authorId") details_author = tweet.get("authorId") if timeline_author and details_author and timeline_author != details_author: checks.append({ "step": "cross_validation_author", "status": "ERROR", "tweet_id": tweet_id, "message": "Author ID mismatch between timeline and details", "severity": "ERROR" }) self._log_error(f"Author mismatch for tweet {tweet_id}", { "timeline": timeline_author, "details": details_author }) ``` ```python if likes is not None and impressions is not None and likes > impressions: checks.append({ "step": "sanity_check_likes", "status": "ERROR", "tweet_id": tweet_id, "message": f"IMPOSSIBLE: Likes ({likes}) > Impressions ({impressions})", "action": "FLAG_ANOMALY — data error detected but not modified", "severity": "ERROR" }) self._log_error("Data anomaly: likes > impressions", { "tweet_id": tweet_id, "likes": likes, "impressions": impressions }) if retweets is not None and impressions is not None and retweets > impressions: checks.append({ "step": "sanity_check_retweets", "status": "ERROR", "tweet_id": tweet_id, "message": f"IMPOSSIBLE: Retweets ({retweets}) > Impressions ({impressions})", "severity": "ERROR" }) self._log_error("Data anomaly: retweets > impressions", { "tweet_id": tweet_id, "retweets": retweets, "impressions": impressions }) for metric_name in required_metrics: value = metrics.get(metric_name) if value is not None and value < 0: checks.append({ "step": f"sanity_check_{metric_name}", "status": "ERROR", ...[truncated 3210 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Reject records with critical integrity failures: - Return `None` for author mismatches. - Return `None` for negative metrics. - Return `None` when likes or retweets exceed impressions, unless the API semantics explicitly permit that relationship. 2. Derive the final status from accumulated results instead of assigning `OK` unconditionally: ```python has_errors = any( check.get("severity") in {"ERROR", "CRITICAL"} for check in checks ) checks.append({ "step": "tweet_validation_complete", "status": "FAILED" if has_errors else "OK", "tweet_id": tweet_id, "message": ( "Tweet rejected because validation errors were detected" if has_errors else "Tweet data validated successfully" ), "has_warnings": any(c.get("severity") == "WARNING" for c in checks), "has_errors": has_errors, }) if has_errors: return None, checks return tweet, checks ``` 3. Distinguish explicitly between: - Valid records. - Valid records with non-fatal warnings. - Quarantined anomalous records. - Rejected records. 4. Require downstream analytics to consume only records carrying an explicit successful validation result. Do not rely solely on the record being non-null. 5. Avoid mutating the input response when adding missing metrics. Create a defensive copy before normalization so validation does not alter evidence supplied by the upstream source. 6. Add regression tests covering: - Author ID mismatch. - Negative metric values. - Likes greater than impressions. - Retweets greater than impressions. - Missing metrics. - Warning-only records. - Verification that rejected records cannot enter aggregate analytics. ]]>
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
Findings (13)

Tp4

High
Category
MCP Tool Poisoning
Confidence
94% confidence
Finding
The declared description presents a comprehensive X operations skill for managing an account end-to-end. The supplied code chunk only implements the analytics/reporting portion of that larger vision. It does not create content, manage posting, engage with users, run competitor analysis, develop personas, or orchestrate a full daily Plan-Do-Check-Act loop. Its primary purpose is performance analysis of validated tweets and report generation. This is a materially narrower behavior than the declared purpose, so the description does not accurately represent what this code chunk actually does.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding
The declared description presents a comprehensive X operations skill focused on strategy, creation, engagement, promotion, and optimization workflows. The supplied code does not implement those behaviors. Instead, it only validates analytics data integrity and computes limited summary metrics from tweet data. While this validator could support a broader analytics or optimization system, the actual code chunk’s primary purpose is materially narrower and different from the declared end-to-end X operations capability. No undeclared risky capability is evident, but there is a strong description-to-behavior mismatch because most declared capabilities are absent from the code.

Anti-Refusal Statement

High
Category
Anti-Refusal
Content
4. Generate engagement recommendations

**Engagement criteria**:
- Replies from accounts in your core circle (always respond)
- Thoughtful replies that add value (respond with depth)
- Questions about your domain (reply with expertise)
- Mentions by larger accounts (respond promptly)
Confidence
70% 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.

Lp3

Medium
Category
MCP Least Privilege
Confidence
70% confidence
Finding
Without declared permissions the skill's intent is opaque and cannot be validated.

Vague Triggers

Medium
Confidence
92% confidence
Finding
`auto_invoke: true` combined with a broad description can cause the skill to trigger on routine social-media requests without clear user intent. In practice, that increases the chance of unintended file reads, overbroad strategic guidance, or activation in contexts where the user did not consent to this specialized workflow.

Vague Triggers

Medium
Confidence
89% confidence
Finding
Several example triggers are broad enough to match common planning or optimization requests, which can cause over-triggering of this skill outside its intended scope. Over-triggering matters because this skill references scripts, configs, analytics, and operational workflows that a user may not expect to engage for a generic content-planning request.

Natural-Language Policy Violations

Medium
Confidence
82% confidence
Finding
The report labels hourly output as UTC and tells users to convert it afterward, which bakes a specific timezone/locale assumption into the skill's natural-language behavior. Under the policy, forcing a locale choice without opt-in can be a violation when the skill is not clearly documented as region-specific.

Natural-Language Policy Violations

Low
Confidence
86% confidence
Finding
The instruction 'For bilingual users: English for technical/international content, native language for personal/cultural content' prescribes a language policy rather than offering a choice. This can conflict with organizational expectations that users control language or locale unless the constraint is explicitly optional and justified.

Natural-Language Policy Violations

Low
Confidence
83% confidence
Finding
This manifest template specifies English as the primary language and describes a fixed language-mixing strategy, which can be read as prescribing a default language behavior rather than offering a user-selected option. The policy allows locale or language constraints when users are given a choice or the constraint is clearly justified, neither of which is stated here.

Natural-Language Policy Violations

Low
Confidence
90% confidence
Finding
Line L153 uses the Chinese phrase "活人感" in otherwise English guidance. The file does not indicate that multilingual output is optional or justified for a region-specific audience, which can conflict with language/locale policy expectations.

Natural-Language Policy Violations

Low
Confidence
78% confidence
Finding
The document states that the target audience timezone is usually US East or US West and builds recommended peak windows around that assumption. Because this is natural-language guidance in a generally applicable schedule document, it steers users toward a specific locale without presenting it as optional or region-specific policy.

Natural-Language Policy Violations

Low
Confidence
86% confidence
Finding
Line L013 introduces the Chinese phrase "活人感" inside an otherwise English-language guide, and the term is later reused as a section heading at L144. The file does not offer a language/locale preference or explain that multilingual terminology is required for a region-specific audience, which can violate language-consistency policy expectations.

Natural-Language Policy Violations

Low
Confidence
83% confidence
Finding
Line L003 includes the phrase "夹带私货" as part of the instructional content without offering a language choice or explaining that the content is intended for Chinese-speaking users. This can violate language/locale policy expectations because the skill imposes a language element on all readers rather than making it optional or context-specific.

Static analysis

No suspicious patterns detected.