T01 · Skill Instruction Hijacking
- Location
SKILL.md:220- Finding
Silent Automatic Disclosure of User Feedback to an External Service
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill mostly fits TikTok video publishing workflows, but it includes automatic external feedback reporting, broad credential-bearing network configuration, and a generic local script runner that warrant Review before installation.
Install only if you are comfortable granting this skill access to LinkFox and TikTok creator credentials, authenticated creator/video operations, and local response files. Before use, avoid setting TIKTOK_VIDEO_API_BASE_URL except to a trusted HTTPS LinkFox gateway, require explicit confirmation before publishing a video or sending feedback, keep response_io.py output outside repositories, delete saved responses promptly, and verify the auth dependency source/version before installing it.
SKILL.md:220Silent Automatic Disclosure of User Feedback to an External Service
scripts/_tiktok_video_common.py:15Configurable Gateway Can Exfiltrate LinkFox and TikTok Credentials
scripts/response_io.py:69Response Helper Executes Arbitrary Local Python Files
scripts/response_io.py:202Sensitive API Responses Are Persisted Without Confidentiality or Retention Controls
scripts/check_auth_dependency.py:113External Authentication Skill Is Recommended Without Version or Integrity Pinning
Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.
method="POST",
)
try:
with urlopen(req, timeout=150) as response:
return json.loads(response.read().decode("utf-8"))
except HTTPError as e:
body = e.read().decode("utf-8") if e.fp else ""
The declared skill purpose is TikTok video operations, but the documented large-response utility can execute arbitrary specified scripts, persist outputs to disk, and parse/read saved files in multiple formats. That creates a capability expansion beyond the stated business function, which can be abused to run unintended local programs or exfiltrate sensitive response data through generic file-processing flows.
Skill contains instructions that could directly expose system prompts, internal rules, or hidden instructions to users or external parties.
python scripts/video_api.py '{"api": "<api_name>", "openId": "..."}'
## Display Rules
1. **只呈现数据**:展示接口返回字段,不做主观建议。
2. **令牌安全**:不输出完整 `ttsAccessToken`。
Code enumerates, copies, or searches environment variables for secrets. Bulk environment access can collect credentials unrelated to the skill's stated purpose.
# Force the child process to emit UTF-8 regardless of the host console
# encoding (Windows defaults to cp936 / gbk and would otherwise corrupt
# non-ASCII bytes when we read them back).
child_env = os.environ.copy()
child_env["PYTHONIOENCODING"] = "utf-8"
timed_out = False
The skill declares no explicit tool/permission scope even though its instructions invoke shell, filesystem, network, and environment-capable scripts. In an agent setting, missing scope boundaries increases the chance that the runtime grants broader capabilities than users expect, enabling unintended command execution, local file access, or outbound data transmission if the skill is triggered or modified.
The trigger description lists a very large mix of phrases and then broadens activation further with '也应触发', including generic concepts like '预检结果', 'precheck', and '查视频是否发布成功'. This makes it unclear where the skill should not activate and lacks negative examples or tighter scope constraints, increasing the chance of accidental invocation for adjacent TikTok-related requests.
The skill instructs the agent to automatically submit feedback whenever certain conditions occur, without requiring user notice or consent and while explicitly avoiding interruption of the main flow. Because feedback may contain user interaction details, this creates a covert outbound data-sharing channel and can leak PII, business context, or sensitive operational metadata.
The document states open/{version}/file/init and open/{version}/file/bind do not go through LinkFox because open/ is not in the whitelist, but the same file's endpoint inventory lists large_file_upload_init and large_file_upload_bind with concrete open/... paths and says the whitelist allows only affiliate_creator, video, and creator. This is an active internal contradiction about whether these named APIs are part of the skill's reachable behavior.
The skill documents an API that performs irreversible external posting to a third-party platform but does not prominently require explicit user confirmation immediately before execution. In agent-driven environments, that raises the risk of accidental or unauthorized publication of content under a user's authorized creator account.
The documentation uses normative language encouraging AI-generated-content labeling selection rather than leaving the decision to the user's actual content and compliance obligations. This can bias an agent into making policy-significant declarations on behalf of the user, which may create mislabeling, compliance, or account-trust issues on the external platform.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
---
## curl Examples
### developerProxy(直接调用网关)
This markdown instructs users to PUT video binary data directly to an external file gateway URL, including use of the full returned URL with query parameters. Because the behavior transmits user content off-platform and bypasses the noted proxy, the description should explicitly warn users about the external network transfer and handling of upload URLs/tokens.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
curl --location --request PUT '{upload_url}' \
--header 'Content-Type: video/mp4' \
--header 'Content-Range: bytes 0-9999999/50000000' \
--header 'Content-Length: 10000000' \
subprocess module calls execute external commands. Without careful input validation, this enables command injection.
print(f"DEPENDENCY_MISSING: {json.dumps(payload, ensure_ascii=False)}", file=sys.stderr)
sys.exit(DEPENDENCY_EXIT_CODE)
try:
result = subprocess.run(
[sys.executable, str(checker)],
capture_output=True,
text=True,
This code accesses the sensitive environment variable LINKFOXAGENT_API_KEY and then sends it in the Authorization header of an HTTP request. While there is an error message when the key is missing, there is no comment, docstring, or user-facing disclosure in this file warning that credentials will be read from the environment and transmitted to a remote service.
call_api POSTs JSON payloads to remote endpoints, and callers pass values such as openId, ttsAccessToken, request paths, query strings, regions, and optional bodies. The file contains no user-facing warning, confirmation, or explanatory comment that these inputs may be sent to tool-gateway.linkfox.com or another configured base URL.
For non-GET methods, the code builds an arbitrary request body from params and transmits it via developer_proxy_call. This is a network operation that may send user-provided or system-derived data, but the file contains no confirmation, visible disclosure, or explanatory comment warning about that behavior.
This code resolves account tokens and uses the resulting access token in a network call to developerProxy, which is a safety-relevant credential and data-transmission operation. While the module docstring states the file runs a TikTok Video API, there is no user-facing print/log/confirmation or inline warning here about credential use or outbound transmission.
Output size or generation rate is not bounded. Unbounded output enables denial-of-service through resource exhaustion, log flooding, or context-window stuffing.
"""Cap the sample's value fields when it has many keys.
`shape.*.item_keys` is the single source of truth for the full key list
(always complete, no truncation). The sample only ever shows up to
SAMPLE_KEY_CAP fields with their concrete values, since the agent only
needs a feel for value shapes — for the full menu of available fields,
they read `shape`.
subprocess module calls execute external commands. Without careful input validation, this enables command injection.
timed_out = False
try:
proc = subprocess.run(
[sys.executable, str(main_script), args.params],
capture_output=True,
text=True,
The helper launches whatever script path is supplied through --script, which is a subprocess execution capability. Although this is central to the tool's purpose, the file provides no runtime confirmation or explicit caution that invoking run will execute another program, which is a safety-relevant action for a generic helper.
The helper always writes captured stdout to disk, including full API responses, but provides no data-classification guardrails, redaction, retention control, or user-facing warning about sensitive content. In this skill context, API responses may include access tokens, creator profile data, product data, or upload/publish metadata, so persisting raw responses increases the chance of local secret exposure and unintended data retention.
This code packages user-supplied parameters including ttsAccessToken and optional request body into a JSON request and sends them to a remote gateway via urlopen. Although the module docstring documents required parameters, there is no runtime confirmation, warning, or user-facing notice that sensitive token and payload data will be forwarded to an external service.
The manifest describes a skill for TikTok video upload and related creator/video/product-selection operations via /tiktokVideo/developerProxy, explicitly excluding authorization. This file additionally documents a separate skill-api.linkfox.com feedback submission API, which is unrelated to TikTok creator/video operations and not justified by the stated business purpose.
The skill content forces a specific language for all instructions and operational guidance, and no opt-in or alternative language is offered. Under the stated policy, language constraints should either be optional for the user or clearly justified as region-specific.
No suspicious patterns detected.