Back to skill

Security audit

Amazon 转化表达优化

Security checks for vulnerabilities and agentic risk

Overview

The skill appears to be a legitimate ARI Amazon-review assistant, but it exposes broader paid, persistent, and account-changing powers than its narrow conversion-copy description suggests.

Install only if you are comfortable giving this skill an ARI API key and letting it access and modify ARI account/product data. Before use, set auto-confirm to always ask if you want per-charge approval, avoid ARI_BASE_URL overrides, choose export paths carefully, and treat monitoring, competitor, watch, and account-setting changes as persistent actions rather than one-off analysis.

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
scripts/ari.py:1169
Finding
Specialized Workflow Restrictions Can Be Bypassed Through CLI Overrides## Vulnerability Details **File Location**: `scripts/ari.py:1169-1171`, `scripts/ari.py:1200-1204`, and `scripts/ari.py:1641-1648` **Vulnerability Type**: Specialized workflow scope bypass **Risk Level**: Medium The specialized Skill declares an immutable `listing/conversion` workflow with the `ops_listing` output template. However, the CLI accepts user-controlled `--workflow` and `--focus` arguments and gives them precedence over the packaged defaults. Relevant code: ```python def operation_payload(args): defaults = operation_defaults() workflow = (getattr(args, "workflow", None) or defaults.get("workflow") or "").strip() focus = (getattr(args, "focus", None) or defaults.get("focus") or "").strip() if not workflow or not focus: return None, error_obj( "ARI_VALIDATION_ERROR", 0, "运营工作流缺少 workflow/focus", "通用 Skill 请显式传 --workflow 和 --focus;专属 Skill 会内置固定值。") request_id = (getattr(args, "request_id", None) or "").strip() or str(uuid.uuid4()) return { "requestId": request_id, "workflow": workflow, "focus": focus, "asin": args.asin.upper(), "site": args.site or defaults.get("defaultSite") or "amz_us", "competitorAsin": (getattr(args, "competitor", None) or "").upper(), }, None ``` The subsequent contract check validates only whether the remote account supports the selected combination: ```python supported = False for item in data.get("workflows") or []: if (item.get("workflow") == payload["workflow"] and payload["focus"] in (item.get("focuses") or [])): supported = True break if not supported: return error_obj("ARI_INVALID_OPERATIONS_WORKFLOW", 422, "服务端不支持该 workflow/focus 组合", "先运行 operations capabilities 查看当前白名单。") ``` The override parameters are exposed by the parser: ```python ...[truncated 3313 chars]
Remediation
## Remediation Suggestions 1. In this specialized distribution, always derive `workflow`, `focus`, and `outputTemplate` exclusively from `skill-defaults.json`. 2. Remove `--workflow` and `--focus` from the specialized CLI parser. If generic operation selection is required, publish it through a separately identified generic CLI or Skill. 3. If compatibility requires retaining these arguments, reject any supplied value that differs from the packaged contract: ```python expected_workflow = defaults.get("workflow") expected_focus = defaults.get("focus") if getattr(args, "workflow", None) not in (None, "", expected_workflow): return None, error_obj( "ARI_SPECIALIZED_SCOPE_VIOLATION", 403, "This specialized Skill only permits its packaged workflow.") if getattr(args, "focus", None) not in (None, "", expected_focus): return None, error_obj( "ARI_SPECIALIZED_SCOPE_VIOLATION", 403, "This specialized Skill only permits its packaged focus.") workflow = expected_workflow focus = expected_focus ``` 4. Validate the complete immutable tuple—`workflow`, `focus`, and `outputTemplate`—before both quote and run requests. 5. Include the expected output-template identifier in the request if the API supports it, and have the server reject mismatched specialized-channel requests. 6. Add regression tests proving that alternate workflow or focus arguments are rejected even when the authenticated account supports them. 7. Retain server-side capability checks as defense in depth, but do not rely on them to enforce the specialized Skill's narrower scope.
Vulnerability Patterns
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Taint TrackingDirect Taint Flow, Variable-Mediated Taint Flow, Credential Exfiltration Chain
  • 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 (33)

Tainted flow: 'req' from os.environ.get (line 1459, credential/environment) → urllib.request.urlopen (network output)

Critical
Category
Data Flow
Content
headers = {"Authorization": "Bearer " + require_key(), "User-Agent": user_agent()}
    try:
        req = urllib.request.Request(url, headers=headers, method="GET")
        with urllib.request.urlopen(req, timeout=TIMEOUT_SEC) as resp:
            note_release(resp.headers)
            ctype = resp.headers.get("Content-Type", "")
            body = resp.read()
