T01 · Skill Instruction Hijacking
- Location
scripts/auto_mirror.py:211- Finding
Default Promotional Content Injection into Mirrored Posts
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This skill is mostly coherent, but it can automatically publish to your Binance Square account and its default safeguards are not strong enough for that authority.
Review before installing. Run in dry-run mode first, disable show_tool_attribution unless you explicitly want that text in every post, avoid inline credentials in cron or shell history, and use dedicated least-privilege keys. Do not run it as a background or scheduled job until you are comfortable with the exact accounts, search terms, posting limits, and transformed output it will publish.
scripts/auto_mirror.py:211Default Promotional Content Injection into Mirrored Posts
scripts/auto_mirror.py:391Documented First-Post Approval Control Is Not Implemented
README.md:114API Credentials Encouraged in Persistent Cron Command
The skill uses 'env' capability that is not listed in its permissions. This may indicate deceptive intent or missing permission declarations.
The skill uses 'file_write' capability that is not listed in its permissions. This may indicate deceptive intent or missing permission declarations.
The skill uses 'network' capability that is not listed in its permissions. This may indicate deceptive intent or missing permission declarations.
The markdown states that tweets are automatically collected, transformed, and posted to Binance Square, which implies network transmission of third-party content and account-linked publishing. While the file gives setup and usage steps, it does not explicitly warn users about privacy, account-impact, or external data transfer risks beyond operational notes.
The README instructs users to place API tokens in environment variables and even inline them in cron examples, but does not warn about secure handling, shell history exposure, process/environment leakage, file permission hygiene, or log leakage. In an automation skill that uses long-lived credentials for two external platforms, weak credential-handling guidance materially increases the risk of token compromise and account misuse.
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.
Linux/Mac:
nohup python scripts/auto_mirror.py --config mirror_config.json > mirror.log 2>&1 &
Windows (PowerShell):
The auto-run trigger phrases are broad and overlap with natural user requests like 'auto post from twitter' or 'start twitter mirror,' which can cause the skill to activate in situations where the user did not intend to initiate external posting automation. Because the skill can eventually perform continuous external transmissions to third-party services, ambiguous invocation increases the risk of accidental activation and unintended posting behavior.
The manifest says the skill auto-mirrors Twitter/X content to Binance Square, which explains network access conceptually, but this file specifically operationalizes the behavior through shell execution examples and an allowed Bash tool. For an AI agent skill, spawning shell commands is a broader capability than necessary to describe or implement the business intent, and the manifest does not justify why command execution is needed rather than a narrower integration path.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
curl -s -X POST "https://ai.6551.io/open/twitter_user_tweets" \
-H "Authorization: Bearer $TWITTER_TOKEN" \
-H "Content-Type: application/json" \
-d '{
The configuration defaults impose a target language of Chinese (translate_to: "zh") without clear per-user opt-in, which can silently transform user content or mirrored content into a different language than intended. In an automation context, silent defaults can lead to inaccurate or misleading published posts, especially when content is translated and reposted externally.
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.
# ---------------------------------------------------------------------------
def load_state(path: str) -> dict:
"""Load persisted state from disk."""
p = Path(path)
if p.exists():
try:
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.
def save_state(state: dict, path: str):
"""Persist state to disk."""
Path(path).write_text(json.dumps(state, indent=2, ensure_ascii=False), encoding="utf-8")
The parameter description specifies --translate-to with a default of zh, which indicates a built-in locale preference in the skill's natural-language behavior. The README does not frame this as an opt-in or justify the locale restriction as region-specific, so it can conflict with language-choice policy expectations.
The default configuration sets translate_to to zh, which hard-codes a specific locale preference in the skill's natural-language behavior. This can violate language/locale policy expectations when users have not explicitly chosen that language target.
The script exposes translation-related options and configuration (--translate, --translate-to, and corresponding defaults), implying tweet content may be translated before posting. However, no code path uses these settings during transform_tweet or posting, so the documented/declared behavior contradicts actual execution.