Back to skill

Security audit

Amazon 用户场景提炼

Security checks for vulnerabilities and agentic risk

Overview

The skill is a real ARI Amazon review-analysis tool, but it needs review because it can spend credits, change recurring monitoring, and alter persistent billing-confirmation settings under broad natural-language workflows.

Install only if you are comfortable connecting your ARI account, storing an ARI API key on this machine, and letting the skill manage ARI review-analysis workflows. Before use, consider setting auto-confirm to 'off' if you want every paid action approved first, and review any requests that create schedules, watches, competitor tracking, exports, or workbench status changes.

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
Findings (1)

T01 · Skill Instruction Hijacking

Warning
Location
SKILL.md:230
Finding
Mandatory Vendor Promotion and External-Link Injection into User-Facing Reports## Vulnerability Details **File Location**: `SKILL.md:230-231` **Additional Locations**: `SKILL.md:103-104`, `SKILL.md:143-146` **Vulnerability Type**: T01: Skill Instruction Hijacking **Risk Level**: Medium ### Vulnerable Instruction The following is an English translation of the complete instruction at the primary location: ```text When the output contains reportUrl, it must be appended at the end using the fixed wording: "View the complete graphical report online / Export: <reportUrl>" (login to the account that owns the report is required). ``` Related instructions additionally require the agent to promote keyword-analysis functionality after producing a VOC report and to append the web report link using prescribed promotional wording. ### Technical Analysis The Skill imposes persistent vendor-oriented output requirements that are not strictly necessary to extract use cases from Amazon reviews. Whenever the external service returns a `reportUrl`, the agent is instructed to insert that URL into its final answer using fixed wording. Other instructions direct the agent to proactively mention additional vendor features even when the user did not request them. This behavior alters the agent's response objectives from answering the user's request to promoting and directing traffic to the Skill vendor's external service. Because these instructions are loaded as part of the Skill and are phrased as mandatory behavior, they can override the agent's ordinary discretion regarding relevance, concision, and whether an external link should be presented. The URL is generated from the configured ARI web base. The default is `https://ari.funewa.com`; a custom web base is accepted only when `ARI_ALLOW_CUSTOM_BASE=1` is also set. This control reduces accidental redirection but does not eliminate the underlying output manipulation. ### Attack Path 1. A user activates the Amazon use-case mining Skill. 2. The agent loads th ...[truncated 1347 chars]
Remediation
## Remediation Suggestions 1. Remove mandatory fixed promotional wording from the Skill instructions. 2. Present `reportUrl` only when the user requests an online report, export link, or graphical view, or when the link is directly necessary to complete the requested task. 3. Clearly label external links as optional and identify their destination domain before presenting them. 4. Remove instructions requiring unsolicited promotion of keyword analysis, sharing, posters, billing pages, or other commercial features. 5. Preserve the agent's discretion to omit irrelevant links when the user requests a concise answer. 6. Validate generated links against an explicit HTTPS origin allowlist before including them in output. 7. Treat custom web-base configuration separately from API development configuration, and display a clear warning when a non-production host will be exposed to users. 8. Never automatically open returned URLs or transmit additional credentials to report links.
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 (23)

Lp3

Medium
Category
MCP Least Privilege
Confidence
92% confidence
Finding
The skill instructs use of shell, network, environment-variable, and file-write capabilities while declaring no permissions, creating a misleading trust boundary for reviewers and users. In this context, those capabilities are used to store API keys locally, invoke external services, and export files, so the missing declaration can hide sensitive side effects and increase the risk of unauthorized secret handling or local file modification.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding
The stated purpose is narrow use-case mining, but the documented behavior includes billing/account inspection, paid task execution, persistent API-key management, watch/schedule administration, competitor management, export to local files, and operational workflows. This mismatch is dangerous because users may invoke the skill expecting limited analysis behavior while the skill can perform account-affecting, cost-incurring, and persistence-related actions well beyond the declared scope.

Description-Behavior Mismatch

Medium
Confidence
91% confidence
Finding
The implementation materially exceeds the stated 'use-case mining' scope by exposing product operations, monitoring, alerts, workbench, competitor management, and export capabilities. Scope drift is dangerous in agent environments because users and policy layers may authorize the skill based on a narrow declared purpose while the code can perform broader actions and handle more data than expected.

Context-Inappropriate Capability

High
Confidence
94% confidence
Finding
These product-operations workflows support operational recommendation and generation functions beyond scenario-insight extraction. In an agent context, that increases the chance of unauthorized business-action guidance, paid execution, or unsafe downstream automation under a misleadingly narrow skill description.

Context-Inappropriate Capability

Medium
Confidence
90% confidence
Finding
Persistent watches, alerts, schedules, radar, and competitor tracking introduce ongoing monitoring behavior not implied by a one-off use-case-mining tool. That mismatch matters because continuous surveillance and competitor analysis can expand data retention, background activity, and billing beyond what users expect from the declared skill purpose.

Description-Behavior Mismatch

High
Confidence
93% confidence
Finding
The documentation materially expands the skill from review/use-case insight into broader operational workflows such as monitoring, alerts, benchmarking, exports, and competitor management. That scope drift weakens user consent boundaries and can cause the agent to perform actions or process data outside the declared purpose, increasing the risk of unauthorized use, billing surprises, and policy non-compliance.

Description-Behavior Mismatch

