Back to skill

Security audit

VOC洞察

Security checks for vulnerabilities and agentic risk

Overview

This is a real ARI review-analysis skill, but it can spend ARI credits automatically under account auto-confirm rules without fresh approval.

Before installing, make sure you are comfortable giving this skill an ARI API key, sending Amazon ASIN/review analysis requests to ari.funewa.com, and letting it manage ARI-side review workflows. If you want every credit spend approved first, turn auto-confirm off before using paid VOC/analyze flows and be careful with requests that change future confirmation limits, schedules, watches, competitors, or workbench statuses.

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:1144
Finding
Server-Controlled Auto-Confirmation Can Trigger Paid Analysis Without Explicit User Approval<![CDATA[ ## Vulnerability Details **File Location**: `scripts/ari.py:1144-1148` and `scripts/ari.py:1353-1357` **Vulnerability Type**: Server-controlled authorization of chargeable operations **Risk Level**: Medium ### Vulnerable Code From `scripts/ari.py:1144-1148`: ```python # 首次体验免确认(服务端策略 skill.autoConfirm):前几次小额直接生成,不再多问一轮。 auto_confirmed = False if not confirm and q_data.get("autoConfirm") and q_data.get("sufficient"): confirm = True auto_confirmed = True ``` From `scripts/ari.py:1353-1357`: ```python # 首次体验免确认:服务端 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) ``` The behavior is also directed by `SKILL.md:95-97` and `SKILL.md:148-151`, which instruct the Agent to proceed without asking the user when the service returns an auto-confirmation state. ### Technical Analysis The CLI normally uses the local `--confirm` option as the authorization boundary for chargeable operations. These branches bypass that boundary when the remote API returns `autoConfirm=true`. Both the permission to proceed and, in the VOC path, the applicable spending threshold are derived from remote response fields. Consequently, the same service that reports the price and account state can authorize execution without a fresh user decision. This is unsafe because a compromised service, incorrect backend policy, account-state error, or malformed response could cause a command invoked without `--confirm` to perform a paid operation. The charge occurs before the user receives the post-execution `autoConfirmNote`. This issue does not grant operating-system privileges or expose arbitrary local files. Its scope is the authenticated ARI account and the consumption of its available credits. ### Attack Path 1. A user requests a VOC or oth ...[truncated 1427 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Require a local `--confirm` flag for every operation that can consume credits. A remote response must not be sufficient to convert an unconfirmed request into a chargeable request. 2. Treat `autoConfirm` and `autoConfirmMaxCredits` as informational fields only. Return the quote to the user instead of automatically executing it. 3. If persistent automatic approval is required, make it an explicit local user preference: - Store the preference in the protected local configuration. - Require the user to set a numeric maximum explicitly. - Apply a conservative local upper bound. - Never increase that limit based on a server response. 4. Bind approval to the complete quoted transaction, including operation type, ASIN, site, collection pages, and exact maximum credit cost. Re-quote if any field changes. 5. Display the exact charge and balance before execution, then require affirmative approval unless a previously configured local limit covers the transaction. 6. Record a local audit entry for automatically approved transactions, including timestamp, request identifier, quoted amount, and the local policy that authorized execution. 7. Update `SKILL.md` so that the Agent does not interpret a server-provided auto-confirmation flag as user consent. ]]>
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
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
Findings (67)

Ae1

High
Category
analysis-evasion
Content
- CLI:本 Skill 目录下的 `scripts/ari.py`。在 Skill 根目录执行,例如
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- CLI:本 Skill 目录下的 `scripts/ari.py`。在 Skill 根目录执行,例如
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- CLI:本 Skill 目录下的 `scripts/ari.py`。在 Skill 根目录执行,例如
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- CLI:本 Skill 目录下的 `scripts/ari.py`。在 Skill 根目录执行,例如
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- CLI:本 Skill 目录下的 `scripts/ari.py`。在 Skill 根目录执行,例如
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- CLI:本 Skill 目录下的 `scripts/ari.py`。在 Skill 根目录执行,例如
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- CLI:本 Skill 目录下的 `scripts/ari.py`。在 Skill 根目录执行,例如
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- CLI:本 Skill 目录下的 `scripts/ari.py`。在 Skill 根目录执行,例如
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- CLI:本 Skill 目录下的 `scripts/ari.py`。在 Skill 根目录执行,例如
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- CLI:本 Skill 目录下的 `scripts/ari.py`。在 Skill 根目录执行,例如
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- CLI:本 Skill 目录下的 `scripts/ari.py`。在 Skill 根目录执行,例如
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- CLI:本 Skill 目录下的 `scripts/ari.py`。在 Skill 根目录执行,例如
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Lp1

High
Category
MCP Least Privilege
Confidence
92% confidence
Finding
The script reads environment variables, writes local files, and performs outbound network requests, but the finding indicates those capabilities are not declared in the skill's permission model. In an agent ecosystem, undeclared capabilities are dangerous because users and orchestrators may trust an incomplete permission surface and unknowingly allow credential handling, file persistence, and external data exfiltration paths.

Lp1

High
Category
MCP Least Privilege
Confidence
92% confidence
Finding
The script reads environment variables, writes local files, and performs outbound network requests, but the finding indicates those capabilities are not declared in the skill's permission model. In an agent ecosystem, undeclared capabilities are dangerous because users and orchestrators may trust an incomplete permission surface and unknowingly allow credential handling, file persistence, and external data exfiltration paths.

Lp1

High
Category
MCP Least Privilege
Confidence
92% confidence
Finding
The script reads environment variables, writes local files, and performs outbound network requests, but the finding indicates those capabilities are not declared in the skill's permission model. In an agent ecosystem, undeclared capabilities are dangerous because users and orchestrators may trust an incomplete permission surface and unknowingly allow credential handling, file persistence, and external data exfiltration paths.

Natural-Language Policy Violations

Medium
Confidence
92% confidence
Finding
The skill documentation is entirely in Chinese and provides example prompts and usage instructions only in Chinese, such as the invocation text on L10 and the Chinese command on L20. This effectively imposes a specific language/locale on users without documenting an opt-in or offering an alternative language, which matches the language-policy violation criteria.

Vague Triggers

Medium
Confidence
93% confidence
Finding
The manifest says to use the skill when the user asks about broad topics like customer insights, persona, purchase motivation, listing optimization, and similar Chinese phrases. These are common business-analysis requests that could overlap with many unrelated conversations, and the file does not provide negative examples or tighter constraints for when this specific skill should or should not activate.

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
98% confidence
Finding
This instruction permits the skill to proceed with paid report generation when the backend marks the action as auto-confirmed, without obtaining a fresh, explicit user confirmation at execution time. That creates a real unauthorized-action risk because the user may incur charges from a natural-language request that did not clearly approve spending in the current session.

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
97% confidence
Finding
The workflow instructs the agent to run a paid command after minimal acknowledgment and to rely on service-side confirmation behavior, which weakens user control over billable actions. In an agent setting, this can lead to unintended purchases or data-collection charges triggered by ambiguous requests.

Autonomous Decision Making

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

**确认与扣点**
- 报价返回 `autoConfirm: true` 时直接生成,不要再问「要不要」。生成后一句话交代:本次扣了多少、
  还剩几次免确认(或「免费版小额不问」)。策略由服务端决定:免费版小额不问;付费版前几次不问,之后先问。
- 用户说「以后别问了 / 50 以内直接做」→ 运行 `autoconfirm 50`;说「以后每次先问我」→ `autoconfirm off`;
  说「恢复默认」→ `autoconfirm default`。这是唯一需要你代用户设置的东西,设完复述一句当前规则。
Confidence
98% confidence
Finding
The skill explicitly tells the agent to execute billable generation automatically when the quote response indicates autoConfirm, removing a meaningful confirmation checkpoint. This is dangerous because financial-impacting actions should require explicit user authorization in the conversational context, not just permissive server settings.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
**确认与扣点**
- 报价返回 `autoConfirm: true` 时直接生成,不要再问「要不要」。生成后一句话交代:本次扣了多少、
  还剩几次免确认(或「免费版小额不问」)。策略由服务端决定:免费版小额不问;付费版前几次不问,之后先问。
- 用户说「以后别问了 / 50 以内直接做」→ 运行 `autoconfirm 50`;说「以后每次先问我」→ `autoconfirm off`;
  说「恢复默认」→ `autoconfirm default`。这是唯一需要你代用户设置的东西,设完复述一句当前规则。
- 报价需要确认时,只说两个数:这次多少积点、余额多少,然后等用户一个「好」。采集是**固定单价**:直接说「15 积点/页 × 3 页 = 45 积点」,不要说成「预计 / 最多」——价格不会浮动;商品评论不够这么多页时只收实际采到的页数,差额自动退回(`pricingNote` 已写好这句)。不要罗列参数。
Confidence
95% confidence
Finding
Allowing the agent to change account confirmation preferences based on informal natural-language cues can permanently lower future safeguards and enable subsequent unintended spending. Although the text says this is the only delegated setting, it still changes billing-control posture and therefore has security relevance.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
- 报价返回 `autoConfirm: true` 时直接生成,不要再问「要不要」。生成后一句话交代:本次扣了多少、
  还剩几次免确认(或「免费版小额不问」)。策略由服务端决定:免费版小额不问;付费版前几次不问,之后先问。
- 用户说「以后别问了 / 50 以内直接做」→ 运行 `autoconfirm 50`;说「以后每次先问我」→ `autoconfirm off`;
  说「恢复默认」→ `autoconfirm default`。这是唯一需要你代用户设置的东西,设完复述一句当前规则。
- 报价需要确认时,只说两个数:这次多少积点、余额多少,然后等用户一个「好」。采集是**固定单价**:直接说「15 积点/页 × 3 页 = 45 积点」,不要说成「预计 / 最多」——价格不会浮动;商品评论不够这么多页时只收实际采到的页数,差额自动退回(`pricingNote` 已写好这句)。不要罗列参数。

**新手(`check` 返回 `autoConfirm.mode` 为 `first_runs` / `free_small`,或问"然后呢")**
Confidence
94% confidence
Finding
The instruction reduces confirmation to a minimal 'OK' after only showing price and balance, which is weak authorization for a paid action in a conversational environment. Ambiguous acknowledgments can be misinterpreted, resulting in unintended execution and charges.

Natural-Language Policy Violations

Medium
Confidence
91% confidence
Finding
The instructions state that the report language should follow the user, but also specify that the CLI default is zh and remind the agent to pass --language en for non-Chinese replies. This creates a default forced locale behavior unless the agent actively overrides it, rather than making language choice explicit or neutral by default.

Natural-Language Policy Violations

Medium
Confidence
81% confidence
Finding
The display name, description, and default prompt all force Chinese-language interaction, but the file does not state that the skill is intended only for Chinese-speaking users or offer any language/locale choice. This may violate language/locale policy if users are not given an explicit opt-in or documented regional limitation.

Vague Triggers

Medium
Confidence
89% confidence
Finding
The default prompt encourages one-click use of the skill for any Amazon ASIN without stating activation boundaries, required user consent, or checks that an ARI API key and review-analysis context are appropriate. Overly broad invocation text can cause unintended routing to this skill for loosely related requests, increasing the chance of unnecessary external-data actions or misleading analysis being performed without clear user intent.

Static analysis

No suspicious patterns detected.