Back to skill

Security audit

Amazon 评论转行动

Security checks for vulnerabilities and agentic risk

Overview

The skill is not clearly malicious, but it can use an ARI account key for paid analyses and persistent account settings, sometimes without a fresh per-action confirmation.

Review this carefully before installing. Use it only if you trust ARI with your Amazon review data and are comfortable storing an ARI API key locally. If you want every charge approved first, turn autoconfirm off before analysis, and watch for schedule, watch, competitor, export, and workbench actions that can affect future account behavior or local files.

Vulnerability Patterns
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • 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)

T05 · Unauthorized Access and Privilege Escalation

Warning
Location
SKILL.md:35
Finding
Mandatory Account-Wide Data Retrieval Exceeds Task-Specific Least Privilege## Vulnerability Details **File Location**: `SKILL.md:35, 91-95`; implementation in `scripts/ari.py:584-601, 1494-1500` **Vulnerability Type**: Excessive account-wide API access **Risk Level**: Medium ### Vulnerable Code and Instructions `SKILL.md:35`: ```markdown - CLI:本 Skill 目录下的 `scripts/ari.py`。在 Skill 根目录执行,例如 `python scripts/ari.py check`;每次会话先跑一次 `check`。 ``` `SKILL.md:91-95`: ```markdown 8. 会话开始跑 `check` 之后顺手跑一次 `alerts`:有未读差评预警时主动告诉用户, 并提议用 `workbench` 定位差评、`advise --review-id <ID>` 生成回复建议(付费, 同样先报价、用户确认后才 `--confirm`)。 ``` `scripts/ari.py:584-601`: ```python def cmd_check(args): # 先取公开发布信息:Key 无效时也能顺带告诉用户「你的版本旧了、去哪儿更新」。 release = fetch_release() me = request_json("GET", "/api/v1/user/me") if not ok(me): emit(me, args.compact) return balance = request_json("GET", "/api/v1/credits/balance") if not ok(balance): emit(balance, args.compact) return # 免确认策略(1.4.5):告诉 agent 当前用户是「小额直接生成」还是「每次先问」 auto = request_json("GET", "/api/v1/user/autoconfirm") emit({"success": True, "data": { "skillVersion": VERSION, "release": release, "user": data_of(me), "balance": data_of(balance), "autoConfirm": data_of(auto) if ok(auto) else None, }, "links": links()}, args.compact) ``` `scripts/ari.py:1494-1500`: ```python def cmd_alerts(args): """情感预警(免费)。差评突增等预警由服务端离线生成,这里只读。""" if args.mark_read: emit(request_json("POST", "/api/v1/alerts/read"), args.compact) return emit(request_json("GET", "/api/v1/alerts", params={"limit": args.limit}), args.compact) ``` ### Technical Analysis The Skill requires the Agent to run `check` at the beginning of every session and then retrieve alerts. The `check` operation obtains account identity data, credit balances, and the account’s automatic-confirmation policy. The subsequent `alerts` request retrieves account-wide review alerts. These requests are not inherently malicious and use t ...[truncated 2255 chars]
Remediation
## Remediation Suggestions 1. Remove the unconditional requirement to run `check` and `alerts` at the beginning of every session. 2. Run `check` only when authentication validation, balance information, or billing authorization is necessary for the requested operation. 3. Retrieve alerts only when the user explicitly requests alerts or opts into proactive account monitoring. 4. Add an ASIN filter to alert retrieval and default it to the ASIN in the current request. 5. Request explicit consent before loading account-wide alerts or unrelated product information into Agent context. 6. Split `check` into narrowly scoped operations, such as authentication status, balance, and automatic-confirmation policy, so the Agent retrieves only what the current task requires. 7. Minimize returned profile fields and redact unnecessary identifiers before emitting API responses. 8. Document the exact account information retrieved and its purpose during authorization. 9. Avoid additional authenticated calls when cached session-level authentication status is sufficient and safe to reuse.
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 (34)