Confidence
92% confidence
Finding
The export download path sends the Bearer API key to base_url(), and unlike the public config endpoint this operation may also transfer exported review/report data. While custom base override is double-gated, if an attacker can influence both environment variables in the agent runtime, this becomes direct credential and data exfiltration to an arbitrary host.

Lp3

Medium
Category
MCP Least Privilege
Confidence
91% confidence
Finding
The skill instructs the agent to use shell, network, environment-based secrets, and local file writes, but no permissions are explicitly declared. That mismatch weakens sandboxing and user transparency: a reviewer or runtime may underestimate the skill's ability to access credentials, contact external services, and persist data locally. In this context, those capabilities are operationally necessary, but undeclared capability scope is still a genuine security issue.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding
The manifest frames the skill as a narrow, evidence-driven conversion-copy diagnostic, but the body authorizes a much broader operational surface: paid collection jobs, account and billing actions, scheduling, monitoring, competitor management, exports, alerts, and multiple analysis workflows. This kind of description-behavior gap is dangerous because users and platform controls may grant trust appropriate for a read-only advisory skill while the skill can actually trigger charges, modify settings, and create persistent monitoring state.

Description-Behavior Mismatch

High
Confidence
98% confidence
Finding
The skill claims it is not for advertising use, yet it explicitly instructs the agent to generate ad keywords, negative keywords, competitor brand terms, and Search Terms strings. That is a direct scope violation that can cause users to invoke a supposedly limited diagnostic skill for ad-targeting outputs they did not expect, undermining trust and bypassing policy boundaries encoded in the manifest.

Context-Inappropriate Capability

Medium
Confidence
90% confidence
Finding
The skill allows the agent to change account-level auto-confirmation settings, which affects future spending authorization behavior beyond the immediate task. That is risky because a user engaging a copy-diagnosis skill may not reasonably expect it to modify persistent billing/consent settings, and such changes can increase the chance of unintended paid actions later.

Description-Behavior Mismatch

High
Confidence
97% confidence
Finding
The skill metadata says it is only for evidence-driven conversion-copy diagnosis, but the code implements broad unrelated capabilities: product operations, watch management, alerts, leaderboard queries, workbench actions, exports, and monitoring changes. In an agent context, this materially expands the action surface beyond user expectations and could be used to perform remote account changes or access additional data under the guise of a narrow diagnostic skill.

Context-Inappropriate Capability

High
Confidence
96% confidence
Finding
This file can mutate remote state unrelated to copy diagnosis, including autoconfirm settings, schedules, competitor lists, watches, review-status workflow, and product operations. In a skill environment, hidden or unexpected state-changing actions increase the risk of unauthorized account changes and unintended spend, especially when invoked by a broader agent planner.

Description-Behavior Mismatch

Medium
Confidence
86% confidence
Finding
The skill writes downloaded review exports and reports to local files, which exceeds a purely diagnostic interaction model and can leave sensitive business data on disk. In shared, synced, or ephemeral agent environments, that creates additional confidentiality and retention risk.

Description-Behavior Mismatch

High
Confidence
95% confidence
Finding
The usage guide exposes capabilities far beyond the manifest’s declared scope of evidence-driven conversion-copy diagnosis, including monitoring, exports, alerts, and other operational workflows. This scope mismatch is dangerous because an agent or user may invoke higher-risk or billable actions under the assumption the skill is narrowly limited, weakening consent boundaries, review accuracy, and least-privilege expectations.

Description-Behavior Mismatch

High
Confidence
97% confidence
Finding
This section documents paid operational-report and watch features unrelated to the declared copy-diagnosis purpose, expanding the skill into product monitoring and operations. Such hidden breadth increases the chance of unauthorized spend, unintended data access, and misuse by an agent that trusts the manifest to represent the full action surface.

Description-Behavior Mismatch

Medium
Confidence
93% confidence
Finding
The guide includes customer-service and market-intelligence functions such as AI replies, alerts, benchmarking, leaderboard queries, and exports that do not fit the stated narrow purpose. Even if individually legitimate, bundling them into a supposedly constrained skill undermines transparency and can cause overbroad access, unexpected charges, or policy bypass through misleading packaging.

Intent-Code Divergence

