Back to skill

Security audit

Amazon 消费者预期差距

Security checks for vulnerabilities and agentic risk

Overview

The skill is a real Amazon review analysis tool, but it can trigger paid analysis, persistent billing preferences, monitoring, exports, and account changes beyond the narrow expectation-gap label.

Review this skill carefully before installing. It is not just a passive expectation-gap checker: it can use your ARI account key, spend credits under auto-confirm rules, change future confirmation settings, manage monitoring, export review/report data locally, and alter account-side product workflow state. Install only if you trust the ARI service and publisher, understand the billing rules, and are comfortable disabling autoconfirm if you want every paid action approved first.

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:306
Finding
Bearer API Key May Be Forwarded Across Origins During HTTP Redirects<![CDATA[ ## Vulnerability Details **File Location**: `scripts/ari.py:306-320`, `scripts/ari.py:338-350`, and `scripts/ari.py:1457-1460` **Vulnerability Type**: Cross-origin credential disclosure through automatic redirect handling **Risk Level**: Medium ### Vulnerable Code ```python def request_json(method, path, payload=None, params=None): query = { "method": method, "path": path, "params": {k: v for k, v in (params or {}).items() if v not in (None, "")}, "payload": payload, } url = base_url() + path if query["params"]: url += "?" + urllib.parse.urlencode(query["params"], doseq=True) data = None if payload is None else json.dumps(payload).encode("utf-8") headers = { "Authorization": "Bearer " + require_key(), "Accept": "application/json", "User-Agent": user_agent(), } if data is not None: headers["Content-Type"] = "application/json" try: req = urllib.request.Request(url, data=data, headers=headers, method=method) with urllib.request.urlopen(req, timeout=TIMEOUT_SEC) as resp: ``` The same pattern is used for authenticated Server-Sent Events: ```python def request_sse(path, payload, recovery_hint=None): query = {"method": "POST", "path": path, "params": {}, "payload": payload} url = base_url() + path headers = { "Authorization": "Bearer " + require_key(), "Accept": "text/event-stream", "Content-Type": "application/json", "User-Agent": user_agent(), } result = {"meta": None, "content": "", "result": None, "reportId": 0, "creditsUsed": 0} try: req = urllib.request.Request( url, data=json.dumps(payload).encode("utf-8"), headers=headers, method="POST") with urllib.request.urlopen(req, timeout=SSE_TIMEOUT_SEC) as resp: ``` Authenticated downloads are also affected: ```python headers = {"Authorization": "Bearer " + require_key(), "User-Agent": user_agent()} ...[truncated 3155 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Disable automatic redirects for every authenticated request and handle redirect responses explicitly. 2. If redirects are required, permit them only when all of the following match the original trusted origin: - Scheme is `https`. - Normalized hostname is identical. - Effective port is identical. - Destination contains no user-information component. 3. Remove `Authorization`, cookies, and other sensitive headers whenever the destination origin changes. 4. Prefer rejecting cross-origin redirects rather than attempting to resend an authenticated request. 5. Apply the same protected opener to JSON, SSE, and download requests so the policy cannot diverge between request paths. 6. Consider limiting the maximum number of redirects and rejecting HTTPS-to-HTTP downgrade redirects unconditionally. 7. Add automated tests for: - Same-origin relative redirects. - Cross-origin redirects. - HTTPS-to-HTTP redirects. - Redirect loops. - Alternate ports and hostname canonicalization. - Verification that an attacker-controlled test server never receives the bearer header. 8. Encourage key rotation after suspected redirect or proxy compromise, and ensure server-side API keys can be promptly revoked. A restrictive handler can follow this design: ```python class SameOriginRedirectHandler(urllib.request.HTTPRedirectHandler): def redirect_request(self, req, fp, code, msg, headers, newurl): old = urllib.parse.urlsplit(req.full_url) new = urllib.parse.urlsplit( urllib.parse.urljoin(req.full_url, newurl) ) old_port = old.port or (443 if old.scheme == "https" else 80) new_port = new.port or (443 if new.scheme == "https" else 80) if ( new.scheme != "https" or old.scheme != new.scheme or old.hostname != new.hostname or old_port != new_port or new.username is not None or new.password is n ...[truncated 495 chars]
Vulnerability Patterns
  • 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
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
Findings (47)

Lp3

Medium
Category
MCP Least Privilege
Confidence
97% confidence
Finding
The skill explicitly instructs the agent to use shell execution, network access, local file writes, and environment/API-key handling, but it does not declare those permissions in metadata. This creates a transparency and governance gap: a host may grant broader capabilities than users or reviewers expect, enabling credential handling, persistent local changes, and outbound requests without clear permission scoping.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The declared purpose is a narrow expectation-gap audit, but the instructions expose a much broader operational surface including paid collection, account configuration, exports, monitoring, competitor management, and generic operations workflows. This mismatch increases the chance that the agent performs sensitive, billable, or state-changing actions outside the user's reasonable expectations, which is a classic overreach/scope-confusion risk.

Description-Behavior Mismatch

High
Confidence
95% confidence
Finding
The skill metadata claims a narrow purpose—promise/evidence checking for expectation gaps—but the code exposes broad product-operations workflows, including quote/run/status actions for operational analyses. In an agent setting, this materially expands the action surface beyond the user's likely consent and can trigger unintended paid actions or business-impacting workflows under a misleading skill identity.

Description-Behavior Mismatch

High
Confidence
97% confidence
Finding
The skill includes AI generation of reply/handling advice for negative reviews, which goes beyond evidence-based promise auditing into persuasive or operational response generation. In a constrained skill context, this increases the risk of the agent being used for actions the user did not intend and may produce business communications unsupported by the declared workflow.

Description-Behavior Mismatch

Medium
Confidence
94% confidence
Finding
Monitoring, alerts, workbench status updates, exports, benchmark, leaderboard, and watch functionality substantially exceed a promise-audit-only scope. In an agent environment, such overbroad capabilities create confused-deputy risk: a user invokes a narrowly branded auditing skill but gains indirect access to broader account operations and potentially billable or state-changing actions.

Context-Inappropriate Capability

Medium
Confidence
89% confidence
Finding
Local file export writes review CSVs and reports to arbitrary filesystem paths, which is not justified by the declared promise-verification scope. In an agent context, filesystem write capability broadens the blast radius by enabling uncontrolled local persistence of potentially sensitive business data and increasing the chance of unintended data disclosure or overwrite.

Description-Behavior Mismatch

High
Confidence
97% confidence
Finding
The usage guide exposes a much broader capability set than the skill metadata promises, including review mining, monitoring, exports, operations workflows, and content-generation paths. This kind of scope drift is dangerous because users, policy enforcers, and upstream orchestrators may grant the skill trust and permissions appropriate only for expectation-gap evidence checking, while the actual documented behavior supports materially broader data access and actions.

Context-Inappropriate Capability

High
Confidence
96% confidence
Finding
The guide explicitly says the skill can optimize five-point listing copy based on reviews, which conflicts with the stated limitation that it is not for marketing creation. Allowing a narrowly scoped audit skill to generate persuasive product copy creates a deceptive capability mismatch and can be abused to turn evidence-checking access into marketing/content-generation output without appropriate disclosure or control.

Context-Inappropriate Capability

Medium
Confidence
90% confidence
Finding
Generating AI replies or appeals for negative reviews is outside the stated expectation-gap audit purpose and can influence customer communications or moderation workflows. In context, this expands the skill from passive evidence analysis into active persuasive or dispute-handling actions, increasing the risk of misuse, policy violations, and hidden operational behavior under a misleadingly narrow skill identity.

Context-Inappropriate Capability

Medium
Confidence
92% confidence
Finding
Operations audit and product watch workflows introduce ongoing monitoring and operational intelligence features that exceed the declared promise-evidence verification role. This matters because users and hosting platforms may approve the skill based on a narrow, low-risk description, while the documented workflows support broader surveillance, billing-triggering, and business-analysis behaviors.

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 instructs the agent to run a paid VOC command by default and accept server-side auto-confirmed charges without obtaining per-action consent from the user in the current session. Even if the backend allows this, the skill is delegating spending decisions to automation, which can result in unauthorized charges or actions the user did not clearly approve.

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
95% confidence
Finding
This instruction normalizes performing billable generation first and explaining charges afterward when auto-confirm is returned. Post-hoc notice is not equivalent to informed consent, especially when the skill also handles collection and report generation that may incur credits and persist data remotely.

Autonomous Decision Making

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

**确认与扣点**
- 报价返回 `autoConfirm: true` 时直接生成,不要再问「要不要」。生成后一句话交代:本次扣了多少、
  还剩几次免确认(或「免费版小额不问」)。策略由服务端决定:免费版小额不问;付费版前几次不问,之后先问。
- 用户说「以后别问了 / 50 以内直接做」→ 运行 `autoconfirm 50`;说「以后每次先问我」→ `autoconfirm off`;
  说「恢复默认」→ `autoconfirm default`。这是唯一需要你代用户设置的东西,设完复述一句当前规则。
Confidence
94% confidence
Finding
The skill states that when a quote returns autoConfirm, the agent should directly generate the result and not ask the user. This authorizes autonomous spending behavior based on service policy rather than real-time user intent, increasing the risk of surprise charges and unintended data processing.

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 account-level autoconfirm instruction also weakens the boundary between answering a request and administering billing preferences. Persistent spend thresholds set through conversational shorthand are risky because they can outlast user awareness and broaden what future prompts can trigger automatically.

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 account-level autoconfirm instruction also weakens the boundary between answering a request and administering billing preferences. Persistent spend thresholds set through conversational shorthand are risky because they can outlast user awareness and broaden what future prompts can trigger automatically.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
| `watch delete` | product-operations/watches/{id}(DELETE) | 否;不删除商品资料、评论或历史报告 |
| `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 | 否 |
Confidence
95% confidence
Finding
The reference explicitly states that `analyze` may execute and incur charges when server-side `autoConfirm` rules are met, even without an explicit fresh confirmation in the current interaction. In an agent context, this creates a real autonomous decision-making risk because a model may trigger paid actions based only on prior account settings or server policy rather than clear per-request user consent.

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
97% confidence
Finding
This duplicate finding is still a true issue because the documented `autoconfirm` capability can persistently alter user approval semantics for paid commands. In a conversational agent, persistent confirmation bypasses are more dangerous than one-off actions because they affect later operations beyond the immediate task context.

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
97% confidence
Finding
This duplicate finding is still a true issue because the documented `autoconfirm` capability can persistently alter user approval semantics for paid commands. In a conversational agent, persistent confirmation bypasses are more dangerous than one-off actions because they affect later operations beyond the immediate task context.

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
96% confidence
Finding
This section says `voc` may directly generate results and perform collection, waiting, analysis, and archival when service-side auto-confirm conditions are met. That means the agent could trigger a paid workflow without obtaining contemporaneous user consent, which is a genuine autonomous action and billing risk.

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
93% confidence
Finding
The quote response exposes `autoConfirm` fields that signal whether a paid action may proceed automatically. While metadata alone is not harmful, in this skill context it supports a workflow where the agent can justify skipping explicit approval and directly trigger billable analysis, so it contributes to a real consent-bypass risk.

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
94% confidence
Finding
This duplicate line captures the same risky behavior: automatic paid generation on `autoConfirm` without a fresh consent checkpoint. In the context of an agent acting on behalf of a user, that is sufficient to qualify as a real autonomous decision-making weakness.

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
94% confidence
Finding
This duplicate line captures the same risky behavior: automatic paid generation on `autoConfirm` without a fresh consent checkpoint. In the context of an agent acting on behalf of a user, that is sufficient to qualify as a real autonomous decision-making weakness.

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
94% confidence
Finding
The presence of `autoConfirmNote` and related fields continues the same pattern of enabling automatic execution decisions based on server-side policy. This is dangerous in a skill because it can normalize or automate paid actions that should be gated by explicit user approval each time.

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
94% confidence
Finding
Again, the issue is not the existence of an API response field but the documented permission for automatic paid execution when `autoConfirm` conditions are met. In an AI agent workflow, that is a real vulnerability because it can bypass meaningful user oversight over billable operations.

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
94% confidence
Finding
Again, the issue is not the existence of an API response field but the documented permission for automatic paid execution when `autoConfirm` conditions are met. In an AI agent workflow, that is a real vulnerability because it can bypass meaningful user oversight over billable operations.

Static analysis

No suspicious patterns detected.