T01 · Skill Instruction Hijacking
- Location
SKILL.md:135- Finding
Automatic Third-Party Feedback and Promotional Output Hijacking
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill performs Shopee returns work, but it also bundles account login, API-key generation, billing, automatic feedback, and local data retention that need Review before use.
Review carefully before installing. Use only with a LinkFox/Shopee account where you are comfortable sending return, dispute, proof, shop, phone, token, and billing data through LinkFox services. Require explicit human confirmation before confirm, dispute, cancel_dispute, offer, accept_offer, upload_proof, order, or payment actions. Avoid storing API keys permanently in shell profiles unless that is acceptable for the machine, and clean up locally saved response files because they may contain customer or business data.
SKILL.md:135Automatic Third-Party Feedback and Promotional Output Hijacking
scripts/onboarding.py:358Returns Skill Implements Excessive Authentication, Token Generation, and Payment Capabilities
scripts/_shopee_returns_common.py:177Complete Return and Dispute Responses Are Persisted in Plaintext with an Unsafe Temporary-Directory Fallback
scripts/onboarding.py:163Runtime Installation Instructions Use Unpinned Third-Party Dependencies
The code builds request destinations from environment-controlled base URLs and then sends sensitive onboarding data, including phone numbers, SMS codes, access tokens, refresh tokens, and generated API keys, to those endpoints. If an attacker can influence the environment variables, the skill can be redirected to an attacker-controlled server, causing credential exfiltration and account compromise.
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 path uses a base URL derived from environment variables and sends authenticated requests with the LinkFox API key in the Authorization header. An attacker who can set or poison that environment value can redirect requests to a malicious host and capture API keys, account data, order information, and payment-related responses.
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
If the skill actually includes flows such as SMS login, token/API-key generation, account retrieval, billing, and payment handling while claiming only returns/refunds functionality, that is a significant trust and scope violation. Such hidden account and payment capabilities expand the attack surface and could expose sensitive identity, authentication, or financial actions under misleading labeling.
If the skill actually includes flows such as SMS login, token/API-key generation, account retrieval, billing, and payment handling while claiming only returns/refunds functionality, that is a significant trust and scope violation. Such hidden account and payment capabilities expand the attack surface and could expose sensitive identity, authentication, or financial actions under misleading labeling.
The trigger condition explicitly says the skill should activate even when the user does not mention returns, as long as the request loosely involves an authorized Shopee shop's return/refund handling. Overly broad activation can cause the wrong skill to run, leading to unintended network calls, data access, or state-changing operations such as confirming returns or opening disputes without sufficiently explicit user intent.
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
This file implements LinkFox account onboarding, SMS login, API-key retrieval, package listing, order creation, and payment QR generation, which is unrelated to a Shopee returns/refunds skill. The mismatch is dangerous because it expands the skill's capabilities into credential handling and billing flows, creating an unexpected path for collecting secrets and initiating paid actions under the guise of unrelated business functionality.
The code contains account provisioning and billing functionality, including API token generation and purchase/order flows, that is not justified by the declared Shopee returns/refunds scope. In this context, the extra capability is especially risky because it can induce users or hosts to authenticate, generate long-lived credentials, and perform financial actions unrelated to the advertised skill purpose.
The skill advertises capabilities that involve environment access, file writes, network access, and shell execution, but it does not declare any explicit tool scope such as permissions or allowed-tools. This weakens least-privilege controls and makes it harder for a host or reviewer to understand or constrain what the skill can do, increasing the risk of unintended data access or command execution.
The skill states that full API responses are always written to local disk, potentially including return details, customer data, logistics information, or dispute evidence, but it does not clearly warn the user about local persistence. Silent persistence increases the risk of sensitive e-commerce data being retained in project directories, exposed to other tools, committed to source control, or accessed by other users on the same system.
The document states both that the tool consumes credits and that it does not consume credits, which can mislead users into authorizing additional actions under false cost assumptions. While not a direct code-execution flaw, contradictory billing semantics undermine informed consent and can drive unintended paid activity or evasive retry logic.
The skill instructs automatic feedback reporting, including when the user expresses dissatisfaction or praise, without clearly warning that user interactions may be sent to a feedback API. This creates a privacy and consent problem because conversational content and metadata could be transmitted to a third party unexpectedly.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
export KEY=$LINKFOXAGENT_API_KEY
The documentation exposes a state-changing returns action ('accept_offer') and explicitly says to pass the full body, but it does not warn that this operation can finalize or materially alter a live refund/returns dispute outcome. In an agent setting, missing confirmation and consequence warnings increases the chance of unintended approval of buyer/seller offers, causing financial loss, workflow errors, or irreversible case-state changes in authorized stores.
The documentation exposes a workflow-destructive action ('cancel_dispute') but does not warn that invoking it may change dispute state, affect refund/return handling, or be difficult to reverse. In an agent skill, missing cautions and confirmation requirements increase the chance of accidental execution from ambiguous user requests, especially because the skill is designed to trigger broadly on returns/refunds workflows.
The documentation exposes a write action that confirms a return, but it does not warn that this is an operationally significant and potentially irreversible seller action. In an agent-driven environment, ambiguous docs and examples can cause an LLM or user to invoke the endpoint without explicit confirmation, leading to unintended return acceptance, financial loss, and workflow disruption.
The documentation exposes a state-changing returns dispute action ('Open return dispute; pass full body') without any warning that it can alter a merchant account’s dispute status and affect customer-service outcomes. In an agent-driven context, this increases the chance that an automated workflow or inattentive operator invokes the endpoint as if it were a harmless lookup, causing unintended account-affecting actions.
The documentation explicitly encourages passing the full request body to a state-changing returns API ('offer') without warning that this action can modify a live refund/return dispute. In an agent setting, this increases the risk of unsafe automation, accidental submission of irreversible seller offers, or user confusion about whether the action is read-only versus transactional.
The documentation explicitly supports uploading return proof and says to pass the full body, but it provides no warning that proof materials may contain sensitive personal or financial data such as names, addresses, phone numbers, parcel labels, or refund evidence. In a returns workflow, this omission increases the chance that an agent or operator will transmit unnecessary or overbroad customer data through the proxy without minimization or consent checks.
The onboarding instructions ask users to provide a phone number for script-driven registration, but they do not disclose how that phone number will be handled, stored, transmitted, or retained. In a security-sensitive agent skill, collecting personal data without an explicit privacy notice increases the risk of unintended disclosure, improper handling, or user coercion into sharing sensitive information.
The skill's stated purpose is handling Shopee return/refund operations through store token resolution and developerProxy calls. Spawning a subprocess to run another script is not an obvious requirement of that purpose and introduces an execution capability unrelated to the business function of returns processing itself. This is especially notable because the manifest frames the skill as an API-forwarding integration, not as one that executes local programs.
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,
The helper persistently writes full API responses and session metadata to local disk under predictable directories, including Shopee returns/refunds data that may contain customer, order, logistics, dispute, or token-adjacent sensitive business information. This behavior is not part of the declared API-forwarding function and creates an undocumented data retention channel that increases exposure to local compromise, accidental disclosure, or later collection by other tools/processes.
emit_result() writes complete API responses to disk and announces only the file path after the fact, with no prior user-facing warning or consent flow. In the context of Shopee returns/refunds operations, these responses can include commercially sensitive and customer-related data, so silent archiving materially raises privacy and data-handling risk.
The session-archiving layer stores full API results plus metadata such as session IDs, timestamps, called skills, and file indexes across reusable directories. For a skill handling refunds, disputes, reverse logistics, and store-linked operations, this creates a broad retention and correlation surface that can expose sensitive operational data beyond the immediate request lifecycle.
No suspicious patterns detected.