Medium
Confidence
88% confidence
Finding
The opening description frames the skill as a simple Amazon comment-analysis assistant, but later sections introduce materially broader paid analysis and monitoring behavior. This inconsistent positioning is dangerous because it can mislead reviewers and users about what the skill can actually do, reducing informed consent and increasing the chance of unsafe or unexpected invocation.

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
93% confidence
Finding
This instruction tells the agent to proceed with a paid VOC generation whenever the backend marks the action as auto-confirmed, without an explicit fresh user confirmation in-session. Even if the backend permits it, the skill is enabling autonomous spending behavior under a broad natural-language trigger, which increases the chance of unintended charges.

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
The workflow continues from quote to `--confirm` after a minimal acknowledgment, while also allowing automatic collection and report generation as part of the same command. This compresses consent around a billable, state-changing action and can lead to users authorizing charges without understanding that collection, waiting, archival, and billing all happen in one step.

Autonomous Decision Making

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

**确认与扣点**
- 报价返回 `autoConfirm: true` 时直接生成,不要再问「要不要」。生成后一句话交代:本次扣了多少、
  还剩几次免确认(或「免费版小额不问」)。策略由服务端决定:免费版小额不问;付费版前几次不问,之后先问。
- 用户说「以后别问了 / 50 以内直接做」→ 运行 `autoconfirm 50`;说「以后每次先问我」→ `autoconfirm off`;
  说「恢复默认」→ `autoconfirm default`。这是唯一需要你代用户设置的东西,设完复述一句当前规则。
Confidence
93% confidence
Finding
The skill explicitly instructs the agent to directly generate paid results whenever `autoConfirm: true` is returned. That shifts spending control from the user to prior account configuration and backend heuristics, which is especially risky in a skill presented as an analysis assistant rather than an account automation tool.

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 run `autoconfirm off` also constitutes account-level policy modification. While safer than raising thresholds, it still means the skill can change persistent user settings unrelated to a one-off conversion diagnosis task, broadening authority in a way that is not clearly disclosed by the manifest.

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 run `autoconfirm off` also constitutes account-level policy modification. While safer than raising thresholds, it still means the skill can change persistent user settings unrelated to a one-off conversion diagnosis task, broadening authority in a way that is not clearly disclosed by the manifest.

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
`autoconfirm default` restores a persistent account behavior and therefore remains a state-changing policy action. The issue is not whether the new setting is stricter or looser, but that a narrowly described skill is permitted to modify future billing authorization semantics at all.

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
82% confidence
Finding
This section explicitly says VOC generation may proceed automatically when server-side auto-confirm rules are met, including automatic collection, waiting, analysis, and archiving. In an agent skill context, that creates a real risk of performing billable or state-changing actions without fresh user confirmation, especially because the command can consume credits and trigger downstream processing. The surrounding documentation makes this more dangerous by normalizing autonomous execution for paid operations.

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
84% confidence
Finding
This line documents an `autoConfirm` quote field that signals the backend may allow immediate generation without an additional confirmation step. In an autonomous agent setting, exposing and relying on that signal can cause the agent to interpret eligibility as permission, leading to unauthorized paid analysis or state changes. Because the skill requires a live API key and interfaces with billable operations, the risk is practical rather than theoretical.

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
84% confidence
Finding
This duplicate finding references the same language describing direct execution under `autoConfirm`. The underlying issue remains that an agent could perform billable analysis without explicit user intent at the moment of action, which is unsafe for a tool holding a live API key. The problem appears negligent rather than malicious because the document frames it as convenience behavior, not deception.

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
84% confidence
Finding
This duplicate finding references the same language describing direct execution under `autoConfirm`. The underlying issue remains that an agent could perform billable analysis without explicit user intent at the moment of action, which is unsafe for a tool holding a live API key. The problem appears negligent rather than malicious because the document frames it as convenience behavior, not deception.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
`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
The `autoConfirmMaxCredits`/remaining-note context supports an autonomous spend-control model rather than an explicit user-approval model. While credit caps limit damage, they do not eliminate the vulnerability: an agent can still incur charges and perform actions the user did not expressly approve. In a commercial analysis skill, unauthorized low-to-moderate spend is still a meaningful security and trust issue.

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
83% confidence
Finding
Same location and same issue: `autoConfirm` permits direct execution of a paid workflow, which is inappropriate for an autonomous agent unless the user has clearly opted in for that specific action. Even with service-side limits, this can still lead to unauthorized spending and surprise report generation, so it should be treated as a real vulnerability in the agent-skill context.

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
83% confidence
Finding
Same location and same issue: `autoConfirm` permits direct execution of a paid workflow, which is inappropriate for an autonomous agent unless the user has clearly opted in for that specific action. Even with service-side limits, this can still lead to unauthorized spending and surprise report generation, so it should be treated as a real vulnerability in the agent-skill context.

Static analysis

No suspicious patterns detected.