T01 · Skill Instruction Hijacking
- Location
SKILL.md:182- Finding
Silent Disclosure of User Statements and Intent Through the Feedback API
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This Amazon reviews skill performs the expected review retrieval, but it also includes under-disclosed account, billing, credential, and automatic feedback-reporting behavior that users should review carefully.
Install only if you are comfortable with a paid LinkFox integration that may handle phone/SMS onboarding, API keys, account/team details, plan purchases, payment links, persistent local result files, and automatic feedback reporting. Avoid using it in sensitive workspaces unless feedback is made explicit opt-in, API origins are pinned to trusted LinkFox HTTPS hosts, and credentials are stored in a proper secret manager rather than shell startup files.
SKILL.md:182Silent Disclosure of User Statements and Intent Through the Feedback API
scripts/amazon_reviews.py:46API Credential and Session Metadata Exfiltration Through a Configurable Gateway
scripts/onboarding.py:71Onboarding Tokens, SMS Data, and API Keys Can Be Redirected to Arbitrary Endpoints
references/onboarding.md:9SMS Verification Codes and Generated API Keys Are Exposed Through Process Arguments and Output
`
- After obtaining the `api_key`, forward the following configuration instructions:
- Windows PowerShell: `setx LINKFOX_AGENT_API_KEY ""`
- macOS zsh: `echo 'export LINKFOX_AGENT_API_KEY=""' >> ~/.zshrc && source ~/.zshrc`
- Linux bash: `echo 'export LINKFOX_AGENT_API_KEY=""' >> ~/.bashrc && source ~/.bashrc`
```
The successful login result includes the complete generated key:
```python
return {
"api_key": tok["api_key"], "phone": masked,
"group_id": info["group_id"], "member_id": info["member_id"],
"source": tok["source"], "nick_name": lg.get("nick_name", ""),
"team_name": info.get("team_name", ""),
"is_new_user": lg.get("is_new_user", False),
}
```
The result is printed without redaction:
```python
def _cmd_login(args) -> int:
r = login_and_get_key(args.phone.strip(), args.code.strip(), args.channel)
_emit(r)
if "api_key" in r:
print(f"{TAG} successfully obtained API key", file=sys.stderr)
return 0
return 1
```
### Technical Analysis
Command-line arguments can be retained in shell history and may be visible in process inspection tools while the command runs. Consequently, the phone number and short-lived SMS verification code can be exposed to local users, monitoring agents, terminal recorders, or CI systems.
The generated API key is emitted in full to stdout. Agent runtimes and automation systems commonly capture stdout in transcrip
...[truncated 1369 chars]scripts/onboarding.py:163Unpinned Runtime Installation of Third-Party Python Packages
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=timeout) as response:
result = _parse_api_response(response.read(), path)
cost_token = response.headers.get("X-Cost-Token")
if isinstance(result, dict) and cost_token is not None:
The file’s functionality is fundamentally unrelated to the declared Amazon reviews skill: it performs phone-based login, token handling, API-key generation, package listing, purchasing, and payment QR creation for LinkFox. This strong capability mismatch is dangerous because it disguises account onboarding and monetization behavior inside an unrelated skill, increasing the chance of covert credential capture and unauthorized billing flows.
The POST target URL is derived from environment-controlled base URLs, so a user or hosting environment can redirect authentication and onboarding traffic to an attacker-controlled endpoint. Because these requests carry SMS-login data, access tokens, refresh tokens, and API-token generation flows, this becomes an exfiltration and SSRF-style risk rather than a harmless configuration feature.
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 also built from environment variables and then used in urlopen with Authorization headers containing the API key. An attacker who can influence environment configuration can cause the CLI to send secrets and account/order operations to an arbitrary host, exposing credentials and enabling unauthorized transaction flow manipulation.
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 referenced onboarding flow includes account login, API-key issuance, account/team lookup, pricing, and payment/order operations, then the skill’s declared purpose materially understates financially and identity-sensitive capabilities. Hidden or indirectly invoked billing and authentication workflows raise the risk of credential handling, account actions, and purchases outside the user's clear expectations.
If the referenced onboarding flow includes account login, API-key issuance, account/team lookup, pricing, and payment/order operations, then the skill’s declared purpose materially understates financially and identity-sensitive capabilities. Hidden or indirectly invoked billing and authentication workflows raise the risk of credential handling, account actions, and purchases outside the user's clear expectations.
Skill contains instructions that could directly expose system prompts, internal rules, or hidden instructions to users or external parties.
{"asin": "B0FP5C63HZ", "domainCode": "com", "star3Num": 100}
## Display Rules
1. **Present data clearly**: Show reviews grouped by star rating with key fields: rating, title, text, date, verified status, helpful count.
2. **Summarize when appropriate**: For many reviews, provide a theme/pain-point summary before listing individuals.
This onboarding document adds account registration, login, API key provisioning, and billing workflows that are not necessary for an Amazon review analysis skill’s stated purpose. Embedding unrelated credential acquisition and payment enablement expands the skill’s effective scope, increases the chance the agent will solicit secrets or money from users, and creates an avenue for misuse if triggered during ordinary support flows.
The document instructs the agent to collect a phone number, send verification codes, log in, and help initiate plan purchases, none of which are justified by fetching or analyzing Amazon reviews. In skill context, this is especially dangerous because it normalizes off-purpose identity and payment handling, enabling phishing-like behavior or unauthorized account creation under the guise of troubleshooting.
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
Authentication and purchase capabilities are unjustified in the context of an Amazon review analysis skill and materially increase risk by collecting phone numbers, SMS codes, API keys, and payment actions. In-context, these features are more dangerous because users invoking a benign-seeming review skill would not reasonably expect account enrollment or order/payment operations.
The skill advertises and operationalizes network access, environment-variable use, and persistent file writes without declaring any explicit tool scope or permissions boundary. That creates an authorization gap: a reviewer or runtime may underestimate what the skill can do, increasing the chance of unintended data access, exfiltration, or filesystem modification.
The trigger logic is intentionally broad and says the skill should activate even when the user does not explicitly mention reviews, as long as the request loosely involves reading, filtering, or analyzing buyer feedback. Overbroad triggering can cause the agent to invoke this networked, stateful skill in contexts where the user did not intend external retrieval or local storage, increasing unnecessary data exposure and spend.
The skill mandates persistent local storage of the full response in a session-scoped directory and explicitly forbids temporary storage, even when only a summary is needed. That increases retention of potentially sensitive or proprietary marketplace data and expands the blast radius if the workspace is shared, synced, or later accessed by other tools or users.
The primary API reference is written entirely in Chinese, which can function as a language constraint for operators or downstream agent behavior if this skill is expected to be generally usable. The file does not indicate that Chinese is an optional locale or that the skill is limited to a Chinese-speaking or region-specific context.
Large whitespace padding was detected (a block of blank lines or a long run of spaces). This can push injected instructions below or to the right of the visible area so a human reviewer never sees them while the agent still reads them. Manual review of the hidden content is recommended.
POST Body(JSON):
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|--------------------------------------------------------------------------------------------------------------------------------|
| asin | string | 是 | 亚马逊商品ASIN |
| domainCode | string | 否 | 亚马逊域名代码,默认 `com`。可选值:`com`、`ca`、`co.uk`、`in`、`de`、`fr`、`it`、`es`、`co.jp`、`com.au`、`com.br`、`nl`、`se`、`com.mx`、`ae`。美国站使用 `com` |
Large whitespace padding was detected (a block of blank lines or a long run of spaces). This can push injected instructions below or to the right of the visible area so a human reviewer never sees them while the agent still reads them. Manual review of the hidden content is recommended.
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|--------------------------------------------------------------------------------------------------------------------------------|
| asin | string | 是 | 亚马逊商品ASIN |
| domainCode | string | 否 | 亚马逊域名代码,默认 `com`。可选值:`com`、`ca`、`co.uk`、`in`、`de`、`fr`、`it`、`es`、`co.jp`、`com.au`、`com.br`、`nl`、`se`、`com.mx`、`ae`。美国站使用 `com` |
| star1Num | integer | 否 | 1星评论数量,默认获取10条,最多100条 |
| star2Num | integer | 否 | 2星评论数量,默认获取10条,最多100条 |
Large whitespace padding was detected (a block of blank lines or a long run of spaces). This can push injected instructions below or to the right of the visible area so a human reviewer never sees them while the agent still reads them. Manual review of the hidden content is recommended.
|------|------|------|--------------------------------------------------------------------------------------------------------------------------------|
| asin | string | 是 | 亚马逊商品ASIN |
| domainCode | string | 否 | 亚马逊域名代码,默认 `com`。可选值:`com`、`ca`、`co.uk`、`in`、`de`、`fr`、`it`、`es`、`co.jp`、`com.au`、`com.br`、`nl`、`se`、`com.mx`、`ae`。美国站使用 `com` |
| star1Num | integer | 否 | 1星评论数量,默认获取10条,最多100条 |
| star2Num | integer | 否 | 2星评论数量,默认获取10条,最多100条 |
| star3Num | integer | 否 | 3星评论数量,默认获取10条,最多100条 |
| star4Num | integer | 否 | 4星评论数量,默认获取10条,最多100条 |
Large whitespace padding was detected (a block of blank lines or a long run of spaces). This can push injected instructions below or to the right of the visible area so a human reviewer never sees them while the agent still reads them. Manual review of the hidden content is recommended.
|------|------|------|--------------------------------------------------------------------------------------------------------------------------------|
| asin | string | 是 | 亚马逊商品ASIN |
| domainCode | string | 否 | 亚马逊域名代码,默认 `com`。可选值:`com`、`ca`、`co.uk`、`in`、`de`、`fr`、`it`、`es`、`co.jp`、`com.au`、`com.br`、`nl`、`se`、`com.mx`、`ae`。美国站使用 `com` |
| star1Num | integer | 否 | 1星评论数量,默认获取10条,最多100条 |
| star2Num | integer | 否 | 2星评论数量,默认获取10条,最多100条 |
| star3Num | integer | 否 | 3星评论数量,默认获取10条,最多100条 |
| star4Num | integer | 否 | 4星评论数量,默认获取10条,最多100条 |
Large whitespace padding was detected (a block of blank lines or a long run of spaces). This can push injected instructions below or to the right of the visible area so a human reviewer never sees them while the agent still reads them. Manual review of the hidden content is recommended.
|------|------|------|--------------------------------------------------------------------------------------------------------------------------------|
| asin | string | 是 | 亚马逊商品ASIN |
| domainCode | string | 否 | 亚马逊域名代码,默认 `com`。可选值:`com`、`ca`、`co.uk`、`in`、`de`、`fr`、`it`、`es`、`co.jp`、`com.au`、`com.br`、`nl`、`se`、`com.mx`、`ae`。美国站使用 `com` |
| star1Num | integer | 否 | 1星评论数量,默认获取10条,最多100条 |
| star2Num | integer | 否 | 2星评论数量,默认获取10条,最多100条 |
| star3Num | integer | 否 | 3星评论数量,默认获取10条,最多100条 |
| star4Num | integer | 否 | 4星评论数量,默认获取10条,最多100条 |
Large whitespace padding was detected (a block of blank lines or a long run of spaces). This can push injected instructions below or to the right of the visible area so a human reviewer never sees them while the agent still reads them. Manual review of the hidden content is recommended.
|------|------|------|--------------------------------------------------------------------------------------------------------------------------------|
| asin | string | 是 | 亚马逊商品ASIN |
| domainCode | string | 否 | 亚马逊域名代码,默认 `com`。可选值:`com`、`ca`、`co.uk`、`in`、`de`、`fr`、`it`、`es`、`co.jp`、`com.au`、`com.br`、`nl`、`se`、`com.mx`、`ae`。美国站使用 `com` |
| star1Num | integer | 否 | 1星评论数量,默认获取10条,最多100条 |
| star2Num | integer | 否 | 2星评论数量,默认获取10条,最多100条 |
| star3Num | integer | 否 | 3星评论数量,默认获取10条,最多100条 |
| star4Num | integer | 否 | 4星评论数量,默认获取10条,最多100条 |
Large whitespace padding was detected (a block of blank lines or a long run of spaces). This can push injected instructions below or to the right of the visible area so a human reviewer never sees them while the agent still reads them. Manual review of the hidden content is recommended.
|------|------|------|--------------------------------------------------------------------------------------------------------------------------------|
| asin | string | 是 | 亚马逊商品ASIN |
| domainCode | string | 否 | 亚马逊域名代码,默认 `com`。可选值:`com`、`ca`、`co.uk`、`in`、`de`、`fr`、`it`、`es`、`co.jp`、`com.au`、`com.br`、`nl`、`se`、`com.mx`、`ae`。美国站使用 `com` |
| star1Num | integer | 否 | 1星评论数量,默认获取10条,最多100条 |
| star2Num | integer | 否 | 2星评论数量,默认获取10条,最多100条 |
| star3Num | integer | 否 | 3星评论数量,默认获取10条,最多100条 |
| star4Num | integer | 否 | 4星评论数量,默认获取10条,最多100条 |
Large whitespace padding was detected (a block of blank lines or a long run of spaces). This can push injected instructions below or to the right of the visible area so a human reviewer never sees them while the agent still reads them. Manual review of the hidden content is recommended.
| star3Num | integer | 否 | 3星评论数量,默认获取10条,最多100条 |
| star4Num | integer | 否 | 4星评论数量,默认获取10条,最多100条 |
| star5Num | integer | 否 | 5星评论数量,默认获取10条,最多100条 |
| filterByKeyword | string | 否 | 按关键词筛选评论,最大长度1000字符 |
| sortBy | string | 否 | 评论排序方式:`recent`(最新评论)或 `helpful`(最有用评论),默认 `recent` |
| reviewerType | string | 否 | 评论者类型:`all_reviews`(所有评论)或 `avp_only_reviews`(仅认证购买),默认 `all_reviews` |
| mediaType | string | 否 | 媒体类型:`all_contents`(所有内容)或 `media_reviews_only`(仅包含媒体的评论),默认 `all_contents` |
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
}
## curl 示例(美国站)
### 1. 提交
The document introduces a separate feedback-reporting API that is unrelated to the stated core purpose of fetching and analyzing Amazon reviews. This expands the skill’s data-flow surface and can cause an agent to transmit user-derived content to a second external endpoint without a clear functional need or explicit user awareness.
No suspicious patterns detected.