T01 · Skill Instruction Hijacking
- Location
SKILL.md:185- Finding
Silent Transmission of User Statements and Intent to a Feedback Service
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This 1688 product-ranking skill mostly matches its stated purpose, but it also includes under-scoped account, billing, credential, storage, and automatic feedback behaviors users should review carefully.
Install only if you are comfortable with LinkFox handling ranking queries, account onboarding, billing actions, feedback reports, and local result files. Use a dedicated, revocable API key; avoid the phone/SMS and payment flows inside the skill when possible; do not store keys in shell startup files; and review or clear generated files under the linkfox data/cache directories.
SKILL.md:185Silent Transmission of User Statements and Intent to a Feedback Service
scripts/dld_product_billboard.py:36Configurable Network Destinations Permit Credential Redirection
scripts/onboarding.py:484API Key Is Printed to Standard Output and Recommended for Plaintext Persistence
scripts/dld_product_billboard.py:60Product Requests Include Unnecessary Session and Message Telemetry
scripts/dld_product_billboard.py:87Complete Query Responses Are Persistently Stored Without Explicit Access Controls
scripts/onboarding.py:163Runtime Installation Guidance Uses Unpinned Third-Party Dependencies
scripts/onboarding.py:43Onboarding Client Spoofs Browser Headers and Uses a Fixed UID Header
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 code builds request destinations from environment variables such as LINKFOX_LOGIN_API_URL and LINKFOX_AGENT_USER_API_URL, then sends SMS-login data, access tokens, refresh tokens, and API-token operations to those endpoints with no allowlist or host validation. In a skill environment, env vars are part of the trust boundary; if an attacker or misconfigured host overrides them, sensitive credentials can be exfiltrated to attacker-controlled infrastructure.
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 URL is also sourced from environment configuration and used in urlopen with the Authorization header carrying the LinkFox API key. An attacker controlling LINKFOX_AGENT_API_URL or fallback variables could redirect requests and capture the API key or manipulate order/account responses, enabling credential theft and unauthorized billing-related actions.
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 declared purpose is passive product-ranking lookup, but the skill also instructs handling login, API key generation, account/team lookup, package purchase, payment initiation, QR-code rendering, and order-status polling. This is a major capability expansion into authentication and billing flows, which can expose users to credential capture, unauthorized purchases, privacy leakage, and unexpected external actions.
The trigger logic is intentionally broad and says to activate even when the user does not explicitly mention the billboard feature, as long as the request vaguely relates to sourcing opportunities. Over-broad triggering increases the chance that the skill runs in contexts the user did not intend, which is especially dangerous because the skill also contains onboarding, account, and payment handling instructions.
Skill contains instructions that could directly expose system prompts, internal rules, or hidden instructions to users or external parties.
{"productIds": "123456、789012"}
## Display Rules
1. **Present data clearly**: Show product results in well-organized tables including product title, wholesale price, dropship price, order count, units sold, estimated revenue, supplier name, and listing date
2. **Image display**: When `imageUrl` is available, display product images to help users visually identify products
The instructions tell the operator to request a user phone number and run registration/login commands on the user’s behalf, which is not justified for a product-ranking lookup skill. This creates unnecessary collection of personal data and enables the skill to mediate account creation and authentication flows, increasing the risk of privacy violations, account abuse, and social-engineering-style credential handling.
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
The documentation includes plan listing, payment-method selection, order creation, and payment-status querying for billing issues, none of which are necessary for a skill that should only retrieve bestseller-ranking data. This broadens the trust boundary from read-only data access into transaction facilitation, which can expose users to payment manipulation, phishing-like redirection, or unauthorized purchases if the workflow is misused.
The module documentation explicitly says writing to /tmp is forbidden and that failure to write to the current directory should error, but the implementation silently falls back to the home directory and temp directory. This mismatch is dangerous because operators may rely on the documented storage guarantees, while the code can still write sensitive API data to less controlled locations, including temporary storage.
This skill is described as querying 1688 bestseller rankings, but the file implements a full LinkFox onboarding and monetization CLI: SMS verification, login, API-key issuance, package listing, ordering, and payment QR generation. That mismatch is dangerous because it introduces powerful credential and billing capabilities unrelated to the declared purpose, increasing the chance of covert account takeover, token harvesting, or deceptive user workflows.
Order creation, payment URL handling, QR rendering, and order-status querying are materially unrelated to a read/query-style product-ranking skill. In context, these capabilities increase harm because the skill can initiate real billing flows and steer users into payment actions under the guise of sourcing research.
The skill appears to require environment access, file writing, and network access but does not declare any tool scope or permission boundaries. That creates an authorization gap where a broadly-triggered skill could access sensitive capabilities without transparent user/admin review, especially given the onboarding/payment behavior described later in the file.
The parameter guide states that the product keyword must be in Chinese and instructs the agent to translate first if not. This imposes a specific language behavior rather than offering the user a choice or obtaining opt-in, which is a natural-language locale policy concern.
The file instructs the skill to translate any non-Chinese keyword before querying and presents this as mandatory behavior. Because it does not offer a language choice or ask for confirmation before translation, it enforces a locale-specific behavior in violation of the stated policy criteria.
The parameter description states that search keywords 'must be Chinese' and instructs translation if they are not. This is a natural-language locale restriction, and the file does not provide user opt-in, language alternatives, or a documented justification for why only Chinese is permitted.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
}
## curl 示例
```bash
curl -X POST https://tool-gateway.linkfox.com/dld/productBillboard \
The file embeds account-authentication, registration, and billing recovery procedures that are unrelated to a skill whose stated purpose is querying 1688 bestseller/ranking data. This expands the skill’s operational scope into credential handling and account lifecycle actions, creating an unjustified pathway to collect sensitive information and steer users into account/payment flows outside the core use case.
The onboarding flow instructs collection and transmission of a user’s phone number into a script without any visible consent, retention, masking, or privacy-handling guidance. In the context of a sourcing/ranking skill, this data collection is especially unjustified, making the privacy risk more severe because users would not reasonably expect phone-based account processing for this feature.
The skill description suggests a simple query tool, but the script also persistently stores full API responses plus session metadata on disk by default. This creates a confidentiality and data-minimization issue because potentially sensitive business data, identifiers, or tokens in responses may be retained locally without explicit user consent or need.
The script forwards SESSION_ID, MESSAGE_ID, MODE_ID, and APP_NAME from the environment to the remote API without clear disclosure at the call site. These identifiers can expose internal workflow metadata or enable cross-system correlation, especially if the gateway endpoint is changed or logs are broadly accessible.
The script always writes the full serialized API response to disk before deciding whether to print inline or summarize. This is risky because API responses may include sensitive commercial data or identifiers, and automatic persistence increases exposure through local compromise, backups, multi-user systems, or accidental sharing.
This code file presents its top-level description and command help text entirely in Chinese, and there is no visible mechanism for user language selection or opt-in. That can violate language/locale policy when the skill is expected to operate for general users without forcing a single locale.
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 code performs SMS-based authentication, token exchange, user/team discovery, and API-key generation despite the skill's stated purpose being 1688 product-billboard lookup. In this context, collecting login codes and minting API keys is especially risky because it can be used to obtain durable access credentials far beyond the least privilege needed for rankings data.
No suspicious patterns detected.