Lp3

Medium
Category
MCP Least Privilege
Confidence
87% confidence
Finding
The skill explicitly instructs use of shell commands, local key setup/configuration, networked API calls, and local persistence, yet it declares no permissions. That mismatch weakens review-time trust boundaries and can cause the host or user to grant broader capabilities implicitly without informed consent, especially because the skill also handles API credentials and paid operations.

Tp4

High
Category
MCP Tool Poisoning
Confidence
94% confidence
Finding
The advertised purpose is narrow—turning reviews into product-action tasks—but the skill actually exposes broad account, billing, export, watch-management, competitor, report, and generic AI-analysis workflows. This description-behavior gap is security-relevant because users may authorize a seemingly limited skill that can perform materially broader data access and account-affecting actions, including paid and persistent configuration changes.

Description-Behavior Mismatch

High
Confidence
95% confidence
Finding
The skill manifest says it is not for contacting buyers, but the code implements `advise` to generate AI reply suggestions for individual reviews. Even if it does not directly send messages, generating buyer-facing reply content materially enables prohibited outreach and bypasses the stated safety boundary of the skill.

Description-Behavior Mismatch

High
Confidence
92% confidence
Finding
The product-operations workflow engine expands the skill from review summarization into generalized operational actions and workflow execution. That scope mismatch is dangerous because agents may invoke capabilities beyond the user's expected review-to-action analysis boundary, increasing the chance of unintended business-side changes or overbroad automation.

Context-Inappropriate Capability

Medium
Confidence
83% confidence
Finding
The code mutates alerts state and review workbench status, which goes beyond passive summarization into workflow-state modification. While lower risk than direct external actions, this can still alter user records and downstream handling without fitting the advertised 'review-to-action summarization' purpose.

Description-Behavior Mismatch

Medium
Confidence
92% confidence
Finding
The documentation exposes capabilities beyond the declared review-to-action scope, including AI-generated replies/appeals for individual reviews and category leaderboard queries. This scope mismatch can mislead a host agent or user into invoking higher-risk workflows that may incur charges, perform unintended actions, or bypass policy expectations established by the manifest.

Description-Behavior Mismatch

Medium
Confidence
95% confidence
Finding
The usage guide documents broad product operations and watch/monitoring workflows that are materially wider than the stated skill purpose of turning reviews into evidence-driven actions. In an agent environment, this kind of undocumented scope expansion is dangerous because it can cause the agent to perform monitoring, operations, or workflow execution the user did not expect from this skill, increasing the risk of unintended data access, persistent actions, and billable activity.

Vague Triggers

Low
Confidence
90% confidence
Finding
The default prompt says to use the skill whenever the user asks to turn an Amazon ASIN's review problems into actionable product-improvement tasks, but it does not define clear boundaries, exclusions, or required safeguards. This can cause the skill to be invoked in overly broad situations, increasing the chance of misuse, unintended data handling, or actions outside the stated evidence-driven scope.

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
92% confidence
Finding
The workflow permits a paid VOC command to be run by default, and if the backend marks it auto-confirmed the report is generated and credits consumed before the user gives transaction-specific consent in-session. This is dangerous because a natural-language analytical request can trigger billable actions automatically, reducing the user's ability to make an informed approval decision at execution time.

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
90% confidence
Finding
This step normalizes a pattern where the system runs billable collection/report generation as the default path for analysis requests, only asking for consent when the service demands it. That makes the danger contextually higher because the skill also emphasizes users should not need to know commands or configuration, increasing the chance of silent paid execution from ordinary language.

Autonomous Decision Making

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

**确认与扣点**
- 报价返回 `autoConfirm: true` 时直接生成,不要再问「要不要」。生成后一句话交代:本次扣了多少、
  还剩几次免确认(或「免费版小额不问」)。策略由服务端决定:免费版小额不问;付费版前几次不问,之后先问。
