Back to skill

Security audit

亚马逊用户画像分析 · 买家人群洞察

Security checks for vulnerabilities and agentic risk

Overview

This appears to be a real ARI Amazon review-analysis skill, but it gives the agent broad paid and account-changing abilities beyond buyer-persona analysis.

Review this before installing if you want a narrow buyer-persona tool. It stores an ARI API key locally and can access your ARI account data, generate paid reports under account auto-confirm rules, export files locally, and change monitoring or confirmation settings. Use it only if you are comfortable with those ARI account capabilities; set the account to ask before every paid action and say "only quote, do not execute" when you want a price check only.

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
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • 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 (27)

Lp3

Medium
Category
MCP Least Privilege
Confidence
94% confidence
Finding
The skill directs the agent to use shell, network, environment variables, and local file writes, yet it declares no permissions. This creates a transparency and policy-enforcement gap: a host may expose fewer safeguards because the manifest understates the skill’s real capabilities, while the skill still performs authentication, API calls, and local config/export writes.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding
The advertised purpose is narrow buyer-persona analysis, but the instructions authorize a much broader operational surface including billing state changes, auto-confirm policy changes, scheduled monitoring, exports, competitor management, and multiple paid analyses. This mismatch can mislead users and reviewers about what the skill may do, increasing the chance of consent bypass, unexpected charges, or broader data access than intended.

Description-Behavior Mismatch

Medium
Confidence
91% confidence
Finding
The skill metadata frames this as a buyer-persona tool built from reviews, but the code exposes a much broader control surface: product operations, watches, alerts, exports, workbench flows, benchmarking, and leaderboard queries. This scope expansion increases the chance that an agent invokes state-changing or paid capabilities the user did not expect, violating least privilege and raising misuse risk in an agentic context.

Context-Inappropriate Capability

Medium
Confidence
92% confidence
Finding
This file includes state-changing account and workflow management operations such as autoconfirm changes, schedule updates, competitor management, watch creation/deletion, and status mutations. In a buyer-persona skill, these actions are not necessary for answering persona questions, so exposing them materially increases the blast radius if the agent is prompted or misrouted into performing unintended account changes or billable actions.

Description-Behavior Mismatch

Medium
Confidence
95% confidence
Finding
The usage guide describes a broad, general-purpose ARI review-operations assistant with data collection, exports, monitoring, billing, alerts, watch, and operations workflows that materially exceed the declared buyer-persona purpose of this skill. That scope mismatch can cause an agent or user to invoke unintended capabilities, including paid actions and wider data access, undermining least privilege and informed consent.

Intent-Code Divergence

Medium
Confidence
97% confidence
Finding
The file presents the installed skill as amazon-user-persona, but the documented behavior is for a general ARI review assistant and multiple specialized tools. This identity and capability confusion increases the chance that an orchestrator or end user will trust the skill for a narrow analysis task while it actually exposes a much broader operational surface, including potentially chargeable or state-changing actions.

Natural-Language Policy Violations

Medium
Confidence
80% confidence
Finding
Defaulting to the US marketplace when the user does not specify a site can cause analysis, collection, charges, or outputs to be performed against the wrong regional dataset without explicit user choice. In this skill context, that is more dangerous because the guide also documents collection and paid workflows, so an implicit default can lead to unintended external actions and misleading business conclusions.

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 skill instructs the agent to execute VOC generation immediately when the backend indicates auto-confirm, even though this may consume credits and generate paid reports without an interaction-time confirmation from the user. In an agent setting, backend-side 'autoConfirmed' still results in autonomous spending based on inferred intent, which is risky when requests are ambiguous or user expectations are narrower than the tool behavior.

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
96% confidence
Finding
This flow authorizes the agent to proceed from a simple report request into automatic collection, waiting, report generation, and archival once the user says yes to a quote. Because the command chains multiple state-changing and potentially billable operations under one confirmation, users may not appreciate the full scope of what will happen or what persistent artifacts will be created.

Autonomous Decision Making

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

**确认与扣点**
- 报价返回 `autoConfirm: true` 时直接生成,不要再问「要不要」。生成后一句话交代:本次扣了多少、
  还剩几次免确认(或「免费版小额不问」)。策略由服务端决定:免费版小额不问;付费版前几次不问,之后先问。
