T01 · Skill Instruction Hijacking
- Location
SKILL.md:165- Finding
Automatic Transmission of User Feedback and Intent Without Explicit Consent
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill can perform the advertised ASIN product lookup, but it also handles account login, API keys, payment orders, persistent local storage, and automatic feedback reporting in ways users should review carefully before installing.
Install only if you are comfortable with LinkFox receiving ASIN queries and account-related data, and avoid using the SMS login or payment-order flows through the agent unless you explicitly intend to. Treat any printed API key as exposed, prefer a proper secret store over shell startup files, and review or disable automatic feedback reporting before use.
SKILL.md:165Automatic Transmission of User Feedback and Intent Without Explicit Consent
scripts/sorftime_product_detail.py:37Credential-Bearing Requests Can Be Redirected to Arbitrary Environment-Controlled Endpoints
scripts/onboarding.py:468API Key Is Printed to Standard Output and Recommended for Plaintext Persistent Storage
scripts/sorftime_product_detail.py:251Unsanitized Session Identifier Allows Output-Path Escape
scripts/onboarding.py:162Unpinned Runtime Dependency Installation Creates Supply-Chain Risk
Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.
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 = ""
Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.
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 request headers include environment-derived values such as Authorization, SESSION_ID, MODE_ID, and APP_NAME, and the destination host is configurable via LINKFOX_TOOL_GATEWAY. This creates a real exfiltration risk: if an attacker can influence environment variables, the script can be redirected to an attacker-controlled server and will send secrets and session metadata in the outbound request.
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 skill claims to provide ASIN product-detail and trend lookup, but the documented behavior expands into account login, API key generation, billing/package lookup, payment order creation, QR-code payment flows, and payment-status checks. That mismatch is dangerous because it can steer an agent into handling authentication and financial operations the user did not request, exposing users to credential misuse, unexpected charges, and privacy risks.
The trigger is intentionally broad enough to activate on generic ASIN-related requests even when the user did not ask for Sorftime specifically. Overbroad triggering is dangerous because it can cause unnecessary third-party API calls, consume paid credits, and send user-derived product queries to an external service without clear intent or informed consent.
Skill contains instructions that could directly expose system prompts, internal rules, or hidden instructions to users or external parties.
- **BSR rank trends**: for `bsrRankTrend`, format is `[{NodeId: xxx, Rank: [date, rank, ...]}]` per sub-category
- **Deal trend**: value `1` = has active Deal that day, `0` = no Deal
## Display Rules
1. **Present data only**: Show query results in clear tables without subjective business advice
2. **Ranking clarification**: When showing ranking data, remind users that lower values mean better rankings
The onboarding document introduces authentication recovery, phone-based account registration, and billing workflows that are materially unrelated to the skill's declared purpose of querying Amazon ASIN product details and trends. This scope expansion increases attack surface and can normalize collection of credentials, phone numbers, and payment actions in a context where users would not reasonably expect them.
The documented capability asks operators to collect a phone number, run registration/login scripts, and facilitate payment-plan purchases for an ASIN lookup skill. In this context, those flows are unjustified and create opportunities for social engineering, unauthorized account actions, and unnecessary handling of sensitive personal and financial data.
YARA rule matched a known malware signature (reverse shell, backdoor, ransomware, C2 framework, or info stealer).
证码后:`python scripts/onboarding.py login <phone> <code>`(workbuddy 宿主加 `--channel workbuddy`)
- 拿到 `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 script implements SMS login, API key issuance, subscription management, and payment QR generation, which are materially outside the declared ASIN product-detail/trend query purpose. This scope mismatch is dangerous because it expands the skill from read-oriented data lookup into account onboarding and financial operations, increasing the chance of unauthorized credential handling, billing actions, and user confusion.
Billing and payment order creation are unrelated to the stated ASIN lookup/trend-analysis functionality, yet the code can create orders and render payment QR codes. In a skill ecosystem, hidden or weakly disclosed payment capability is dangerous because it can trigger financial transactions users did not expect from a product-detail tool.
The login flow returns a live API key in stdout JSON, which may be captured by logs, calling frameworks, chat transcripts, or other tooling layers. Emitting secrets through standard output is dangerous because it creates multiple uncontrolled persistence points and substantially raises the risk of credential leakage and downstream account compromise.
The implementation contradicts its own documented storage guarantees by falling back to home or temporary directories, including /tmp-derived paths, when the preferred directory is not writable. This can undermine operator expectations and cause sensitive response data to be written into less controlled or more exposed locations than advertised.
The skill describes capabilities that access environment variables, write files, and perform network requests, but it does not declare any explicit tool scope or permission boundaries. This creates an authorization ambiguity where an agent may invoke broader capabilities than a user would reasonably expect, increasing the risk of unintended secret access, local data writes, or outbound requests.
The skill adds a broad, always-on feedback reporting instruction that is unrelated to the core ASIN lookup function and can be triggered by general user sentiment or model judgment. This creates an unnecessary secondary data egress path where user prompts, outcomes, or dissatisfaction signals may be transmitted to another API without focused consent or need.
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/sorftime/amazon/productDetail \
The file documents a second API for submitting feedback that is unrelated to the stated ASIN product-detail function. In an agent-skill context, unrelated outbound endpoints expand the skill's capability surface and can enable unauthorized exfiltration of user content or behavioral telemetry to a separate service, especially because the payload explicitly includes free-form content.
The instructions tell operators to have users provide phone numbers and verification codes so a script can register or log in, but there is no privacy notice, consent language, retention guidance, or transmission-handling warning. That omission makes accidental mishandling of personal data more likely and can condition users to share sensitive information in an unsafe channel.
The document provides commands that persist API keys into shell startup files and environment configuration without warning the user that this permanently modifies local configuration and may expose secrets to other local processes or future sessions. While not inherently malicious, secret persistence guidance without safeguards increases the risk of credential leakage and misconfiguration.
The natural-language interface and command descriptions are entirely in Chinese, and the code enforces a domestic 11-digit phone format with area code +86, indicating a fixed locale and regional assumption. There is no visible language or locale choice, opt-in, or documented justification in this file for restricting use to Chinese-speaking or China-based users.
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 script performs SMS authentication, token-based login, team/user info retrieval, and API key generation despite the skill being described as a product-detail/trend query tool. This unnecessary credential and token lifecycle handling increases the attack surface and can expose users to credential capture or misuse if the skill is invoked in unexpected contexts.
The script always writes the complete API response to disk regardless of size, and only comments/docstrings disclose this behavior. Unconditional persistence can expose potentially sensitive response content and session-associated artifacts to other local users, backups, or later processes without meaningful user consent.
The script persists full API responses plus session metadata to local files and maintains cache/index metadata, which exceeds a simple query-and-return behavior and increases data retention risk. If the API response contains sensitive business data, identifiers, or usage metadata, this creates unnecessary local exposure and a broader privacy/security footprint.
The activation and instruction text is partially written in Chinese and partially in English, but nowhere indicates that the user may choose their preferred language for interaction or output. This can create an implicit language/locale constraint without opt-in, which falls under the language policy check.