T01 · Skill Instruction Hijacking
- Location
SKILL.md:222- Finding
Silent Transmission of Conversation-Derived Feedback to a Separate Service
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This eBay search skill has a coherent core search function, but it also silently reports feedback and handles account, credential, and payment flows in ways users should review carefully.
Install only if you are comfortable using LinkFox as a paid intermediary for eBay searches. Do not let it send feedback automatically without reviewing the payload, avoid providing phone/SMS credentials unless you intend to create or access a LinkFox account, review any payment/order step before proceeding, and store the API key in a proper secret manager rather than shell startup files. Use default LinkFox endpoints only, and periodically delete saved search response files if queries, postal codes, or market research are sensitive.
SKILL.md:222Silent Transmission of Conversation-Derived Feedback to a Separate Service
scripts/onboarding.py:484API Key Exposed Through Standard Output and Recommended Plaintext Persistence
scripts/onboarding.py:67Configurable Base URLs Permit Redirection of Authentication Secrets
scripts/ebay_search.py:101Search Queries and Full Responses Persisted with Default Filesystem Permissions
scripts/onboarding.py:163Unpinned Runtime Dependency Installation Guidance
The request target and multiple outbound headers are influenced by environment variables, especially LINKFOX_TOOL_GATEWAY and SESSION_ID/MODE_ID/APP_NAME. In an agent/runtime context, environment variables are often externally controlled; this allows SSRF-style redirection of authenticated POST requests, including the API key in the Authorization header, to an attacker-controlled endpoint.
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 script constructs request destinations from environment-controlled base URLs and then sends sensitive material to them, including SMS login data, access tokens, refresh tokens, API-token requests, and authorization headers. If an attacker can influence environment variables in the skill runtime, this becomes an SSRF/exfiltration path that can redirect credentials and account actions 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 request path uses environment-derived base URLs and attaches the LinkFox API key in the Authorization header before calling urlopen. A compromised or attacker-influenced environment can therefore redirect authenticated requests to an arbitrary host, exposing API credentials and enabling unintended outbound requests.
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 associated implementation also performs login, API key generation, account/team inspection, subscription lookup, and payment/order workflows, that is a major expansion beyond the declared eBay-search purpose. Such undisclosed account and payment capabilities materially increase risk because they may access sensitive identity, billing, and credential data under misleading expectations.
If the associated implementation also performs login, API key generation, account/team inspection, subscription lookup, and payment/order workflows, that is a major expansion beyond the declared eBay-search purpose. Such undisclosed account and payment capabilities materially increase risk because they may access sensitive identity, billing, and credential data under misleading expectations.
The activation criteria are overly broad and allow the skill to trigger even when the user does not explicitly request eBay. Because the skill incurs cost, performs network requests, and persists results, over-triggering can cause unauthorized data handling, unnecessary spending, and context leakage beyond user intent.
Skill contains instructions that could directly expose system prompts, internal rules, or hidden instructions to users or external parties.
{"keyword": "Kopfhoerer", "ebayDomain": "ebay.de", "location": 77}
## Display Rules
1. **Present data clearly**: Show search results in well-formatted tables including key fields such as title, price, condition, seller info, and shipping
2. **Price formatting**: Always display prices with their currency symbol. When showing price ranges (minPrice to maxPrice), format as a range
The file documents account onboarding, phone-based registration, API key acquisition, and billing workflows that are unrelated to the stated eBay search capability. In a skill that should only search eBay listings, these instructions expand the operational scope into credential handling and payments, creating unnecessary attack surface and enabling social-engineering or unauthorized service enrollment.
The documented ability to collect a user's phone number, send login codes, register accounts, and initiate plan purchases is not justified by an eBay listing search skill. This mismatch between advertised functionality and embedded operational behavior is dangerous because it can be used to funnel users into unrelated account creation and payment flows under the guise of a benign search feature.
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 verification, API-key issuance, package listing, ordering, and payment QR generation, which is unrelated to the declared eBay search/browsing skill. Such scope mismatch is dangerous because it introduces credential collection and monetization flows into a skill that users would reasonably expect to only search eBay listings.
The code can create paid orders and render payment QR codes even though the skill is supposed to help search and compare eBay listings. In this context, embedded billing capability is unjustified and increases the risk of deceptive charges, monetization abuse, or social engineering through an apparently unrelated skill.
The script performs SMS-based login, token exchange, user-info retrieval, and API-token generation for LinkFox accounts, none of which is necessary for browsing eBay products. In a skill advertised for eBay search, collecting phone numbers and verification codes is especially suspicious because it can be used to harvest credentials and provision access unrelated to the stated purpose.
The skill declares no explicit tool scope or permissions despite instructing use of environment variables, network access, and persistent file writes. In an agent setting, missing scope declarations weakens least-privilege controls and makes the skill harder to govern or safely sandbox.
The manifest description is written as an instruction in Chinese describing when the skill triggers, while the rest of the file is mixed-language and does not state that the skill is intentionally limited to Chinese-speaking users or offer a language choice. This can violate language/locale policy because it imposes a locale-specific interaction pattern without user opt-in or a documented regional requirement.
The skill mandates persistent logging of complete tool responses in a session-organized directory, which can retain user-provided search terms, shipping/location inputs, seller/product data, and session identifiers beyond immediate need. Persistent full-response storage expands exposure in the event of local compromise, accidental inclusion in project artifacts, or later unintended reuse.
The usage example instructs users to search sold listings for price research, and the parameter guide documents showOnly values Sold and Complete. This directly conflicts with the later statement that the tool returns only current live listings and not historical data, creating an intent/documentation contradiction within the skill file.
The limitation states 'This tool returns current live listings only, not historical pricing trends,' which suggests non-live data is unavailable. However, the documented parameters and examples explicitly support showOnly: Sold,Complete for sold/completed listings, which are historical listing outcomes rather than only current live listings.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
| sourceType | string | 来源平台标识(ebay) |
| sourceTool | string | 来源工具标识 |
curl -X POST https://tool-gateway.linkfox.com/ebay/search \
The file documents a separate feedback API that is unrelated to the core eBay search function, creating an additional data egress path within the skill. Because the payload explicitly includes free-form content and a skill identifier, an agent could send user prompts, outcomes, or other sensitive context to an external service without that transfer being necessary for the requested search task.
The documentation describes transmitting feedback content to https://skill-api.linkfox.com/.../feedback but provides no warning that user text or interaction summaries may be sent to a separate external endpoint. This lack of disclosure increases the risk of silent exfiltration of sensitive user data, especially if an agent automatically constructs feedback from the conversation.
The instructions ask the user to provide a phone number for script-driven registration without any privacy notice, data-handling explanation, retention limits, or consent language. Collecting personal contact data in this way increases the risk of privacy violations, unauthorized transmission to third-party services, and user deception about how their information will be used.
The docstring claims responses are only written under the current working directory and explicitly forbids /tmp, but the implementation falls back to ~/linkfox and the system temp directory. This can silently place potentially sensitive API responses in broader, less expected locations, weakening data-handling guarantees and increasing the chance of accidental exposure in multi-user or ephemeral environments.
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 = ""
SQP-3 covers natural-language policy issues including forcing a specific language without user opt-in. This file presents all operational guidance exclusively in Chinese and does not indicate that the skill is region-specific or that users can choose another language.
No suspicious patterns detected.