Back to skill

Security audit

Amazon 供应商反馈清单

Security checks for vulnerabilities and agentic risk

Overview

This skill can help analyze Amazon reviews, but it exposes broader paid operations, monitoring, exports, and account-setting changes than its supplier-feedback description suggests.

Install only if you expect this skill to act as a broader ARI seller-operations assistant, not just a supplier-feedback checklist. Review billing auto-confirm settings, monitoring and schedule changes, export destinations, and custom API endpoint settings before use.

Vulnerability Patterns
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Agent Memory PoisoningWrites attacker-controlled rules into memory that affect later sessions
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (1)

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/ari.py:55
Finding
Bearer API Key Can Be Sent to a Custom Plaintext HTTP Endpoint<![CDATA[ ## Vulnerability Details **File Location**: `scripts/ari.py:55-71`, with the authenticated network sink at `scripts/ari.py:300-320` **Vulnerability Type**: Insufficient transport security validation for sensitive credentials **Risk Level**: Medium ### Vulnerable Code ```python def base_url(): override = (os.environ.get("ARI_BASE_URL") or "").strip().rstrip("/") if not override or override == PROD_BASE: return PROD_BASE if (os.environ.get("ARI_ALLOW_CUSTOM_BASE") or "").strip() != "1": emit(error_obj( "ARI_CUSTOM_BASE_BLOCKED", 0, "ARI_BASE_URL points to a non-official address: %s; request refused" % override, "For a self-hosted environment, explicitly set ARI_ALLOW_CUSTOM_BASE=1.")) raise SystemExit(2) return override ``` The returned custom URL is subsequently used by the authenticated request function: ```python def request_json(method, path, payload=None, params=None): query = { "method": method, "path": path, "params": {k: v for k, v in (params or {}).items() if v not in (None, "")}, "payload": payload, } url = base_url() + path if query["params"]: url += "?" + urllib.parse.urlencode(query["params"], doseq=True) data = None if payload is None else json.dumps(payload).encode("utf-8") headers = { "Authorization": "Bearer " + require_key(), "Accept": "application/json", "User-Agent": user_agent(), } if data is not None: headers["Content-Type"] = "application/json" try: req = urllib.request.Request(url, data=data, headers=headers, method=method) with urllib.request.urlopen(req, timeout=TIMEOUT_SEC) as resp: ``` Equivalent authenticated behavior also occurs in `request_sse()` and `request_download()`. ### Technical Analysis The custom endpoint protection requires both `ARI_BASE_URL` and `ARI_ALLOW_CUSTOM_BASE=1`, which helps prevent accidental redir ...[truncated 2775 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Parse custom endpoints before accepting them: ```python parsed = urllib.parse.urlparse(override) ``` 2. Require HTTPS for all non-local authenticated endpoints: ```python if parsed.scheme != "https": raise SystemExit("Custom ARI endpoints must use HTTPS") ``` 3. If plaintext HTTP is required for local development, permit it only when all of the following are true: - The hostname is a loopback address such as `127.0.0.1`, `::1`, or `localhost`. - A separate, clearly named flag such as `ARI_ALLOW_INSECURE_LOCAL_HTTP=1` is present. - The documentation explicitly warns that production API keys must not be used in this mode. 4. Reject malformed or ambiguous endpoint forms, including: - Unsupported schemes such as `file`, `ftp`, or scheme-relative URLs. - URLs containing embedded user information. - URLs containing query strings or fragments. - Empty or invalid hostnames. 5. Apply the same validated endpoint object consistently to JSON, SSE, public, and download request functions. 6. Add automated tests confirming that: - The official HTTPS endpoint is accepted. - Custom HTTPS endpoints require explicit opt-in. - External HTTP endpoints are rejected even with the current custom-base opt-in. - Local HTTP endpoints are rejected unless a separate development-only flag is enabled. - Unsupported and malformed URL schemes cannot receive an authorization header. 7. Update `references/reference.md` and user documentation to state that authenticated custom endpoints must use TLS. ]]>
Vulnerability Patterns
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (44)

Lp3

Medium
Category
MCP Least Privilege
Confidence
95% confidence
Finding
The skill explicitly instructs use of shell commands, local file persistence for API keys, environment variables, and network access, yet no permissions are declared. This creates a hidden capability gap where an operator may believe the skill is a harmless checklist summarizer while it can actually execute commands, access credentials, and write state locally.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The manifest markets the skill as a narrow supplier-feedback checklist, but the body documents broad operational powers including paid analysis, monitoring, report export, competitor management, and account configuration. This kind of scope deception materially increases risk because users may grant trust and invoke the skill under false assumptions about what actions it can take and what data or credits it can affect.

Description-Behavior Mismatch

High
Confidence
97% confidence
Finding
The documented workflow goes far beyond supplier feedback and covers a large seller-operations surface, including monitoring, reporting, exports, and operational analysis. This broad undisclosed scope undermines informed consent and increases the chance of unauthorized data handling, persistent configuration changes, and billable actions.

Description-Behavior Mismatch

High
Confidence
98% confidence
Finding
The fixed operating entry explicitly redefines the skill as a product/supplier operations workflow, directly contradicting the checklist-only description. That contradiction is dangerous because it can be used to justify broader actions than the user expected, including quoting and running paid operations flows.

Context-Inappropriate Capability

Medium
Confidence
90% confidence
Finding
Advertising and search-keyword analysis are unrelated to a supplier-feedback checklist and widen the functional scope into marketing decision support. While not inherently malicious, this mismatch can expose users to unexpected paid actions and broader data processing than the declared purpose suggests.

Context-Inappropriate Capability

Medium
Confidence
93% confidence
Finding
Persistent monitoring and watch-management features introduce long-lived state changes and recurring scans that are outside the stated checklist purpose. This increases risk because a user invoking a one-time summarizer may unknowingly enable or manage ongoing monitoring workflows with account and data implications.

Description-Behavior Mismatch

High
Confidence
97% confidence
Finding
This skill claims to be limited to supplier-feedback checklist generation, but the code exposes broader product-operations workflows that can run remote operational analyses and actions outside that scope. Capability expansion beyond the declared purpose is dangerous because agents or users may invoke powerful functions under a narrower trust assumption, causing unauthorized business actions or data processing.

Description-Behavior Mismatch

High
Confidence
98% confidence
Finding
The code includes watch management, radar, benchmark, leaderboard, competitor analysis, exports, and other monitoring features that substantially exceed a checklist-only supplier-feedback skill. This mismatch increases the chance of overbroad data access, unintended remote state changes, and misuse by downstream agents that trust the manifest description as a boundary.

Context-Inappropriate Capability

Medium
Confidence
95% confidence
Finding
The skill can modify remote monitoring state (create/pause/resume/delete watches, schedules, competitors) and update workbench review statuses, despite the description saying it is only for feedback-list generation and not supplier contact or broader operational actions. Hidden write capabilities are risky because they enable persistent account-side changes under a misleadingly narrow user expectation.

Description-Behavior Mismatch

Medium
Confidence
90% confidence
Finding
Local export of reports and reviews exceeds the stated checklist-only purpose and creates additional data dissemination paths. Even if not inherently malicious, export functionality broadens the blast radius for sensitive review data and can bypass user expectations about where data will remain.

Description-Behavior Mismatch

High
Confidence
96% confidence
Finding
The documentation for a skill named and described as a limited 'supplier feedback checklist' exposes a much broader operational surface: data collection, paid analysis, monitoring, alerts, exports, competitor tracking, watch workflows, and account/billing interactions. This scope mismatch can cause an agent or user to invoke capabilities outside the advertised trust boundary, increasing the risk of unauthorized actions, unintended charges, excessive data access, and misuse of unrelated workflows.

Intent-Code Divergence

Medium
Confidence
90% confidence
Finding
The guide tells users that dedicated skills are scoped to their own scenarios, yet this same skill exposes unrelated multi-purpose workflows. That inconsistency is dangerous because it can mislead users and orchestration agents into over-trusting the skill's scope, making hidden or unexpected actions appear authorized under a narrowly named supplier-feedback tool.

Vague Triggers

Medium
Confidence
82% confidence
Finding
The natural-language trigger is broad enough to capture generic analytics requests, making it easy for the skill to handle intents beyond its declared supplier-feedback scope. Ambiguous routing increases the likelihood of overbroad execution, unexpected tool use, and accidental access to unrelated workflows.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
1. 运行 `check`,确认账户、邮箱验证状态和可用积点。
2. 用户要 VOC / 评论分析报告时,默认运行 `voc <ASIN> --site <站点>`。
   **返回里有 `autoConfirmed: true` 就说明已经直接生成了**(1.4.5 起:服务端对前几次小额
   付费操作免确认,用户先拿到结果再谈钱),此时把报告讲给用户,并转述 `autoConfirmNote`
   (本次扣了多少、还剩几次免确认、之后会先问)。**不要在拿到结果后再补问「要不要生成」。**
3. 返回 `confirmationRequired: true` 才需要用户确认:报出 `totalCredits` 与余额,
Confidence
96% confidence
Finding
This workflow permits report generation to proceed automatically when the backend flags the action as auto-confirmed, meaning a billable operation may execute without fresh per-request user consent. In the context of a deceptively narrow skill description, that increases the chance of unintended charges and unauthorized task execution.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
1. 运行 `check`,确认账户、邮箱验证状态和可用积点。
2. 用户要 VOC / 评论分析报告时,默认运行 `voc <ASIN> --site <站点>`。
   **返回里有 `autoConfirmed: true` 就说明已经直接生成了**(1.4.5 起:服务端对前几次小额
   付费操作免确认,用户先拿到结果再谈钱),此时把报告讲给用户,并转述 `autoConfirmNote`
   (本次扣了多少、还剩几次免确认、之后会先问)。**不要在拿到结果后再补问「要不要生成」。**
3. 返回 `confirmationRequired: true` 才需要用户确认:报出 `totalCredits` 与余额,
   用户同意后运行 `voc <ASIN> --site <站点> --confirm`。该命令会自动补齐采集、等待任务完成、
Confidence
95% confidence
Finding
The skill instructs the agent to default to running `voc` for analysis requests, which can trigger collection and paid report generation workflows with only conditional later confirmation. Default execution of a potentially billable workflow is risky because it reduces user control and can combine data collection with financial impact.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
用户只说自然语言。网页是补充视图(图表、分享链接、海报),不是把人送走的地方。

**确认与扣点**
- 报价返回 `autoConfirm: true` 时直接生成,不要再问「要不要」。生成后一句话交代:本次扣了多少、
  还剩几次免确认(或「免费版小额不问」)。策略由服务端决定:免费版小额不问;付费版前几次不问,之后先问。
- 用户说「以后别问了 / 50 以内直接做」→ 运行 `autoconfirm 50`;说「以后每次先问我」→ `autoconfirm off`;
  说「恢复默认」→ `autoconfirm default`。这是唯一需要你代用户设置的东西,设完复述一句当前规则。
Confidence
96% confidence
Finding
The documented confirmation model explicitly allows direct generation when `autoConfirm: true`, normalizing autonomous execution of billable operations. This is dangerous because the skill already has broader-than-declared powers, so automatic execution compounds both financial and scope-consent risk.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
**确认与扣点**
- 报价返回 `autoConfirm: true` 时直接生成,不要再问「要不要」。生成后一句话交代:本次扣了多少、
  还剩几次免确认(或「免费版小额不问」)。策略由服务端决定:免费版小额不问;付费版前几次不问,之后先问。
- 用户说「以后别问了 / 50 以内直接做」→ 运行 `autoconfirm 50`;说「以后每次先问我」→ `autoconfirm off`;
  说「恢复默认」→ `autoconfirm default`。这是唯一需要你代用户设置的东西,设完复述一句当前规则。
- 报价需要确认时,只说两个数:这次多少积点、余额多少,然后等用户一个「好」。采集是**固定单价**:直接说「15 积点/页 × 3 页 = 45 积点」,不要说成「预计 / 最多」——价格不会浮动;商品评论不够这么多页时只收实际采到的页数,差额自动退回(`pricingNote` 已写好这句)。不要罗列参数。
Confidence
90% confidence
Finding
The same `autoconfirm` setting pathway can persistently alter how future paid operations are authorized, making a single ambiguous instruction affect later sessions. Persistent weakening of confirmation controls materially increases the risk of unintended spending over time.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
**确认与扣点**
- 报价返回 `autoConfirm: true` 时直接生成,不要再问「要不要」。生成后一句话交代:本次扣了多少、
  还剩几次免确认(或「免费版小额不问」)。策略由服务端决定:免费版小额不问;付费版前几次不问,之后先问。
- 用户说「以后别问了 / 50 以内直接做」→ 运行 `autoconfirm 50`;说「以后每次先问我」→ `autoconfirm off`;
  说「恢复默认」→ `autoconfirm default`。这是唯一需要你代用户设置的东西,设完复述一句当前规则。
- 报价需要确认时,只说两个数:这次多少积点、余额多少,然后等用户一个「好」。采集是**固定单价**:直接说「15 积点/页 × 3 页 = 45 积点」,不要说成「预计 / 最多」——价格不会浮动;商品评论不够这么多页时只收实际采到的页数,差额自动退回(`pricingNote` 已写好这句)。不要罗列参数。
Confidence
90% confidence
Finding
The same `autoconfirm` setting pathway can persistently alter how future paid operations are authorized, making a single ambiguous instruction affect later sessions. Persistent weakening of confirmation controls materially increases the risk of unintended spending over time.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
说「恢复默认」→ `autoconfirm default`。这是唯一需要你代用户设置的东西,设完复述一句当前规则。
- 报价需要确认时,只说两个数:这次多少积点、余额多少,然后等用户一个「好」。采集是**固定单价**:直接说「15 积点/页 × 3 页 = 45 积点」,不要说成「预计 / 最多」——价格不会浮动;商品评论不够这么多页时只收实际采到的页数,差额自动退回(`pricingNote` 已写好这句)。不要罗列参数。

**新手(`check` 返回 `autoConfirm.mode` 为 `first_runs` / `free_small`,或问"然后呢")**
- 报告讲完只推一个下一步,附接口返回的成本,不写死月费用。用户同意再 `schedule --set weekly`。
- 不解释命令名,不列功能清单。用户问「还能做什么」时按他的产品状态给一条建议,不超过三句。
Confidence
84% confidence
Finding
The skill encourages proactive upsell to enable weekly scheduling after a report, which can lead the agent to steer users toward a persistent, potentially billable state change. Even though it says to wait for agreement, the surrounding autonomous workflow and scope mismatch make this more dangerous than normal product guidance.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
| `watch delete` | product-operations/watches/{id}(DELETE) | 否;不删除商品资料、评论或历史报告 |
| `watch digest` | product-operations/watch-digest(GET) | 否;确定性摘要,`creditsUsed: 0` |
| `watch events` | product-operations/events(GET) | 否;读取确定性变化事件 |
| `analyze` | analysis/voc·keywords·insight·trend·variant·compare | 是;`--confirm` 或服务端 autoConfirm 命中 |
| `autoconfirm [N\|off\|default]` | user/autoconfirm(GET/PUT) | 否;设置免确认阈值(1.4.5) |
| `deepdive` | products + charts + reviews + reports + VOC quote/analysis | 默认否;`--confirm` 才分析 |
| `reports` / `report` | reports | 否 |
Confidence
86% confidence
Finding
The documentation explicitly allows `analyze` to execute billable operations when server-side `autoConfirm` rules are met, meaning an agent may trigger paid actions without an explicit per-action user confirmation. In an agent context, this weakens human approval boundaries and can lead to unintended spending or actions based on ambiguous prompts.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
| `watch digest` | product-operations/watch-digest(GET) | 否;确定性摘要,`creditsUsed: 0` |
| `watch events` | product-operations/events(GET) | 否;读取确定性变化事件 |
| `analyze` | analysis/voc·keywords·insight·trend·variant·compare | 是;`--confirm` 或服务端 autoConfirm 命中 |
| `autoconfirm [N\|off\|default]` | user/autoconfirm(GET/PUT) | 否;设置免确认阈值(1.4.5) |
| `deepdive` | products + charts + reviews + reports + VOC quote/analysis | 默认否;`--confirm` 才分析 |
| `reports` / `report` | reports | 否 |
| `alerts` | alerts(`--mark-read` 时 alerts/read) | 否 |
Confidence
90% confidence
Finding
The same `autoconfirm` mechanism is a true security concern because it changes future authorization behavior, not just the current command. Persistent relaxation of confirmation creates a path for repeated unintended billable actions in later interactions.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
| `watch digest` | product-operations/watch-digest(GET) | 否;确定性摘要,`creditsUsed: 0` |
| `watch events` | product-operations/events(GET) | 否;读取确定性变化事件 |
| `analyze` | analysis/voc·keywords·insight·trend·variant·compare | 是;`--confirm` 或服务端 autoConfirm 命中 |
| `autoconfirm [N\|off\|default]` | user/autoconfirm(GET/PUT) | 否;设置免确认阈值(1.4.5) |
| `deepdive` | products + charts + reviews + reports + VOC quote/analysis | 默认否;`--confirm` 才分析 |
| `reports` / `report` | reports | 否 |
| `alerts` | alerts(`--mark-read` 时 alerts/read) | 否 |
Confidence
90% confidence
Finding
The same `autoconfirm` mechanism is a true security concern because it changes future authorization behavior, not just the current command. Persistent relaxation of confirmation creates a path for repeated unintended billable actions in later interactions.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
voc B0... --site amz_us 是完整 VOC 的入口:先取得报价,已有足够评论时使用当前分析价格;
数据不足时合并采集与分析费用。符合服务端免确认规则且总额不超过上限时可能直接生成,
返回 autoConfirmed。否则返回 confirmationRequired,取得用户同意后追加 --confirm,
自动完成必要采集、等待、分析和归档。只读询价应使用 quote / collect 报价入口。

`collect --asin B0... --site amz_us --pages 3` 只返回报价;确认后追加
Confidence
88% confidence
Finding
This section states that `voc` may directly perform collection, waiting, analysis, and archiving when auto-confirm conditions are satisfied. In a skill intended for agent use, chaining multiple billable and state-changing steps without explicit user approval increases the risk of unauthorized charges and unintended processing.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
先调用 `quote --type ...`。报价字段:
`type, basePrice, price, sampledReviews, totalReviews, balance, sufficient`,
另有(1.4.5):`autoConfirm`(true = 服务端首次体验策略允许免确认直接生成)、
`autoConfirmMaxCredits`(免确认单次上限,采集 + 报告合计)、`autoConfirmRemaining`(还剩几次)、
`autoConfirmNote`、`webUrl`(该产品的网页报告页)。`sampleCap` / `degraded` 表示 Free 样本封顶与轻量模型。
`voc` / `analyze` 在 autoConfirm 命中时会直接生成,返回 `autoConfirmed: true` 与 `autoConfirmNote`,
Confidence
85% confidence
Finding
The quote response includes `autoConfirm` metadata that signals when the system may proceed without further approval. In an agent environment, surfacing this as an execution condition can cause the agent to treat eligibility for auto-confirm as authorization, which is not the same as user consent.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
先调用 `quote --type ...`。报价字段:
`type, basePrice, price, sampledReviews, totalReviews, balance, sufficient`,
另有(1.4.5):`autoConfirm`(true = 服务端首次体验策略允许免确认直接生成)、
`autoConfirmMaxCredits`(免确认单次上限,采集 + 报告合计)、`autoConfirmRemaining`(还剩几次)、
`autoConfirmNote`、`webUrl`(该产品的网页报告页)。`sampleCap` / `degraded` 表示 Free 样本封顶与轻量模型。
`voc` / `analyze` 在 autoConfirm 命中时会直接生成,返回 `autoConfirmed: true` 与 `autoConfirmNote`,
并附 `web.report` / `web.product` 网页链接。
Confidence
85% confidence
Finding
This repeated autoConfirm behavior remains dangerous because it authorizes billable report generation without a fresh confirmation event from the user. The risk is amplified by the skill context, which includes multiple paid analysis commands and persistent account state.

Static analysis

No suspicious patterns detected.