- 用户说「以后别问了 / 50 以内直接做」→ 运行 `autoconfirm 50`;说「以后每次先问我」→ `autoconfirm off`;
  说「恢复默认」→ `autoconfirm default`。这是唯一需要你代用户设置的东西,设完复述一句当前规则。
Confidence
95% confidence
Finding
The instruction to proceed directly when `autoConfirm: true` effectively delegates spending authority to backend policy instead of requiring the user's contemporaneous consent. In a skill that can incur charges and generate persistent outputs, this creates an unsafe autonomy boundary where ordinary requests may trigger paid actions without an explicit yes/no checkpoint.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
**确认与扣点**
- 报价返回 `autoConfirm: true` 时直接生成,不要再问「要不要」。生成后一句话交代:本次扣了多少、
  还剩几次免确认(或「免费版小额不问」)。策略由服务端决定:免费版小额不问;付费版前几次不问,之后先问。
- 用户说「以后别问了 / 50 以内直接做」→ 运行 `autoconfirm 50`;说「以后每次先问我」→ `autoconfirm off`;
  说「恢复默认」→ `autoconfirm default`。这是唯一需要你代用户设置的东西,设完复述一句当前规则。
- 报价需要确认时,只说两个数:这次多少积点、余额多少,然后等用户一个「好」。采集是**固定单价**:直接说「15 积点/页 × 3 页 = 45 积点」,不要说成「预计 / 最多」——价格不会浮动;商品评论不够这么多页时只收实际采到的页数,差额自动退回(`pricingNote` 已写好这句)。不要罗列参数。
Confidence
88% confidence
Finding
The same line introduces an account-level autoconfirm setting that can authorize future paid operations up to a threshold, which compounds risk beyond a single run. If misunderstood or socially engineered through casual conversation, it can lead to repeated unwanted charges without per-action review.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
**确认与扣点**
- 报价返回 `autoConfirm: true` 时直接生成,不要再问「要不要」。生成后一句话交代:本次扣了多少、
  还剩几次免确认(或「免费版小额不问」)。策略由服务端决定:免费版小额不问;付费版前几次不问,之后先问。
- 用户说「以后别问了 / 50 以内直接做」→ 运行 `autoconfirm 50`;说「以后每次先问我」→ `autoconfirm off`;
  说「恢复默认」→ `autoconfirm default`。这是唯一需要你代用户设置的东西,设完复述一句当前规则。
- 报价需要确认时,只说两个数:这次多少积点、余额多少,然后等用户一个「好」。采集是**固定单价**:直接说「15 积点/页 × 3 页 = 45 积点」,不要说成「预计 / 最多」——价格不会浮动;商品评论不够这么多页时只收实际采到的页数,差额自动退回(`pricingNote` 已写好这句)。不要罗列参数。
Confidence
88% confidence
Finding
The same line introduces an account-level autoconfirm setting that can authorize future paid operations up to a threshold, which compounds risk beyond a single run. If misunderstood or socially engineered through casual conversation, it can lead to repeated unwanted charges without per-action review.

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 reference explicitly states that `analyze` may execute billable analysis when server-side `autoConfirm` rules are met, even without an explicit per-action confirmation from the current user session. In an agent setting, that creates a real autonomy risk: the agent could trigger paid operations and external processing based on ambient defaults rather than fresh user consent.

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
This duplicate finding points to the same `autoconfirm` behavior: a persistent user setting that alters future confirmation requirements. Because it affects later transactions, it is more dangerous than a one-time action and can be abused by an over-permissive agent.

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
This duplicate finding points to the same `autoconfirm` behavior: a persistent user setting that alters future confirmation requirements. Because it affects later transactions, it is more dangerous than a one-time action and can be abused by an over-permissive agent.

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
89% confidence
Finding
This section states that VOC generation may proceed automatically when server-side no-confirmation rules match, including collection, waiting, analysis, and archiving. In a security review of an agent skill, that is a true autonomy vulnerability because the agent can trigger a multi-step paid workflow and data processing without obtaining contemporaneous user approval.

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
88% confidence
Finding
The quoted fields include `autoConfirm` metadata indicating that the server may allow direct generation on first-use or under policy thresholds. Exposing and potentially acting on that signal in an agent workflow increases the chance of unintended autonomous purchases or analyses when the user expected a quote-only interaction.

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
88% confidence
Finding
This duplicate finding refers to the same direct-generation behavior under `autoConfirm`. The security issue is not the metadata itself but permitting the agent to treat it as authorization, which can cause unintended paid actions.

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
88% confidence
Finding
This duplicate finding refers to the same direct-generation behavior under `autoConfirm`. The security issue is not the metadata itself but permitting the agent to treat it as authorization, which can cause unintended paid actions.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
}


