Back to skill

Security audit

Amazon 产品差异化机会

Security checks for vulnerabilities and agentic risk

Overview

This appears to be a real ARI Amazon analysis skill, but it can spend credits and change ongoing monitoring or billing-confirmation settings with reduced user confirmation.

Install only if you are comfortable giving the skill access to your ARI account, Amazon product/review data, local report exports, and credit-consuming workflows. Before using it, set autoconfirm off if you want every paid action confirmed, and use explicit 'quote only' wording when you do not want the agent to generate reports or spend credits.

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

Lp3

Medium
Category
MCP Least Privilege
Confidence
92% confidence
Finding
The skill instructs use of shell, network, environment variables, and local file writes (e.g., running a Python CLI, browser-based setup, and saving an API key locally) but does not declare those capabilities in permissions metadata. This creates a trust and sandboxing gap: users and enforcement layers may not realize the skill can execute commands, access secrets, contact external services, and persist sensitive data.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding
The declared purpose is narrow product differentiation analysis, but the skill text authorizes many additional behaviors: account state inspection, paid collection and report generation, schedule/monitor management, competitor binding, exports, alerts, and operational workflows. This mismatch is dangerous because users may invoke the skill expecting low-risk analysis while it can perform broader state-changing and billable actions, increasing the chance of unintended charges, monitoring changes, or overcollection.

Vague Triggers

Medium
Confidence
82% confidence
Finding
The natural-language triggers are broad enough to match ordinary product-analysis conversation, and the skill is designed to infer parameters automatically and execute workflows without requiring structured commands. In a system with multiple skills or tools, this increases the risk of accidental activation and unintended external API calls or billable operations from ambiguous user phrasing.

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
95% confidence
Finding
The workflow explicitly permits proceeding with paid generation when the backend marks the action as auto-confirmed, meaning the user may be charged before receiving a fresh confirmation in the current interaction. Even if the service-side policy allows it, this is still an autonomous billable action initiated from conversational intent and therefore creates risk of unwanted charges and surprise external side effects.

Autonomous Decision Making

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

**确认与扣点**
- 报价返回 `autoConfirm: true` 时直接生成,不要再问「要不要」。生成后一句话交代:本次扣了多少、
  还剩几次免确认(或「免费版小额不问」)。策略由服务端决定:免费版小额不问;付费版前几次不问,之后先问。
- 用户说「以后别问了 / 50 以内直接做」→ 运行 `autoconfirm 50`;说「以后每次先问我」→ `autoconfirm off`;
  说「恢复默认」→ `autoconfirm default`。这是唯一需要你代用户设置的东西,设完复述一句当前规则。
