T01 · Skill Instruction Hijacking
- Location
SKILL.md:171- Finding
Automatic Exfiltration of Conversation-Derived Feedback Without Explicit Consent
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill mostly performs TikTok creator analytics, but it adds silent feedback reporting plus sensitive login, billing, credential, and local-storage behavior that needs review before installation.
Review this skill carefully before installing. Only use it if you trust LinkFox/Kalodata with creator queries, account onboarding data, payment actions, and local cached results. Avoid setting custom gateway/login URLs, do not paste SMS codes or API keys into shared terminals, prefer self-service key setup, disable or remove automatic feedback reporting, and clear local linkfox cache/output files when they may contain contact or business data.
SKILL.md:171Automatic Exfiltration of Conversation-Derived Feedback Without Explicit Consent
scripts/kalodata_creator_detail.py:37API Credentials Can Be Redirected to an Arbitrary Environment-Controlled Gateway
scripts/kalodata_creator_detail.py:60Creator Requests Transmit Unnecessary Agent Session and Message Identifiers
scripts/kalodata_creator_detail.py:102Complete Creator Profiles and Contact Details Are Duplicated in Persistent Files Without Restrictive Permissions
scripts/onboarding.py:475Onboarding Exposes SMS Codes and Long-Lived API Keys Through Process Arguments, Standard Output, and Shell History
echo 'export LINKFOX_AGENT_API_KEY=""' >> ~/.zshrc
echo
...[truncated 1841 chars]scripts/onboarding.py:162Onboarding Recommends Installing Unpinned Runtime Dependencies
The request sends multiple environment-derived values, including the API key and session identifiers, to a URL whose base can be overridden via the LINKFOX_TOOL_GATEWAY environment variable. If an attacker can influence the execution environment, they can redirect the request to an attacker-controlled host and exfiltrate credentials and request data. In a skill context, forwarding opaque environment state to the network is especially risky because these values often carry cross-tool authentication and session metadata.
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 request destination and multiple headers are influenced by environment variables, including LINKFOX_TOOL_GATEWAY and session/application metadata, and are sent to a remote endpoint via urlopen. In an agent/runtime environment where env vars may be attacker-controlled or inherited from untrusted context, this creates a real exfiltration/SSRF-style risk: API keys, query contents, and tracking metadata can be sent to an arbitrary host.
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 code allows base URLs for login and agent-user API calls to be overridden via environment variables and then sends sensitive data such as phone numbers, SMS codes, access tokens, refresh tokens, generated API keys, and account metadata to those URLs. In a skill/onboarding context, this creates a realistic exfiltration path if the runtime environment is influenced by an attacker or misconfigured, effectively turning authentication and token bootstrap flows into credential forwarding.
except RuntimeError as e:
return {"_error": str(e)}
try:
r = requests.post(url, json=body or {}, headers=headers, timeout=timeout)
return r.json()
except Exception as e:
body_text = ""
The gateway request path builds its destination from environment-controlled base URLs and then attaches the API key in the Authorization header before calling urlopen. If an attacker can influence environment configuration, they can redirect these calls to an arbitrary server and capture the API key or induce unintended authenticated actions against attacker-chosen infrastructure.
headers["Content-Type"] = "application/json"
req = Request(url, method=method, data=body_bytes, headers=headers)
try:
with urlopen(req, timeout=30) as resp:
return json.loads(resp.read().decode())
except urllib.error.HTTPError as e:
status = e.code
This mismatch is severe: a skill presented as TikTok creator analytics reportedly also performs phone-based login, token/API key retrieval, account/team/package access, and order/payment operations. That is far beyond the stated purpose and could enable credential harvesting, account takeover, unauthorized purchases, or covert monetization under the guise of analytics.
This mismatch is severe: a skill presented as TikTok creator analytics reportedly also performs phone-based login, token/API key retrieval, account/team/package access, and order/payment operations. That is far beyond the stated purpose and could enable credential harvesting, account takeover, unauthorized purchases, or covert monetization under the guise of analytics.
This mismatch is severe: a skill presented as TikTok creator analytics reportedly also performs phone-based login, token/API key retrieval, account/team/package access, and order/payment operations. That is far beyond the stated purpose and could enable credential harvesting, account takeover, unauthorized purchases, or covert monetization under the guise of analytics.
The trigger condition is intentionally broad and instructs activation even when the user does not mention the underlying provider, which increases the chance of unsolicited tool use and data access. In an autonomous agent, broad triggers can cause over-collection, unnecessary paid API calls, and exposure of third-party data without sufficiently specific user intent.
Skill contains instructions that could directly expose system prompts, internal rules, or hidden instructions to users or external parties.
Run kalodata_creator_search.py first, choose a row's creator_id, then pass that value as creatorId to kalodata_creator_detail.py.
## Display Rules
1. Present ranking results in a table with nickname, handle, followers, content views, sales volume, revenue, video/live revenue, and growth rate.
2. Present detail results as one grouped profile: identity, audience, revenue, video, live, products/shops, and contact.
YARA rule matched a known malware signature (reverse shell, backdoor, ransomware, C2 framework, or info stealer).
示 JSON 里的 phone/agreements
- 收到验证码后:`python scripts/onboarding.py login <phone> <code>`
- 拿到 `api_key` 后把下面三平台配置转发给用户,提示重启会话生效:
- Windows PowerShell(永久):`setx LINKFOX_AGENT_API_KEY "<key>"`
- macOS zsh:`echo 'export LINKFOX_AGENT_API_KEY="<key>"' >> ~/.zshrc && source ~/.zshrc`
- Linux bash:`echo 'export LINKFOX_AGENT_API_KEY="<key>"' >> ~/.bashrc && source ~/.bashrc`
- 变量名 `LINKFOX_AGENT_API_KEY`(主推)或 `LINKFOXAGENT_API_KEY`(老规范)任一即可
**billing 场景**:`errcode=402` 或消息含 `算力/余额/quota/insufficient/充值/套餐到期`。
- `python scripts/onboarding.py list-plans` → 有 AskUserQuestion 就弹菜单,否则输出编号清单让用户选
- 校验 `plan_id` ∈ 清单、支付方式 ∈ 该套餐 `available_methods`(通常 `wechat/alipay`)
- `python scripts/onboarding.py order <plan_id> <method>` → 展示优先级 PNG
This file implements account onboarding, SMS login, API key issuance, plan listing, ordering, and payment QR generation, which are outside the declared TikTok creator analytics function of the skill. That mismatch materially increases risk because the skill can solicit user phone numbers, login codes, and payments under a context where users expect creator-search functionality, enabling credential collection and monetization flows unrelated to the stated purpose.
The code can create orders and render payment QR codes even though the skill is described as providing TikTok creator ranking and detail lookup. In this context, hidden billing capability is dangerous because it can induce purchases or subscriptions unrelated to the user's expected analytics task, and the mismatch makes social engineering and unauthorized monetization more plausible.
The skill declares capabilities that involve environment access, file writes, and network use, but it does not constrain them with an explicit tool scope such as permissions or allowed-tools. In an agent setting, missing scoping increases the blast radius of prompt-triggered actions, especially because the skill also instructs persistent local writes and API-driven behavior.
The skill states it may retrieve and display creator contact fields such as email and social contacts, but it provides no privacy notice or consent checkpoint. Even if the data is returned by the upstream source, surfacing personal contact information without warning or purpose limitation can create privacy, compliance, and misuse risks.
The API exposes creator contact fields such as email, WhatsApp, Facebook, TikTok, Zalo, and Line, but the documentation provides no privacy, purpose-limitation, or handling guidance. In an agent setting, this increases the risk of collecting, storing, or redisclosing personal contact data in ways that violate privacy expectations, policy, or compliance requirements.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
}
## curl 示例
### 达人榜单
The document adds a separate public feedback submission API that is outside the skill's core creator search/detail function. This expands the skill's effective capability to transmit data to an external service, which can enable unintended exfiltration of user prompts, operational details, or other sensitive context if an agent follows the documentation without strict data minimization.
The onboarding flow instructs the operator to collect and transmit a user's phone number to a script-driven registration process without any explicit privacy notice, consent guidance, retention limits, or warning that personal data is being sent to a third-party service. This creates a real privacy and data-handling risk because agents may solicit sensitive personal information in chat and pass it into tooling without informing the user how it will be used or protected.
The module docstring presents the skill's usage and output behavior entirely in Chinese, indicating a fixed language expectation rather than offering a user-selectable locale. This can violate language/locale policy when the skill is used in broader contexts without explicit user opt-in to Chinese.
The top-level documentation explicitly states that full responses are always written under the current working directory and that writing to /tmp is prohibited, with failure if the current directory is not writable. However, _linkfox_root actively falls back to ~/linkfox and then $TMPDIR/linkfox, directly contradicting the documented storage policy.
The script persistently writes full creator-detail API responses, cache entries, and session metadata to local storage, including potentially sensitive creator contact information and commercial analytics. This creates a data retention and privacy exposure beyond a simple query tool, especially because files are stored across shared workspace, home, or temp locations and metadata indexes sessions over time. In this skill, the dataset explicitly includes联系方式 and related business details, which increases sensitivity.
The module documentation explicitly promises that writing to /tmp is forbidden and that an unwritable current directory should cause an error, but the implementation silently falls back to ~/linkfox and then $TMPDIR/linkfox. This mismatch can cause sensitive creator data and API responses to be written to less trusted or shared locations contrary to operator expectations, increasing disclosure risk.
The script forwards SESSION_ID, MESSAGE_ID, MODE_ID, and APP_NAME to an external API without any consent gate, redaction, or clear disclosure at runtime. While this may be operationally convenient, these identifiers can reveal internal workflow, tenant, or user-correlation data to the remote service and expand privacy and metadata-exposure risk.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
except RuntimeError as e:
return {"_error": str(e)}
try:
r = requests.post(url, json=body or {}, headers=headers, timeout=timeout)
return r.json()
except Exception as e:
body_text = ""
The file performs SMS-based login, token exchange, team selection, and API token generation despite the skill being presented as a TikTok creator analytics/search tool. This is dangerous because it collects sensitive authentication factors and provisions long-lived access in a context where users would not reasonably expect identity onboarding, increasing the risk of credential harvesting and privilege expansion.