def cmd_autoconfirm(args):
    """免确认阈值:不带参数=查看;`autoconfirm 50`=50 积点以内不问;`autoconfirm off`=每次都问;`autoconfirm default`=恢复默认。"""
    value = (args.value or "").strip().lower()
    if value:
Confidence
86% confidence
Finding
This command allows changing autoconfirm thresholds so future paid operations may run without per-action confirmation. In an agent setting, enabling or loosening autoconfirm can weaken user-consent safeguards around billable or consequential actions, especially given the skill already exposes broad operational capabilities.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
def cmd_autoconfirm(args):
    """免确认阈值:不带参数=查看;`autoconfirm 50`=50 积点以内不问;`autoconfirm off`=每次都问;`autoconfirm default`=恢复默认。"""
    value = (args.value or "").strip().lower()
    if value:
        if value in ("off", "ask", "0"):
Confidence
86% confidence
Finding
The parsing branch supports disabling per-action prompts (`off`, numeric limits, reset), which is part of the same consent-reduction surface. In a conversational or agent-mediated environment, that can let an agent reconfigure future spending behavior more broadly than the user intended.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
def cmd_autoconfirm(args):
    """免确认阈值:不带参数=查看;`autoconfirm 50`=50 积点以内不问;`autoconfirm off`=每次都问;`autoconfirm default`=恢复默认。"""
    value = (args.value or "").strip().lower()
    if value:
        if value in ("off", "ask", "0"):
Confidence
86% confidence
Finding
The parsing branch supports disabling per-action prompts (`off`, numeric limits, reset), which is part of the same consent-reduction surface. In a conversational or agent-mediated environment, that can let an agent reconfigure future spending behavior more broadly than the user intended.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
def cmd_autoconfirm(args):
    """免确认阈值:不带参数=查看;`autoconfirm 50`=50 积点以内不问;`autoconfirm off`=每次都问;`autoconfirm default`=恢复默认。"""
    value = (args.value or "").strip().lower()
    if value:
        if value in ("off", "ask", "0"):
Confidence
86% confidence
Finding
The parsing branch supports disabling per-action prompts (`off`, numeric limits, reset), which is part of the same consent-reduction surface. In a conversational or agent-mediated environment, that can let an agent reconfigure future spending behavior more broadly than the user intended.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
limit = int(value)
            except ValueError:
                emit(error_obj("ARI_BAD_ARGUMENT", 0, "参数不对",
                               "用法:autoconfirm 50(50 积点以内不问)/ autoconfirm off(每次都问)/ autoconfirm default(恢复默认)"),
                     args.compact)
                return
        out = request_json("PUT", "/api/v1/user/autoconfirm", {"limit": limit})
Confidence
88% confidence
Finding
The PUT to `/api/v1/user/autoconfirm` performs the actual state change that can authorize future automatic paid execution under thresholds. This is not catastrophic remote code execution, but it is a real control-plane change that weakens transactional consent boundaries in this skill context.

Static analysis

No suspicious patterns detected.