High
Confidence
91% confidence
Finding
The guide advertises '画像' analysis, which commonly implies profiling/persona inference, despite the manifest stating the skill must not be used for demographic inference. This contradiction can lead operators or downstream agents to generate sensitive or unsupported inferences from review data, violating the declared safety boundary and potentially creating privacy/compliance issues.

Intent-Code Divergence

Medium
Confidence
88% confidence
Finding
The skill claims to be limited to scenario insight, but the guide later instructs the agent to optimize listing copy and generate AI reply/appeal content. This creates a misleading trust boundary: users and host platforms may permit the skill under a narrower purpose than what the instructions actually enable, resulting in unanticipated content generation and possible misuse.

Vague Triggers

Medium
Confidence
81% confidence
Finding
The natural-language entry points are intentionally broad and instruct the agent to infer parameters and proceed with workflow decisions automatically. Because this skill can trigger paid collection, report generation, scheduling, and account-state changes, vague activation boundaries increase the chance of unintended execution from casual or ambiguous user requests.

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
This workflow explicitly allows the service to auto-confirm and execute paid report generation before obtaining contemporaneous user approval in the current conversation. Even if the backend policy enables it, the agent is still authorizing a charge-triggering action from natural-language intent alone, which can lead to unintended spending and surprise account mutations.

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
94% confidence
Finding
The documented flow continues from inferred user intent to `voc --confirm` after minimal confirmation handling, while also allowing the command to perform bundled collection, waiting, generation, and archival automatically. Bundling multiple chargeable and state-changing steps into one confirmation path raises the risk of users authorizing more than they realize, especially in a conversational interface.

Autonomous Decision Making

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

**确认与扣点**
- 报价返回 `autoConfirm: true` 时直接生成,不要再问「要不要」。生成后一句话交代:本次扣了多少、
  还剩几次免确认(或「免费版小额不问」)。策略由服务端决定:免费版小额不问;付费版前几次不问,之后先问。
- 用户说「以后别问了 / 50 以内直接做」→ 运行 `autoconfirm 50`;说「以后每次先问我」→ `autoconfirm off`;
  说「恢复默认」→ `autoconfirm default`。这是唯一需要你代用户设置的东西,设完复述一句当前规则。
Confidence
96% confidence
Finding
The instruction to directly generate whenever `autoConfirm: true` appears is a clear autonomous spending policy. In this skill, that is more dangerous because the same document also supports paid collection and account-affecting workflows, so a broad natural-language request can cascade into billable execution without a fresh user 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 also normalizes persistent spending-policy changes through short natural-language phrases, which can be misinterpreted or socially engineered in conversation. Because the setting survives the session, the harm is not limited to one mistaken action and may enable repeated unintended charges later.

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 also normalizes persistent spending-policy changes through short natural-language phrases, which can be misinterpreted or socially engineered in conversation. Because the setting survives the session, the harm is not limited to one mistaken action and may enable repeated unintended charges later.

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
76% confidence
Finding
The documented `autoconfirm [N|off|default]` command can alter persistent billing consent behavior across later requests. In a tool-using agent, this expands authority beyond a single task and may let subsequent paid analyses execute without renewed user awareness, which is a meaningful safety issue even if the feature is intentional.

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
76% confidence
Finding
The documented `autoconfirm [N|off|default]` command can alter persistent billing consent behavior across later requests. In a tool-using agent, this expands authority beyond a single task and may let subsequent paid analyses execute without renewed user awareness, which is a meaningful safety issue even if the feature is intentional.

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
96% confidence
Finding
The analysis path can automatically flip confirm=True when the server returns autoConfirm and sufficient, causing a paid analysis to execute without an explicit local confirmation from the current caller. In an agent setting, this is risky because a user may believe the skill always quotes first, while backend policy silently changes that behavior and permits billable actions.

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
95% confidence
Finding
This branch records that the operation was auto-confirmed after bypassing the normal confirmation prompt. The danger is not the flag itself but that it reflects a real paid action initiated without per-request user confirmation.

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
95% confidence
Finding
Checking q_data.get('autoConfirm') to trigger execution delegates authorization of paid actions to remote policy rather than explicit current-user intent. That can surprise users and enable unwanted spending through autonomous agent flows.

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
97% confidence
Finding
The one-click VOC workflow can auto-confirm a combined collect+analysis bill based on server-provided policy and a local credit calculation, even when the caller did not pass --confirm. Because this chain can trigger multiple paid steps, the impact is higher than a quote-only shortcut and is especially risky in an agent context where users may expect an approval checkpoint before charges.

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
96% confidence
Finding
Using server autoConfirm and autoConfirmMaxCredits to decide whether to proceed delegates spending authorization to remote account state instead of the immediate user request. That can lead to surprise charges and unintended execution of data collection plus report generation.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
# 首次体验免确认:服务端 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:
        combined_quote["autoConfirmRemaining"] = analysis_quote.get("autoConfirmRemaining")
Confidence
95% confidence
Finding
This condition determines whether to skip the quote-return path and move ahead with paid operations despite no explicit confirmation flag. The behavior weakens the expected consent boundary around billable actions.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
# 首次体验免确认:服务端 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:
        combined_quote["autoConfirmRemaining"] = analysis_quote.get("autoConfirmRemaining")
Confidence
95% confidence
Finding
This condition determines whether to skip the quote-return path and move ahead with paid operations despite no explicit confirmation flag. The behavior weakens the expected consent boundary around billable actions.

Static analysis

No suspicious patterns detected.