Confidence
95% confidence
Finding
This section repeats the instruction to directly generate billable output whenever the quote reports `autoConfirm: true`, without a current-turn confirmation. Reaffirming autonomous charges in user-facing workflow text makes the behavior more dangerous because it normalizes silent execution for natural-language requests.

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 line also concentrates delegated authority in the assistant to alter future charge behavior, which increases blast radius beyond a single action. Because this affects subsequent sessions and commands, compromise or misinterpretation here has durable consequences compared with a one-time mistaken execution.

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 line also concentrates delegated authority in the assistant to alter future charge behavior, which increases blast radius beyond a single action. Because this affects subsequent sessions and commands, compromise or misinterpretation here has durable consequences compared with a one-time mistaken execution.

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
79% confidence
Finding
This section explicitly states that `voc` may directly generate a paid result when a server-side no-confirmation rule matches, causing collection, waiting, analysis, and archiving to proceed without an interactive confirmation step. In an agent setting, that creates a real autonomous-action and unintended-spend risk because a user asking for information could trigger billable work if the agent does not separately obtain clear 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`,
并附 `web.report` / `web.product` 网页链接。
Confidence
83% confidence
Finding
This duplicate finding points to the same sentence indicating direct execution on `autoConfirm`. The risk remains unintended paid actions initiated by the agent without a fresh user confirmation step, which is particularly relevant because analysis can also trigger data collection and archiving side effects.

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
83% confidence
Finding
This duplicate finding points to the same sentence indicating direct execution on `autoConfirm`. The risk remains unintended paid actions initiated by the agent without a fresh user confirmation step, which is particularly relevant because analysis can also trigger data collection and archiving side effects.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
另有(1.4.5):`autoConfirm`(true = 服务端首次体验策略允许免确认直接生成)、
`autoConfirmMaxCredits`(免确认单次上限,采集 + 报告合计)、`autoConfirmRemaining`(还剩几次)、
`autoConfirmNote`、`webUrl`(该产品的网页报告页)。`sampleCap` / `degraded` 表示 Free 样本封顶与轻量模型。
`voc` / `analyze` 在 autoConfirm 命中时会直接生成,返回 `autoConfirmed: true` 与 `autoConfirmNote`,
并附 `web.report` / `web.product` 网页链接。

- `voc`: Markdown VOC 报告,SSE 聚合后在 `data.content`,并归档。
Confidence
81% confidence
Finding
Again, the issue is not the mention of `autoConfirm` itself but the documented behavior that analysis may proceed and bill automatically. In an agent context this is a true autonomous-decision risk because a malicious or careless prompt could cause the agent to trigger paid analysis absent a clear confirmation boundary.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
另有(1.4.5):`autoConfirm`(true = 服务端首次体验策略允许免确认直接生成)、
`autoConfirmMaxCredits`(免确认单次上限,采集 + 报告合计)、`autoConfirmRemaining`(还剩几次)、
`autoConfirmNote`、`webUrl`(该产品的网页报告页)。`sampleCap` / `degraded` 表示 Free 样本封顶与轻量模型。
`voc` / `analyze` 在 autoConfirm 命中时会直接生成,返回 `autoConfirmed: true` 与 `autoConfirmNote`,
并附 `web.report` / `web.product` 网页链接。

- `voc`: Markdown VOC 报告,SSE 聚合后在 `data.content`,并归档。
Confidence
81% confidence
Finding
Again, the issue is not the mention of `autoConfirm` itself but the documented behavior that analysis may proceed and bill automatically. In an agent context this is a true autonomous-decision risk because a malicious or careless prompt could cause the agent to trigger paid analysis absent a clear confirmation boundary.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
另有(1.4.5):`autoConfirm`(true = 服务端首次体验策略允许免确认直接生成)、
`autoConfirmMaxCredits`(免确认单次上限,采集 + 报告合计)、`autoConfirmRemaining`(还剩几次)、
`autoConfirmNote`、`webUrl`(该产品的网页报告页)。`sampleCap` / `degraded` 表示 Free 样本封顶与轻量模型。
`voc` / `analyze` 在 autoConfirm 命中时会直接生成,返回 `autoConfirmed: true` 与 `autoConfirmNote`,
并附 `web.report` / `web.product` 网页链接。

- `voc`: Markdown VOC 报告,SSE 聚合后在 `data.content`,并归档。
Confidence
81% confidence
Finding
Again, the issue is not the mention of `autoConfirm` itself but the documented behavior that analysis may proceed and bill automatically. In an agent context this is a true autonomous-decision risk because a malicious or careless prompt could cause the agent to trigger paid analysis absent a clear confirmation boundary.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
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,
Confidence
91% confidence
Finding
The skill exposes and later relies on an auto-confirm policy that allows paid operations to proceed without an explicit per-action confirmation from the current interaction. In an agent context, this weakens transactional consent boundaries and can lead to unintended charges or execution of billable actions when the user did not actively approve that specific run.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
"release": release,
        "user": data_of(me),
        "balance": data_of(balance),
        "autoConfirm": data_of(auto) if ok(auto) else None,
    }, "links": links()}, args.compact)
Confidence
91% confidence
Finding
Including and honoring autoConfirm state in the command flow enables downstream logic to skip a user confirmation step for paid actions. In a skill used by an autonomous agent, that creates a real risk of unapproved spending and action execution based on persisted preferences rather than present-session consent.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
}, "links": links()}, args.compact)


AUTOCONFIRM_MODE_NOTE = {
    "always_ask": "每次付费操作都会先报价、等你确认。",
    "user_limit": "{limit} 积点以内的操作直接生成,超过才问你。",
    "free_small": "免费版 {max} 积点以内的操作直接生成(用的是赠送积点)。",
Confidence
88% confidence
Finding
The presence of predefined auto-confirm modes formalizes behavior where billable actions may execute without an immediate user checkpoint. That is risky in an agent-mediated environment because stored policy can be triggered indirectly, causing non-repudiation and billing issues even without code execution compromise.

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
90% confidence
Finding
This command allows modification of the auto-confirm threshold, making it easier for future paid operations to execute automatically. In a skill context, especially if the agent can invoke this command, it expands the chance of silently enabling billable behavior without strong user intent verification.

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
90% confidence
Finding
The logic around values like 'off', 'ask', or numeric thresholds is part of a feature that governs whether paid actions need confirmation. In an autonomous skill, changing or interpreting this state weakens spending safeguards and can convert quote-only flows into execution flows without current-session consent.

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
90% confidence
Finding
The logic around values like 'off', 'ask', or numeric thresholds is part of a feature that governs whether paid actions need confirmation. In an autonomous skill, changing or interpreting this state weakens spending safeguards and can convert quote-only flows into execution flows without current-session consent.

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
90% confidence
Finding
The logic around values like 'off', 'ask', or numeric thresholds is part of a feature that governs whether paid actions need confirmation. In an autonomous skill, changing or interpreting this state weakens spending safeguards and can convert quote-only flows into execution flows without current-session consent.

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
92% confidence
Finding
Persisting a user-selected auto-confirm limit through a PUT request changes future authorization behavior for paid commands. That creates a durable policy change affecting billing, which is security-relevant in an agent setting because it can outlast the original interaction and be abused for repeated unauthorized charges.

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
92% confidence
Finding
Persisting a user-selected auto-confirm limit through a PUT request changes future authorization behavior for paid commands. That creates a durable policy change affecting billing, which is security-relevant in an agent setting because it can outlast the original interaction and be abused for repeated unauthorized charges.

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
92% confidence
Finding
Persisting a user-selected auto-confirm limit through a PUT request changes future authorization behavior for paid commands. That creates a durable policy change affecting billing, which is security-relevant in an agent setting because it can outlast the original interaction and be abused for repeated unauthorized charges.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
"用法:autoconfirm 50(50 积点以内不问)/ autoconfirm off(每次都问)/ autoconfirm default(恢复默认)"),
                     args.compact)
                return
        out = request_json("PUT", "/api/v1/user/autoconfirm", {"limit": limit})
    else:
        out = request_json("GET", "/api/v1/user/autoconfirm")
    if ok(out) and isinstance(data_of(out), dict):
Confidence
85% confidence
Finding
Retrieving auto-confirm policy is not dangerous alone, but within this codebase it is part of a workflow that enables skipping explicit confirmations for paid actions. Because the surrounding design uses this setting for authorization decisions, it contributes to the same consent-bypass risk.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
return
        out = request_json("PUT", "/api/v1/user/autoconfirm", {"limit": limit})
    else:
        out = request_json("GET", "/api/v1/user/autoconfirm")
    if ok(out) and isinstance(data_of(out), dict):
        d = data_of(out)
        d["note"] = AUTOCONFIRM_MODE_NOTE.get(d.get("mode"), AUTOCONFIRM_MODE_NOTE["ask"]).format(
Confidence
85% confidence
Finding
Formatting and exposing the current auto-confirm note supports a feature that can normalize unattended billable execution. In isolation this is low risk, but in the context of the rest of the file it helps operationalize a confirmation-bypass mechanism for chargeable tasks.

Static analysis

No suspicious patterns detected.