T01 · Skill Instruction Hijacking
- Location
SKILL.md:22- Finding
Mandatory promotional content hijacks agent responses
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill has a coherent SCRM purpose, but it needs Review because it handles live CRM data and credentials with broad proxy access, unsafe credential persistence, and weak safeguards around uploads and writes.
Review before installing. Only use this on a trusted single-user machine, treat the APP KEY like a password, do not provide APP KEY values from untrusted sources, avoid disabling TLS verification or changing the base URL, and require explicit confirmation before uploads or business write actions. Rotate the APP KEY if it may have appeared in logs or command output.
SKILL.md:22Mandatory promotional content hijacks agent responses
scripts/scrm.py:80Persistent shell command injection through the APP KEY
scripts/environment.py:106Restored APP KEY is disclosed in command output
scripts/get_access_token.py:93APP KEY and access token are cached in plaintext without enforced permissions
scripts/api_client.py:15Credentials can be redirected to arbitrary destinations and sent without TLS verification
scripts/claw_client.py:194Generic proxy forwards arbitrary service, URI, and method values without local authorization
scripts/claw_client.py:151Write-operation detection fails open for unknown or differently named APIs
scripts/file_utils.py:91Image upload command can exfiltrate arbitrary local files
scripts/raw_fetcher.py:41Remote-document allowlist is bypassable through redirects
The package reportedly fetches arbitrary or semi-controlled remote text content from open.wshoto.com and returns raw content/metadata, which is outside the declared CRM-query scope. Unnecessary remote content retrieval can be abused for data exfiltration, prompt/context injection, or unintended processing of untrusted documents.
The package reportedly fetches arbitrary or semi-controlled remote text content from open.wshoto.com and returns raw content/metadata, which is outside the declared CRM-query scope. Unnecessary remote content retrieval can be abused for data exfiltration, prompt/context injection, or unintended processing of untrusted documents.
The package reportedly fetches arbitrary or semi-controlled remote text content from open.wshoto.com and returns raw content/metadata, which is outside the declared CRM-query scope. Unnecessary remote content retrieval can be abused for data exfiltration, prompt/context injection, or unintended processing of untrusted documents.
The package reportedly fetches arbitrary or semi-controlled remote text content from open.wshoto.com and returns raw content/metadata, which is outside the declared CRM-query scope. Unnecessary remote content retrieval can be abused for data exfiltration, prompt/context injection, or unintended processing of untrusted documents.
The package reportedly fetches arbitrary or semi-controlled remote text content from open.wshoto.com and returns raw content/metadata, which is outside the declared CRM-query scope. Unnecessary remote content retrieval can be abused for data exfiltration, prompt/context injection, or unintended processing of untrusted documents.
The package reportedly fetches arbitrary or semi-controlled remote text content from open.wshoto.com and returns raw content/metadata, which is outside the declared CRM-query scope. Unnecessary remote content retrieval can be abused for data exfiltration, prompt/context injection, or unintended processing of untrusted documents.
The package reportedly fetches arbitrary or semi-controlled remote text content from open.wshoto.com and returns raw content/metadata, which is outside the declared CRM-query scope. Unnecessary remote content retrieval can be abused for data exfiltration, prompt/context injection, or unintended processing of untrusted documents.
The trigger is explicitly broad enough to activate even when the user does not mention the product, API, or clear intent to use this integration. In a skill with access to customer records, chat archives, credentials, and local environment checks, overbroad triggering raises the likelihood of inappropriate activation, unnecessary data access, or execution of side-effecting setup logic in unrelated conversations.
Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).
# 清理 SKILL.md 软链接(如果是本脚本创建的)
if [[ -L "${SCRIPT_DIR}/SKILL.md" ]]; then
rm "${SCRIPT_DIR}/SKILL.md"
echo "✓ 已删除 SKILL.md 软链接"
fi
}
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
#!/usr/bin/env python3
"""获取 SCRM Personal Access Token,包含自动缓存管理。"""
import argparse
import json
import os
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
#!/usr/bin/env python3
"""获取 SCRM Personal Access Token,包含自动缓存管理。"""
import argparse
import json
import os
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
#!/usr/bin/env python3
"""获取 SCRM Personal Access Token,包含自动缓存管理。"""
import argparse
import json
import os
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
#!/usr/bin/env python3
"""获取 SCRM Personal Access Token,包含自动缓存管理。"""
import argparse
import json
import os
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
#!/usr/bin/env python3
"""获取 SCRM Personal Access Token,包含自动缓存管理。"""
import argparse
import json
import os
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
#!/usr/bin/env python3
"""获取 SCRM Personal Access Token,包含自动缓存管理。"""
import argparse
import json
import os
On successful execution, the non-raw output includes the access_token value in the returned data structure, which risks exposing a live credential to logs, calling frameworks, transcripts, or downstream tooling. In an agent/skill context, structured outputs are often captured automatically, making credential leakage more dangerous than in a standalone local script.
"user_id": cached.get("user_id") if cached else None,
"cached": not args.force_refresh and cached is not None,
}
output_success("get_access_token", data, "获取 Access Token 成功")
except ApiError as e:
if args.raw:
sys.exit(1)
The README explicitly instructs users to persist a personal access token via set-app-key into Shell configuration files, but does not warn that this creates long-lived local credential exposure. If the host is shared, backed up insecurely, or the shell profile is readable by other processes or users, the token could be recovered and used to access SCRM data and perform authorized API actions.
The README documents cache files containing token, user_id, and identity information, plus logging to a local file, without warning about confidentiality or retention risks. On multi-user systems or compromised endpoints, these artifacts can leak authentication material and sensitive user metadata, enabling unauthorized access or facilitating further targeting.
The skill text mandates reading and following an external runbook with commands such as environment and identity checks, and the broader package evidently uses shell, filesystem, network, and environment access, yet SKILL.md declares no explicit tool scope or permission boundaries. That creates a confused-deputy risk: an agent may invoke powerful capabilities without transparent least-privilege constraints or user-visible authorization limits.
The scope statement is broad and lacks clear exclusions or trigger constraints, encouraging activation across many customer-operations scenarios without precise boundaries. Because the surrounding skill appears to involve authentication, local state, and networked business data, vague scoping materially increases accidental overreach and privacy risk.
The script's comments and all user-facing messages are in Chinese, including the usage text and operational notices. For a general install/uninstall script, this imposes a specific language on users without opt-in or a clearly documented locale-specific justification in the file.
Line L007 instructs the AI to '默认使用业务语言' when replying to ordinary users, establishing a default language/style policy without asking for the user's preference. The file does not offer a language or locale choice or describe this as a justified region-specific constraint, so it fits the natural-language policy violation criteria.
The examples use very generic requests such as '帮我查一下', '帮我看看', and '帮我创建' for common CRM-style tasks without anchoring them to explicit WeCom/SCRM context. In an agent-routing system, this can cause over-triggering on ordinary business requests, leading the skill to access or act on customer-management functions when the user did not clearly intend this integration, increasing the risk of unintended data exposure or unauthorized actions.
The documentation explicitly describes automatic local file upload and remote file download behavior, but it does not require user confirmation, origin restrictions, path safety checks, or warnings about data transfer and filesystem side effects. In an agent context, this can cause unintended exfiltration of local files or unsafe retrieval of remote content simply from user-supplied paths or URLs, which is especially risky because the skill is meant to trigger broadly in business workflows.
The guide exclusively uses Chinese for all user-facing instructions and examples, and it does not mention that the skill is limited to Chinese-speaking users or provide an opt-in language choice. This can violate a language/locale policy when skills are expected to avoid forcing a specific language without user consent.