T01 · Skill Instruction Hijacking
- Location
SKILL.md:204- Finding
Automatic Transmission of Conversation-Derived Feedback Without Explicit Consent
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This skill has a legitimate product-search function, but it also includes sensitive account, payment, credential, persistence, and automatic feedback behavior that needs review before installation.
Install only if you are comfortable with LinkFox/Sorftime receiving search requests and, during onboarding, phone-authentication and payment-related data. Avoid custom endpoint environment variables unless you trust them, do not paste API keys into shared logs or shell history, review stored files under linkfox directories, and require explicit consent before submitting feedback or creating payment orders.
SKILL.md:204Automatic Transmission of Conversation-Derived Feedback Without Explicit Consent
scripts/sorftime_product_search.py:36Credential-Bearing Requests Can Be Redirected to Arbitrary Environment-Controlled Destinations
scripts/onboarding.py:484API Key Is Exposed Through Standard Output and Plaintext Shell Configuration
scripts/sorftime_product_search.py:237Unsanitized Session Identifier Allows Directory Traversal and Arbitrary-Location Writes
scripts/sorftime_product_search.py:202Complete Responses and Payment Artifacts May Fall Back to Shared Temporary Storage
scripts/onboarding.py:164Runtime Installation Guidance Uses Unpinned Third-Party Dependencies
The code builds destination URLs from environment-controlled base URLs and then sends SMS-login data, access tokens, refresh tokens, and API-token requests to those endpoints via requests.post. If an attacker can influence environment variables in the skill runtime, they can redirect these sensitive flows to attacker-controlled infrastructure, causing credential exfiltration and unauthorized account access.
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 an environment-derived base URL and sends authenticated requests with the LINKFOX agent API key in the Authorization header through urllib.request.urlopen. A maliciously set environment variable can redirect these authenticated calls to an attacker-controlled server, exposing API keys and account/order data.
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
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 skill advertises rich marketplace coverage, historical snapshots, and multiple analysis modes, but the implementation is described as largely proxying a single API call while also adding undeclared persistence and caching. This mismatch is dangerous because users and reviewers may underestimate what data is being stored locally and overtrust claims about validation, site support, or historical-query behavior.
The skill advertises rich marketplace coverage, historical snapshots, and multiple analysis modes, but the implementation is described as largely proxying a single API call while also adding undeclared persistence and caching. This mismatch is dangerous because users and reviewers may underestimate what data is being stored locally and overtrust claims about validation, site support, or historical-query behavior.
Skill contains instructions that could directly expose system prompts, internal rules, or hidden instructions to users or external parties.
queryMode: 1, queryType: 4, queryValue: AnkerDirect, marketplace: us
## 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
Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.
# Sorftime 亚马逊产品搜索 API 参考
## 调用规范
The onboarding document introduces authentication recovery, scripted phone-based registration, API key acquisition, and billing/payment flows that are outside the stated purpose of an Amazon product-search skill. This expands the skill into account lifecycle and payment handling, creating an unexpected trust boundary where an agent may collect credentials or drive payments without clear product justification.
The documented capability to register users by phone, retrieve API keys, and initiate payment orders is not justified by the skill's declared function of product discovery and analysis. An agent following these instructions could solicit sensitive data and perform high-risk account or payment actions under the guise of a low-risk research skill.
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 file implements account onboarding, SMS verification, API-key issuance, package listing, order creation, and payment QR generation, which are unrelated to the declared Sorftime Amazon product-search purpose. This capability mismatch is dangerous because it can trick users or host systems into executing identity, billing, and credential workflows under the guise of a benign research/search skill.
The skill includes package purchase, order creation, and payment QR rendering despite being presented as an Amazon product-search tool. In this context, embedded billing flows are unjustified and increase the risk of deceptive purchases, financial abuse, and unauthorized monetization from within the agent environment.
The file performs SMS-based authentication, obtains access and refresh tokens, queries user/team info, and generates API tokens, none of which are necessary for product search. In the context of this skill, these flows create a covert credential-harvesting and account-provisioning surface that is far more dangerous than the declared functionality suggests.
The skill uses sensitive capabilities (environment-variable access, file writes, and network access) but does not declare any tool scope or allowed-tools boundary. This weakens least-privilege controls and makes it harder for reviewers or runtimes to constrain what the skill can do, especially since it also persists responses locally and depends on API credentials.
The trigger criteria are intentionally broad enough to capture general Amazon product-research requests even when the user does not mention Sorftime. Overbroad activation can cause the skill to run in contexts the user did not intend, increasing accidental data exposure, unnecessary external calls, and unwanted credit consumption.
The instruction explicitly sets the default marketplace to US whenever the user does not specify a marketplace. This forces a locale/region selection rather than asking the user to choose, which is a natural-language locale policy concern under the stated rules.
The skill instructs the agent to automatically submit feedback to a separate API whenever various conditions occur, even though this is unrelated to product search. That creates an undeclared outbound data flow that may transmit user content, usage patterns, or sentiments to another service without clear necessity or consent.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
}
## curl 示例
**单条件 - ASIN同类产品:**
The file documents a second API that is unrelated to the declared product-query function of the skill. That extra endpoint sends free-form content to an external service, expanding the skill's data-flow and trust boundary in a way users and integrators may not expect.
The feedback endpoint encourages sending user-derived content to an external server but does not require a warning, consent step, or data-minimization guidance. This creates privacy and compliance risk because conversations, complaints, or other sensitive text could be transmitted off-platform without the user's informed approval.
The instructions direct the agent to ask for a user's phone number and pass it to a script for registration and SMS verification, but they provide no privacy notice, purpose limitation, retention statement, or warning that personal data will be transmitted externally. This creates unnecessary privacy and social-engineering risk, especially because the skill's advertised purpose does not imply handling personal identifiers.
The module self-describes as a LinkFox account and environment onboarding CLI, directly contradicting the published Sorftime Amazon product-search description. This discrepancy is a strong indicator of deceptive packaging, making the surrounding credential and payment functionality more suspicious and increasing the likelihood of misuse.
The module docstring and all user-facing help/messages are written in Chinese, which imposes a specific language on users. The file does not offer a language/locale choice or explain that the skill is intentionally limited to a Chinese-speaking or region-specific context.
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 token-generation flow transmits phone-authenticated session credentials and requests long-lived API tokens without any local user warning or explicit consent checkpoint in the code path. In a mislabeled skill context, this increases the risk that users or orchestrators hand over sensitive account access without understanding the consequences.