T01 · Skill Instruction Hijacking
- Location
SKILL.md:165- Finding
Automatic Transmission of User Feedback Without Explicit Consent
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill mostly matches an Ozon product-search purpose, but it also includes under-scoped credential, billing, payment, automatic feedback, and local persistence behaviors that users should review before installing.
Install only if you are comfortable giving LinkFox account credentials/API keys to this skill, having product-search results cached locally, and manually controlling any onboarding or payment steps. Do not let it auto-submit feedback or create purchase orders without seeing and approving the exact payload/action, and avoid storing API keys in shell startup files when possible.
SKILL.md:165Automatic Transmission of User Feedback Without Explicit Consent
scripts/seerfar_ozon_product_report_search.py:36Environment-Controlled Endpoints Can Redirect Credentials and Authentication Data
scripts/onboarding.py:474Generated API Key Is Printed and Recommended for Plaintext Persistence
scripts/seerfar_ozon_product_report_search.py:251Unsanitized Session Identifier Allows Output Path Traversal
scripts/onboarding.py:163Unpinned Runtime Dependency Installation Instructions
The code constructs destination URLs from environment-controlled base URLs and then sends authentication material, login data, or API-token-related requests to those endpoints via requests.post. If an attacker can influence environment variables in the skill runtime, they can redirect sensitive traffic to attacker-controlled infrastructure, 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 URL is derived from environment variables and used in urllib.request.urlopen with an Authorization header sourced from API keys. An attacker who controls the environment can reroute these requests to a hostile server and capture the bearer token, enabling unauthorized access to the victim's account or billing 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
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 ""
This is a strong description-behavior mismatch: a product-report search skill reportedly also performs phone-based login, API key retrieval/generation, account inspection, plan listing, order creation, payment QR rendering, and payment status queries. Hidden auth, billing, and account-management flows materially expand the trust boundary and could enable unexpected charges, credential handling, or disclosure of sensitive account information under the guise of a harmless data-query skill.
Skill contains instructions that could directly expose system prompts, internal rules, or hidden instructions to users or external parties.
4. **Use `creationDate` + `labels` for fresh demand**: `creationDate: 1` (new listings) paired with `labels: [2]` (best-seller badge) finds breakout products.
5. **Pick the right `searchDate`**: omit for current trends (last 30 days); pass an explicit date for month-over-month comparison.
## Display Rules
1. **Present data only**: show product metrics in a clear table without subjective advice.
2. **Lead with product columns**: `title`, `sku`, `price` (₽), `sales`, `revenue`, `rating`, `reviewCount`, then `brand` / `sellerName` / `fulfillment`.
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 file is an account-onboarding and payment CLI, not an Ozon product report search implementation as declared in the skill metadata. This mismatch is dangerous because users or reviewers may grant permissions and trust based on the advertised analytics purpose while the code actually performs authentication, token issuance, and commerce-related actions.
The code can create purchase orders and generate payment QR codes, which is unrelated to Ozon product screening and can trigger financial transactions. In the context of a product-analysis skill, hidden purchasing capability substantially increases the risk of deceptive billing, unauthorized charges, and user manipulation.
The script performs SMS-based login, token exchange, user/team discovery, and API key generation despite the skill claiming to search Ozon product reports. This can be used to harvest or mint credentials under false pretenses, especially because the declared context gives no legitimate reason to collect phone verification codes or return API keys.
The skill declares no explicit tool scope or permission boundaries even though it is documented to use environment variables, network access, and file writes. In an agent setting, missing scope declarations can let the runtime grant broader capabilities than users expect, increasing the blast radius if the skill is misused or if hidden behaviors are later introduced.
The section title and instructions specify handling authentication and quota issues via referenced onboarding guidance entirely in Chinese, and the file overall mixes English with mandated Chinese-language operational text. This creates a locale/language policy concern because the skill does not explicitly offer the user a language choice or opt-in before using a specific language for support flows.
The documentation instructs clients to send an authorization key and optionally user/member identifiers to an external service, but provides no guidance on minimization, redaction, storage limits, or user-consent boundaries. In an agent ecosystem, that omission can lead to over-collection or unsafe propagation of secrets and identifiers into logs, telemetry, or third-party requests.
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/seerfar/ozon/productReportSearch \
The onboarding flow instructs operators to collect a user's phone number and use a local script to send it to an external registration/login service, but it does not clearly disclose that personal data will be transmitted off-platform or explain consent/privacy implications. In a support automation context, this can lead to unnecessary collection of personally identifiable information and social-engineering risk, especially because users may feel pressured to share their number with the agent rather than self-service.
The module docstring openly describes a LinkFox onboarding CLI, contradicting the advertised Ozon product-report-search intent. This inconsistency is a strong indicator of repurposed or deceptive code and raises the likelihood that the skill is attempting to smuggle unrelated account and billing behavior into a benign-seeming context.
The module docstring and user-facing CLI help/messages are presented in Chinese only, which enforces a specific language/locale without any opt-in or alternative. Under the stated policy, forcing a language without offering user choice is a natural-language policy violation.
The code transmits sensitive onboarding and authentication data to external services, including phone numbers, verification codes, tokens, and related account information. External transmission is especially concerning here because the skill context is unrelated to account onboarding, making the data flows unexpected and more likely to violate user trust or facilitate credential misuse.
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 function returns a generated or retrieved API key directly in stdout JSON without any in-band warning, masking, or secure storage guidance. In agent and CLI environments, stdout is often logged, persisted, or surfaced to other components, so this can leak long-lived credentials beyond the intended recipient.
The natural-language documentation and usage notes are written entirely in Chinese, describing the behavior and outputs without indicating that the user may choose another language. Under the stated policy, forcing a specific language without opt-in can be a locale/language policy violation unless clearly justified as region-specific.
The documentation states that writing to /tmp is forbidden and that failure should occur if the current directory is not writable, but the implementation silently falls back to home and temp directories. This mismatch can cause sensitive output to be persisted in locations the operator did not approve or monitor, weakening data handling guarantees.
The skill transmits session and application metadata headers along with the authenticated API request without any explicit runtime notice or user-consent mechanism. Although such headers can be operationally useful, they may expose correlation identifiers and workspace/app context to the remote service beyond what the user expects for a product report query.
The code caches full API responses on disk for 24 hours under a predictable local path, which exceeds the core product-search function and may retain sensitive business data longer than necessary. If the response contains account-linked analytics, seller info, or other proprietary results, local users or later processes could access stale data without re-authenticating.
The skill writes full response archives plus session metadata, index entries, and usage history to disk, creating a broader audit trail than the user likely expects from a search/report tool. This expands the local data footprint and can expose session identifiers, usage patterns, and raw API results to other local actors or future tasks.
The manifest describes a skill for searching and filtering Ozon product report data, but this file also documents a separate Feedback API used to submit sentiment/category/content back to LinkFox. Collecting and sending feedback is not an obvious requirement of product screening itself and represents an extra capability outside the declared user-facing purpose.
The QR rendering function saves a PNG file to a session directory, and the order flow calls it automatically after creating an order. While the code returns the file path, there is no explicit warning in the command help or nearby user-facing disclosure that invoking the command will create files on disk.