- 用户说「以后别问了 / 50 以内直接做」→ 运行 `autoconfirm 50`;说「以后每次先问我」→ `autoconfirm off`;
  说「恢复默认」→ `autoconfirm default`。这是唯一需要你代用户设置的东西,设完复述一句当前规则。
Confidence
95% confidence
Finding
The instruction to directly generate on 'autoConfirm: true' normalizes agent-side autonomous spending and removes an opportunity for the user to verify intent at execution time. In security terms, this is dangerous because natural-language triggers can be ambiguous, and an attacker or prompt confusion could steer the agent into paid actions the user did not knowingly approve.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
**确认与扣点**
- 报价返回 `autoConfirm: true` 时直接生成,不要再问「要不要」。生成后一句话交代:本次扣了多少、
  还剩几次免确认(或「免费版小额不问」)。策略由服务端决定:免费版小额不问;付费版前几次不问,之后先问。
- 用户说「以后别问了 / 50 以内直接做」→ 运行 `autoconfirm 50`;说「以后每次先问我」→ `autoconfirm off`;
  说「恢复默认」→ `autoconfirm default`。这是唯一需要你代用户设置的东西,设完复述一句当前规则。
- 报价需要确认时,只说两个数:这次多少积点、余额多少,然后等用户一个「好」。采集是**固定单价**:直接说「15 积点/页 × 3 页 = 45 积点」,不要说成「预计 / 最多」——价格不会浮动;商品评论不够这么多页时只收实际采到的页数,差额自动退回(`pricingNote` 已写好这句)。不要罗列参数。
Confidence
93% confidence
Finding
The same autoconfirm-setting instruction is a true risk because it persists beyond the current task and changes future billing behavior. Persistent lowering of confirmation barriers makes subsequent accidental or manipulated paid executions more likely.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
**确认与扣点**
- 报价返回 `autoConfirm: true` 时直接生成,不要再问「要不要」。生成后一句话交代:本次扣了多少、
  还剩几次免确认(或「免费版小额不问」)。策略由服务端决定:免费版小额不问;付费版前几次不问,之后先问。
- 用户说「以后别问了 / 50 以内直接做」→ 运行 `autoconfirm 50`;说「以后每次先问我」→ `autoconfirm off`;
  说「恢复默认」→ `autoconfirm default`。这是唯一需要你代用户设置的东西,设完复述一句当前规则。
- 报价需要确认时,只说两个数:这次多少积点、余额多少,然后等用户一个「好」。采集是**固定单价**:直接说「15 积点/页 × 3 页 = 45 积点」,不要说成「预计 / 最多」——价格不会浮动;商品评论不够这么多页时只收实际采到的页数,差额自动退回(`pricingNote` 已写好这句)。不要罗列参数。
Confidence
93% confidence
Finding
The same autoconfirm-setting instruction is a true risk because it persists beyond the current task and changes future billing behavior. Persistent lowering of confirmation barriers makes subsequent accidental or manipulated paid executions more likely.

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
88% confidence
Finding
After delivering a report, the skill tells the agent to proactively upsell and, upon agreement, enable weekly scheduled collection. This is a persistent monitoring/state change that can create recurring cost and ongoing data collection, so having the agent drive the decision based on product status increases the risk of nudging users into more durable commitments than they 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:
Confidence
89% confidence
Finding
The skill allows changing the account-wide autoconfirm threshold, which can authorize future billable operations to proceed without per-action confirmation. In an agent setting, exposing this knob inside a persona-analysis skill is risky because prompt confusion or misuse can silently weaken the user's spending safeguards beyond the current task.

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
89% confidence
Finding
This command processes user-supplied values to modify confirmation policy, including disabling prompts for low-cost actions. In context, embedding spending-policy mutation in a buyer-persona skill unnecessarily increases the chance of unintended autonomous purchasing behavior later.

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
89% confidence
Finding
This command processes user-supplied values to modify confirmation policy, including disabling prompts for low-cost actions. In context, embedding spending-policy mutation in a buyer-persona skill unnecessarily increases the chance of unintended autonomous purchasing behavior later.

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
89% confidence
Finding
This command processes user-supplied values to modify confirmation policy, including disabling prompts for low-cost actions. In context, embedding spending-policy mutation in a buyer-persona skill unnecessarily increases the chance of unintended autonomous purchasing behavior later.

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
90% confidence
Finding
The PUT to /api/v1/user/autoconfirm performs a persistent account setting change that may enable later charges without an explicit confirmation step. This is dangerous in an agentic environment because it modifies future decision boundaries, not just the current request.

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
90% confidence
Finding
The PUT to /api/v1/user/autoconfirm performs a persistent account setting change that may enable later charges without an explicit confirmation step. This is dangerous in an agentic environment because it modifies future decision boundaries, not just the current request.

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
90% confidence
Finding
The PUT to /api/v1/user/autoconfirm performs a persistent account setting change that may enable later charges without an explicit confirmation step. This is dangerous in an agentic environment because it modifies future decision boundaries, not just the current request.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
if not ok(quote):
        return quote
    q_data = data_of(quote) or {}
    # 首次体验免确认(服务端策略 skill.autoConfirm):前几次小额直接生成,不再多问一轮。
    auto_confirmed = False
    if not confirm and q_data.get("autoConfirm") and q_data.get("sufficient"):
        confirm = True
