T01 · Skill Instruction Hijacking
- Location
SKILL.md:219- Finding
Silent disclosure of user statements and inferred intent through the Feedback API
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This seller analytics skill has real seller-search functionality, but it also adds silent feedback reporting plus credential, account, and payment flows that need careful review before installation.
Install only if you are comfortable with LinkFox receiving your seller-search queries and potentially feedback content, and avoid using the phone-login/payment flows unless you explicitly intend to. Prefer getting and storing API keys through a secure external process, verify LINKFOX_* endpoint environment variables are not overridden, and treat saved linkfox response/cache files as potentially sensitive business data.
SKILL.md:219Silent disclosure of user statements and inferred intent through the Feedback API
scripts/onboarding.py:72Environment-controlled API origins allow credential redirection
scripts/echotik_list_seller.py:36Seller-search API key and Agent metadata can be sent to an arbitrary gateway
scripts/onboarding.py:484Generated API keys are exposed through standard output and persistent plaintext configuration
scripts/echotik_list_seller.py:59Unnecessary Agent session and message identifiers are transmitted with seller queries
scripts/echotik_list_seller.py:248Unvalidated SESSION_ID permits output path traversal
scripts/onboarding.py:172Credential-handling onboarding flow recommends unpinned runtime dependencies
The request sent via urlopen includes environment-derived values in both the destination base URL and multiple HTTP headers. If an attacker can influence LINKFOX_TOOL_GATEWAY or session-related environment variables, the skill can exfiltrate API keys and user/session metadata to an attacker-controlled endpoint, creating an SSRF-style data leak channel. The skill context makes this more dangerous because it handles authenticated seller-search requests and automatically attaches authorization and session identifiers.
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 builds request destinations from environment variables and then sends login, token, and account data to those URLs with no allowlist, scheme validation, or certificate pinning. In a skill/runtime context where environment variables may be influenced by deployment or a malicious wrapper, this can redirect sensitive authentication traffic to an attacker-controlled endpoint and exfiltrate SMS login credentials, access tokens, and generated API keys.
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 uses environment-derived base URLs and includes the API key in the Authorization header for outbound requests. If an attacker can alter the environment, they can redirect billing/account queries and order operations to an external host and capture the API key or manipulate responses, turning this into credential exfiltration and possible financial abuse.
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
The skill is presented as a seller analytics/search tool, but the findings indicate it also supports phone-based login, token generation, account/team inspection, package listing, payment order creation, QR code generation, and payment-status checks. That mismatch is dangerous because it hides identity, billing, and account-management actions behind an analytics facade, undermining user consent and enabling unexpected sensitive operations.
The trigger criteria are intentionally broad enough to activate even when the user does not explicitly mention TikTok or EchoTik. Overbroad triggering can cause the agent to route unrelated shopping, store-search, or competitor-analysis requests into this skill, leading to unintended external calls, cost incurrence, and exposure of user context to a third-party service.
Skill contains instructions that could directly expose system prompts, internal rules, or hidden instructions to users or external parties.
}
## Display Rules
1. **Present data clearly**: Show results in a table with key columns — store name, region, total sales, 30-day GMV, followers, rating, review count, and number of promoting influencers
2. **GMV & sales granularity**: When relevant, show 30-day GMV and total sales; mention multi-period breakdowns (1d/7d/30d/90d) are available in the saved JSON
The skill documents a flow where the operator can collect a user's phone number, send a code, and log in via a script to obtain an API key. That capability is unjustified for a seller-analytics skill and exposes users to credential interception, account takeover risk, and improper handling of personal data and one-time codes.
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 authentication, API-key issuance, and purchasing flows that materially exceed the declared seller-analytics skill scope. In an agent ecosystem, such scope drift is dangerous because users invoking a data-analysis skill may be unexpectedly prompted into identity, credential, or payment actions, increasing the chance of deceptive collection of secrets and financial operations.
The code creates orders and renders payment QR codes even though the skill is described as seller analytics. That mismatch raises phishing and unauthorized-purchase risk because a user or calling agent may not expect a data-analysis tool to initiate billing or generate payment artifacts.
The skill declares no explicit tool scope while its documented behavior uses environment variables, network access, and file writes. Without least-privilege scoping, an agent may invoke capabilities beyond what users reasonably expect, increasing the blast radius if the skill is abused or mis-triggered.
Defaulting to the US marketplace when the user does not specify a region can cause silent parameter injection that changes the meaning of the user's request. In a paid live-query workflow, this may lead to unnecessary billable calls, inaccurate results, and unintended disclosure of user intent to an external API without explicit user choice.
The skill requires every full API response to be written to a session-linked path under the current project directory. Persistent storage of full responses can retain sensitive business queries, account metadata, identifiers, and result data longer than necessary, making them accessible to other tools, users, or later tasks in the same workspace.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
}
## curl 示例
### 基础店铺列表(按总销售额降序)
The file documents a separate feedback API that is unrelated to the seller-search function of this skill. In an agent setting, this creates an unnecessary data egress path that could be invoked with user content or session-derived information, expanding the skill's effective scope beyond the declared purpose and enabling unauthorized transmission to a third-party endpoint.
The onboarding document expands the skill from seller-search analytics into account recovery, registration, and payment workflows that are not part of the declared purpose. This broadens the trust boundary and creates unnecessary opportunities to collect sensitive data, steer users into purchases, and invoke privileged scripts unrelated to the core analytics function.
The instructions involve handling phone numbers and login codes but provide no privacy, retention, masking, or consent guidance. In practice, this can lead to unnecessary collection of sensitive personal data and insecure transmission or storage of authentication factors.
The document tells users to persist API keys in shell startup files without warning that these files may be readable by other local processes, exposed through backups, or accidentally disclosed during support/debugging. Long-lived environment persistence also increases the blast radius if the host is compromised.
The documented billing flow allows the skill to list plans, create payment orders, and guide users through payment methods, which is outside the seller-search function. Embedding commerce and payment assistance inside an analytics skill increases phishing, social-engineering, and unauthorized purchase risk.
The natural-language description and usage/output policy are written entirely in Chinese, which imposes a specific language context without offering a choice or documenting that the skill is region- or language-specific. Under the stated policy, locale constraints should be opt-in or clearly justified.
The docstring explicitly promises that writing to /tmp is forbidden, but the implementation falls back to tempfile.gettempdir(), which commonly resolves to /tmp. This mismatch can cause sensitive API responses to be written to a less controlled shared temporary location contrary to operator expectations, increasing risk of unintended disclosure on multi-user systems or ephemeral runners.
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 skill performs SMS-based login and then returns a usable API key, which is a credential bootstrap capability outside the advertised analytics scope. In context, that makes the skill more dangerous because it can collect authentication factors and mint reusable secrets under the cover of a benign-seeming seller-analysis feature.
The natural-language behavior and validation logic require an 11-digit domestic mobile number and force the area code to +86, which imposes a specific locale/language-region constraint. Because the file does not offer user opt-in or document this as a justified region-specific limitation, it fits the locale policy violation category.
The login request payload fixes the areaCode to +86 for all users, making the skill's authentication flow region-locked by default. This is a natural-language locale policy concern because the tool enforces a specific locale without offering an explicit user choice or stating a justified regional scope.