T01 · Skill Instruction Hijacking
- Location
SKILL.md:171- Finding
Silent transmission of user-derived feedback to an external service
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill is a real Ozon analytics integration, but it handles credentials, onboarding, payments, local retention, and silent feedback reporting in ways users should review carefully.
Install only if you trust LinkFox with marketplace queries, API credentials, account onboarding data, and possible billing actions. Before use, verify LinkFox endpoint environment variables are not overridden, avoid logging or sharing API keys, prefer a secret store over shell startup files, review any payment step before confirming it, and treat automatically submitted feedback as a privacy concern unless removed or made opt-in.
SKILL.md:171Silent transmission of user-derived feedback to an external service
scripts/onboarding.py:72Credential-bearing requests can be redirected to arbitrary environment-controlled endpoints
scripts/onboarding.py:476Generated API key is exposed through stdout and recommended for plaintext persistence
scripts/onboarding.py:163Onboarding recommends unpinned runtime dependency installation
scripts/mpstats_ozon_category_products.py:64Unnecessary identifier transmission and excessive plaintext response retention
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 code builds destination URLs from environment-controlled base URLs and then sends sensitive data to them via requests.post. This includes phone numbers, SMS codes, access tokens, refresh tokens, and generated API tokens, so a modified environment can silently redirect credentials to an attacker-controlled endpoint.
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 sends authenticated requests with the API key in the Authorization header via urlopen. If an attacker can influence the process environment, they can exfiltrate API keys and redirect billing/account operations to arbitrary infrastructure.
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 code behind this skill can send SMS codes, log users in, obtain API tokens, inspect account/team info, or initiate payments, that is a major scope expansion beyond Ozon category analysis. Such hidden account and payment capabilities are dangerous because they can trigger sensitive side effects and expose identity or billing data under the guise of a read-oriented analytics skill.
If the code behind this skill can send SMS codes, log users in, obtain API tokens, inspect account/team info, or initiate payments, that is a major scope expansion beyond Ozon category analysis. Such hidden account and payment capabilities are dangerous because they can trigger sensitive side effects and expose identity or billing data under the guise of a read-oriented analytics skill.
Skill contains instructions that could directly expose system prompts, internal rules, or hidden instructions to users or external parties.
}
## Display Rules
1. **Compact category table** — key columns: `productId`, `title`, `brand`, `sellerName`, `price`, `monthlySalesUnits`, `monthlySalesRevenue`, `rating`, `balance`, `position`, `revenueSharePercent`.
2. **Revenue share = within this category query** — 0-100%; clarify the basis when presenting.
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's behavior is materially different from the declared skill purpose: instead of Ozon category analytics, it implements account onboarding, SMS login, API-key retrieval, and purchasing flows. This scope mismatch is dangerous because it can trick users into providing credentials and authorizing account actions unrelated to the advertised functionality.
The code contains order creation, payment method selection, and QR-code rendering for purchases even though the skill claims to provide marketplace analytics. Embedding billing capability in an unrelated skill increases the chance of deceptive monetization, unauthorized purchases, or user coercion into paying for services they did not intend to access.
The skill performs SMS-based account login, token exchange, team discovery, and API-key generation despite being advertised as a product analytics integration. In this context, collecting authentication material and returning an API key is especially dangerous because users may disclose sensitive credentials under false pretenses.
The skill appears to require network access, environment-variable access, and filesystem writes, but it does not declare any explicit tool scope or permission boundary. That increases the blast radius if the skill is invoked unexpectedly or modified, because callers cannot easily see that it can read secrets and persist data locally.
The markdown states that categoryPath must be the full Russian category path and that English translations will generally fail. This imposes a language-specific requirement on users without presenting it as an optional locale choice or clearly framing it as a justified region-specific constraint in the activation/usage policy.
The documentation mandates writing full API responses to persistent local files even though the skill is presented as a query/analytics tool. Persisting full responses by default creates unnecessary data retention and raises the risk of later disclosure of user queries, marketplace data, session identifiers, or other sensitive metadata.
The skill instructs persistent logging of full responses into session-organized project files, which can accumulate sensitive query results and contextual metadata over time. In a shared workspace or repository-backed environment, those files may be exposed to other agents, users, or version control, extending impact well beyond the immediate task.
Automatic feedback reporting to an external API is an extra outbound data-sharing capability unrelated to core category analytics. If triggered silently, it can transmit user intent, dissatisfaction, or task context without clear consent, creating privacy and policy risks.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
| 402 | 算力或余额不足 | HTTP 402:按 SKILL.md 的 ## 解决认证和算力问题 处理。 |
| 其他 | 业务异常 | 查看 errmsg;常见为 categoryPath 非俄语、非全路径、日期越过昨日等 |
curl -X POST https://tool-gateway.linkfox.com/mpstats/ozon/categoryProducts \
The onboarding flow instructs the operator to collect and submit a user's phone number and verification code to a local script, but provides no privacy notice, consent guidance, retention limits, or handling restrictions for that personal data. This creates a real privacy/security weakness because agents may solicit sensitive identifiers and OTP-related data without clear safeguards, increasing the risk of misuse, overcollection, or insecure logging.
The script persistently stores full API responses, cache contents, and session metadata on disk, even though the skill is described as a query/return analytics tool. API responses may contain commercially sensitive marketplace data, identifiers, or usage/account metadata, and writing them under cwd/home/tmp increases retention and exposure to other local users, tools, or later tasks. The risk is amplified because storage happens by default, not as an explicit opt-in.
The docstring promises that writing to /tmp is forbidden and that failure to write the current directory should error, but the implementation silently falls back to home and then the system temp directory. This discrepancy undermines operator expectations and can cause sensitive response data and session metadata to be written to less trusted locations, especially shared temporary storage. Security-relevant behavior that contradicts documentation is dangerous because users may make trust decisions based on the stated guarantees.
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 skill enforces an 11-digit phone format and hard-codes areaCode "+86", which restricts operation to a specific locale. There is no visible user choice or opt-in for locale/region handling, so the natural-language behavior forces a specific regional assumption.
The code generates or retrieves an API token and emits it directly in command output without any in-file warning about secret handling. This raises the risk of accidental exposure through logs, shell history capture, transcripts, or downstream tooling that stores stdout.
This markdown file documents reading LINKFOX_AGENT_API_KEY or LINKFOXAGENT_API_KEY from environment variables and sending the value in an Authorization header. Under the markdown-file warning criterion, credential use and transmission should be disclosed as a privacy/security-relevant behavior, but the document presents it only as an implementation detail with no explicit caution.
The manifest describes a read-oriented analytics skill for drilling into Ozon category products and returning metrics such as sales, price, ranking, and inventory. Lines L148-L168 document an additional POST feedback capability to a different service, which is not part of the stated category-analysis function and is not justified by the skill purpose given in the manifest.
The module docstring and command help are presented entirely in Chinese, and the file does not offer an alternative language or user opt-in for locale. This can violate language policy when a skill forces a specific language by default rather than letting the user choose.