Confidence
94% confidence
Finding
The analysis flow automatically flips confirm=True when the server says autoConfirm is allowed and the balance is sufficient, causing paid analysis to execute without an explicit per-request confirmation from the current interaction. In a normal CLI this may be a product choice, but in an agent-operated skill it increases the risk of unintended billable actions triggered by ambiguous prompts or scope confusion.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
return quote
    q_data = data_of(quote) or {}
    # 首次体验免确认(服务端策略 skill.autoConfirm):前几次小额直接生成,不再多问一轮。
    auto_confirmed = False
    if not confirm and q_data.get("autoConfirm") and q_data.get("sufficient"):
        confirm = True
        auto_confirmed = True
Confidence
94% confidence
Finding
Setting the local auto_confirmed flag here is part of a path that proceeds with paid generation absent explicit user approval for this invocation. In a skill advertised for persona analysis, autonomous spend is especially risky because users may expect analysis-only behavior, not charge-triggering execution.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
q_data = data_of(quote) or {}
    # 首次体验免确认(服务端策略 skill.autoConfirm):前几次小额直接生成,不再多问一轮。
    auto_confirmed = False
    if not confirm and q_data.get("autoConfirm") and q_data.get("sufficient"):
        confirm = True
        auto_confirmed = True
    if not confirm:
Confidence
94% confidence
Finding
This branch honors server-side autoConfirm to bypass the manual quote-confirm loop for paid analysis. That weakens transactional safety in an agent environment, where maintaining an explicit consent boundary per spend event is important.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
if plan is not None and plan["balance"]["note"]:
        combined_quote["siteNote"] = plan["balance"]["note"]
    combined_quote["webUrl"] = analysis_quote.get("webUrl")
    # 首次体验免确认:服务端 autoConfirm=true 且「采集 + 报告」合计不超过单次上限时,直接跑完。
    # 在聊天里多问一句「确认吗」,很多用户就不回了——先让他拿到结果。
    auto_max = int(analysis_quote.get("autoConfirmMaxCredits") or 0)
    auto_confirmed = (not args.confirm and bool(analysis_quote.get("autoConfirm"))
Confidence
95% confidence
Finding
The combined VOC flow explicitly supports automatically confirming and executing both collection and analysis charges on first-use conditions, without requiring the user to append --confirm. Because this can trigger multiple paid operations in sequence, the impact is more serious than quote-only analysis bypass and is particularly risky in an agentic skill context.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
combined_quote["webUrl"] = analysis_quote.get("webUrl")
    # 首次体验免确认:服务端 autoConfirm=true 且「采集 + 报告」合计不超过单次上限时,直接跑完。
    # 在聊天里多问一句「确认吗」,很多用户就不回了——先让他拿到结果。
    auto_max = int(analysis_quote.get("autoConfirmMaxCredits") or 0)
    auto_confirmed = (not args.confirm and bool(analysis_quote.get("autoConfirm"))
                      and sufficient and total_credits <= auto_max)
    if not args.confirm and not auto_confirmed:
Confidence
95% confidence
Finding
This line computes whether to bypass confirmation for a combined paid workflow based on server-provided autoConfirm settings and a credit ceiling. It is dangerous because it converts a quoted, potentially multi-step billable process into an autonomous action without a fresh user approval boundary.

Static analysis

No suspicious patterns detected.