other
- Location
SKILL.md:162- Finding
Automatic Disclosure 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 Temu shop research, but it adds automatic feedback reporting plus broad account, credential, and payment flows with weak consent and scoping safeguards.
Review this skill carefully before installing. Use it only if you are comfortable giving LinkFox an API key and possibly using its phone-login and paid-credit flows. Do not set gateway URL environment variables to untrusted hosts, avoid placing API keys in shell startup files when a secret store is available, and do not allow feedback to be sent unless you have reviewed and approved the exact content.
SKILL.md:162Automatic Disclosure of User Feedback Without Explicit Consent
scripts/geekbi_temu_mall_search.py:26Environment-Controlled API Destinations Can Exfiltrate Credentials and Session Metadata
scripts/geekbi_temu_mall_search.py:35Unvalidated Session Identifier Enables Writes Outside the Intended Workspace
scripts/onboarding.py:466API Key Is Printed to Standard Output and Recommended for Plaintext Shell Storage
scripts/onboarding.py:163Onboarding Recommends Installation of Unpinned Runtime Dependencies
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:
raw = response.read().decode("utf-8")
try:
return json.loads(raw)
The request URL and several outbound headers are influenced by environment variables, especially LINKFOX_TOOL_GATEWAY and SESSION_ID/MESSAGE_ID/MODE_ID/APP_NAME. In an agent runtime, attacker-controlled or insufficiently trusted environment data can redirect requests to an arbitrary host and exfiltrate the API key and request metadata via the Authorization header, making this a real SSRF/credential-leak risk.
method="POST",
)
try:
with urlopen(req, timeout=150) as response:
raw = response.read().decode("utf-8")
try:
return json.loads(raw)
The request sent via urlopen includes multiple HTTP headers sourced directly from environment variables, including SESSION_ID, MESSAGE_ID, MODE_ID, and APP_NAME. Because the destination base URL is also environment-controlled via LINKFOX_TOOL_GATEWAY, an attacker who can influence the runtime environment can redirect requests to an arbitrary host and exfiltrate these identifiers and the API key-bearing request, creating an SSRF-plus-secret-leak channel. In an agent skill context, trusting environment input for outbound network targets is especially risky because skills often run in shared or orchestrated environments where env vars may be user-influenced or misconfigured.
method="POST",
)
try:
with urlopen(req, timeout=150) as response:
raw = response.read().decode("utf-8")
try:
return json.loads(raw)
The POST target is derived from environment-controlled base URLs, and the request may include sensitive authentication material such as access tokens, uid/tid headers, or login payloads. In an agent or hosted execution environment, a malicious wrapper or misconfigured deployment can redirect these requests to an attacker-controlled host and exfiltrate credentials or verification data.
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 URL is constructed from environment-controlled base settings and then used with Authorization and session-related headers. If those environment variables are tampered with, the CLI can send API keys and account metadata to an attacker endpoint, making this a credential exfiltration path.
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
The skill is presented as marketplace research, but the referenced onboarding flow reportedly includes authentication, account inspection, package purchase, order creation, payment QR generation, and local QR image storage. Mixing commerce, authentication, and billing operations into a research skill materially expands the trust boundary and can expose users to unintended account or payment actions.
The skill is presented as marketplace research, but the referenced onboarding flow reportedly includes authentication, account inspection, package purchase, order creation, payment QR generation, and local QR image storage. Mixing commerce, authentication, and billing operations into a research skill materially expands the trust boundary and can expose users to unintended account or payment actions.
Skill contains instructions that could directly expose system prompts, internal rules, or hidden instructions to users or external parties.
python scripts/geekbi_temu_mall_search.py '{"regionId":211,"page":1,"size":3,"mallStarMin":4}'
## Display Rules
1. State the selected marketplace (`regionId`, site name, and currency when available), filters, current page, and page size.
2. Present shop name, `mallId`, rating, historical sales and revenue, average order value, followers, active products, hosting mode, categories, and opening time when returned.
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 > `pay_ur
This file implements phone login, API key acquisition, subscription listing, paid ordering, and payment QR generation, which are unrelated to a GeekBI Temu shop query skill. That mismatch materially increases risk because the skill can collect credentials and initiate billing workflows under the guise of analytics functionality.
The skill creates paid orders and renders payment QR codes, enabling monetary transactions unrelated to querying public Temu shop metrics. Because this capability is hidden inside an analytics-branded skill, it creates a strong risk of deceptive charges, social engineering, or abuse of the user's authenticated account context.
The code can fetch or generate API tokens for a user group after SMS-based login, effectively turning the skill into a credential acquisition tool. In the context of a store analytics skill, this is especially dangerous because it enables unauthorized persistence and later API access beyond the immediate user action.
The skill advertises capabilities that clearly involve environment variables, local file writes, and network access, but it does not declare an explicit tool scope such as allowed-tools or permissions. That omission weakens review and enforcement boundaries, making it easier for a skill to exercise broader capabilities than a caller may expect.
The file contains substantial user-facing guidance in Chinese under sections such as 调用方式 and 解决认证和算力问题, while other sections are in English. This creates a locale/language constraint without explicit opt-in or a documented justification, which can violate language-choice policy for general users.
The skill requires writing every full API response to a session-linked local file by default, regardless of whether all fields are needed for the user response. This creates unnecessary retention of potentially sensitive user queries, account-linked context, or third-party data, increasing exposure if the workspace, logs, or session directories are later accessed by unauthorized parties.
This markdown file is almost entirely presented in Chinese, which effectively forces a specific language on users reading the skill documentation. The policy allows locale constraints only when the skill offers user choice or clearly documents a justified region-specific limitation, neither of which is stated here.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
当最小和最大时间同时提供时,二者都必须为合法 ISO-8601 date-time,且最小值不得晚于最大值。
curl -X POST "${LINKFOX_TOOL_GATEWAY}/geekbi/temu/mallSearch" \
-H "Authorization: ${LINKFOX_AGENT_API_KEY:-$LINKFOXAGENT_API_KEY}" \
-H "Content-Type: application/json" \
-H "User-Agent: LinkFox-Skill/2.0" \
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
无业务参数,Body 传 {}。只将非空且为正整数的 sites[].regionId 用于店铺搜索;sites[].siteId 是上游内部 ID,不得代替 regionId。如果没有有效 regionId,应停止链式调用并告知用户。
curl -X POST "${LINKFOX_TOOL_GATEWAY}/geekbi/temu/siteList" \
-H "Authorization: ${LINKFOX_AGENT_API_KEY:-$LINKFOXAGENT_API_KEY}" \
-H "Content-Type: application/json" \
-H "User-Agent: LinkFox-Skill/2.0" \
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
先用 {} 获取一级节点;需要下钻时,只把非空且为非负整数的 catId 作为下一次请求的 parentCatId;筛选店铺时,只把有效 catId 放入 catIds 数组。传 0 合法,但没有证据证明它与省略 parentCatId 等价。
curl -X POST "${LINKFOX_TOOL_GATEWAY}/geekbi/temu/categoryList" \
-H "Authorization: ${LINKFOX_AGENT_API_KEY:-$LINKFOXAGENT_API_KEY}" \
-H "Content-Type: application/json" \
-H "User-Agent: LinkFox-Skill/2.0" \
The documentation adds a separate feedback-posting API unrelated to the stated shop-query purpose, creating an extra outbound action surface that could transmit user content to a third party. In an agent setting, this can enable unintended data exfiltration or unauthorized side effects if the agent is induced to submit feedback containing user prompts, results, or internal context.
The instructions explicitly ask the user to provide a phone number so a local script can register or log in on their behalf, but they do not disclose how that personal data and subsequent verification code or API key will be handled, stored, or protected. In a skill context, this can normalize collection of sensitive identifiers without informed consent and increases privacy and account-takeover risk if logs, terminals, or support transcripts are retained.
The manifest describes this skill as querying and filtering Temu public market shops and GeekBI shop metrics, but the code is hardwired to call /geekbi/temu/categoryList. A category list operation is semantically different from store/shop querying, so the implemented behavior does not match the skill's declared purpose.
The skill always writes full API responses plus session metadata to local disk, even though the skill purpose is only to query/filter public shop data. Persisting complete responses and operational metadata broadens data exposure, creates retention risk, and may leak account-scoped API output or identifiers to other local users, later processes, or support artifacts.
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 = ""
Sending SMS codes and performing phone-based login is outside the expected scope of a store-query skill and allows the skill to collect and process identity/authentication factors. In this context, the feature is more dangerous because users may not expect an analytics skill to request login codes or act on their behalf to obtain account access.