Back to skill

Security audit

Amazon 已有 ASIN 上线准备度检查

Security checks for vulnerabilities and agentic risk

Overview

This skill connects to the expected ARI service, but it exposes broader paid, persistent, and account-changing capabilities than its launch-readiness description suggests.

Review this carefully before installing. It is not just a read-only launch-readiness checker: with an ARI API key it can spend ARI credits, export account data, and change ongoing monitoring or confirmation settings. Install only if you want the broader ARI operations assistant, and use explicit instructions such as 'only quote, do not execute' when you do not want charges or account changes.

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 (2)

T05 · Unauthorized Access and Privilege Escalation

Warning
Location
scripts/ari.py:1206
Finding
Specialized Workflow Restrictions Can Be Overridden Through CLI Arguments<![CDATA[ ## Vulnerability Details **File Location**: `scripts/ari.py:1206-1223` **Vulnerability Type**: Specialized workflow restriction bypass **Risk Level**: Medium ### Code Snippet ```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 packaged defaults declare a fixed specialized contract: ```json { "workflow": "audit", "focus": "launch", "outputTemplate": "ops_audit" } ``` ### Technical Analysis The Skill documentation states that this specialized distribution must use the fixed `audit/launch` workflow and must not accept an arbitrary workflow or focus. However, `operation_payload()` gives caller-controlled `args.workflow` and `args.focus` precedence over the packaged defaults. The later `operation_contract()` validation only verifies that the selected combination is supported by the remote account. It does not verify that the combination is the one authorized for this specialized Skill. Consequently, any alternative workflow exposed by the server to the account can be selected through the CLI. This breaks the package-level least-privilege boundary: the specialized Skill advertises a narrow launch-readiness operation but exposes the broader remote operations interface. ### ...[truncated 1433 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. In specialized builds, load `workflow` and `focus` exclusively from `skill-defaults.json`. 2. Reject explicit CLI values that differ from the packaged contract: ```python def operation_payload(args): defaults = operation_defaults() fixed_workflow = str(defaults.get("workflow") or "").strip() fixed_focus = str(defaults.get("focus") or "").strip() supplied_workflow = str(getattr(args, "workflow", None) or "").strip() supplied_focus = str(getattr(args, "focus", None) or "").strip() if supplied_workflow and supplied_workflow != fixed_workflow: return None, error_obj( "ARI_SPECIALIZED_WORKFLOW_LOCKED", 403, "This specialized Skill does not permit workflow overrides." ) if supplied_focus and supplied_focus != fixed_focus: return None, error_obj( "ARI_SPECIALIZED_FOCUS_LOCKED", 403, "This specialized Skill does not permit focus overrides." ) workflow = fixed_workflow focus = fixed_focus ``` 3. Prefer omitting `--workflow` and `--focus` from the specialized build’s argument parser entirely. 4. Add tests proving that alternate server-supported combinations are rejected locally. 5. Enforce the package channel and fixed workflow contract on the server as defense in depth. 6. Bind the quoted `requestId` to the exact workflow, focus, ASIN, site, price, and package channel, and reject modified execution requests. ]]>

T05 · Unauthorized Access and Privilege Escalation

Note
Location
scripts/ari.py:838
Finding
Specialized Package Exposes Persistent Account Mutations Beyond Its Minimum Required Scope<![CDATA[ ## Vulnerability Details **File Location**: `scripts/ari.py:838-881` **Vulnerability Type**: Excessive remote account-management capability **Risk Level**: Low ### Code Snippet ```python def cmd_schedule(args): """查看/设置产品的定期采集(免费操作,采集本身按页扣点)。 这是 ARI 从「一次性查询」变成「持续积累」的那个开关:开着它,新评论每天/每周 自动进库,趋势、差评归因、报告环比才有意义。不带 --set 时只列出当前计划。 """ if not args.set: out = request_json("GET", "/api/v1/asins") d = data_of(out) or {} rows = d.get("asins") if isinstance(d, dict) else None if ok(out) and isinstance(rows, list): monitored = [a for a in rows if a.get("schedule") != "manual" and not a.get("schedulePaused")] d["_monitorSummary"] = { "total": len(rows), "monitored": len(monitored), "manual": len([a for a in rows if a.get("schedule") == "manual"]), "paused": len([a for a in rows if a.get("schedulePaused")]), "note": "schedule=manual 表示只在手动触发时才更新,数据会停在最后一次采集那天。", } emit(out, args.compact) return asin_id = args.id if asin_id is None: if not args.asin: emit(error_obj("ARI_VALIDATION_ERROR", 0, "需要 --asin 或 --id", "先跑 schedule(不带参数)或 products 拿到产品 id。"), args.compact) return listing = request_json("GET", "/api/v1/asins") if not ok(listing): emit(listing, args.compact) return want_asin, want_site = args.asin.upper(), args.site for a in (data_of(listing) or {}).get("asins") or []: if a.get("asin") == want_asin and (not want_site or a.get("site") == want_site): asin_id = a.get("id") break if asin_id is None: emit(error_obj("ARI_NOT_FOUND", 404, "未订阅该 ASIN", "先用 collect 采集一次,产品会自动加入订阅列表。"), args.compact) return out = request_json("PUT", "/api/v1/asins/%d/schedule ...[truncated 3371 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Produce a reduced specialized CLI containing only the commands required for: - Capability checks. - Product profile retrieval. - Launch-readiness quotation. - Confirmed launch-readiness execution. - Exact status recovery after interruption. 2. Remove account-wide mutations such as `autoconfirm`, `schedule`, `competitors`, `watch`, and workbench updates from specialized distributions. 3. If these capabilities must remain, enforce explicit local confirmation flags for every persistent mutation rather than relying only on Agent instructions. 4. Require the user to confirm the exact target and resulting recurring cost immediately before enabling `daily` or `weekly` collection. 5. Add a specialized-build command allowlist before dispatch: ```python SPECIALIZED_ALLOWED = { ("operations", "capabilities"), ("operations", "profile"), ("operations", "quote"), ("operations", "run"), ("operations", "status"), } if is_specialized_build() and command_tuple(args) not in SPECIALIZED_ALLOWED: raise SystemExit("Command unavailable in this specialized Skill.") ``` 6. Use separately scoped API credentials where supported. A launch-readiness Skill key should not be able to modify billing confirmation policy, watches, schedules, or unrelated workflow state. 7. Require server-side idempotency and auditable confirmation records for recurring-cost changes. 8. Return a clear summary of the previous value, new value, affected ASIN, frequency, and estimated recurring cost after every successful mutation. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • 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
Findings (80)

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding
The manifest presents this as a narrow relaunch-readiness skill, but the body defines much broader capabilities: paid collection, ongoing monitoring, competitor management, keyword/ad-related analysis, exports, and generic operations workflows. This mismatch weakens user consent and policy enforcement because a caller may authorize a limited diagnostic skill while actually enabling a broader operational agent with paid and state-changing behaviors.

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

Context-Inappropriate Capability

High
Confidence
95% confidence
Finding
The code can modify remote account state through scheduling changes, competitor management, watch creation/pause/resume/delete, alert read-state changes, and workbench status updates, which goes beyond a read-only readiness assessment. In a skill meant for risk checking, these mutation paths enable unauthorized operational changes and persistent monitoring setup that a user may not have intended to delegate.

Description-Behavior Mismatch

High
Confidence
95% confidence
Finding
The skill metadata says it is for relaunch readiness checks on existing ASINs, but this file exposes broad product-operations workflows that can trigger paid AI runs and operational analyses beyond that scope. In an agent setting, this scope expansion materially increases the chance of unintended high-impact actions, billable operations, and processing of data the user did not request.

Description-Behavior Mismatch

High
Confidence
96% confidence
Finding
The CLI includes unrelated capabilities such as leaderboard queries, benchmark, alerts, workbench status changes, AI advice generation, exports, and report management that exceed the stated purpose of readiness/risk checking. In a delegated agent environment, such hidden breadth increases the risk of unauthorized paid actions, local data exfiltration via export, and remote account state changes outside user expectations.

Description-Behavior Mismatch

High
Confidence
97% confidence
Finding
The usage guide exposes substantial capabilities far beyond the declared relaunch-readiness scope, including operations workflows, watch management, workbench, alerts, competitor tracking, benchmarking, and paid report execution. This scope mismatch is dangerous because an agent or user may invoke sensitive or billable product-operation actions under the trust boundary of a narrowly described skill, increasing the risk of unintended charges, data access, and policy bypass through misleading documentation.

Natural-Language Policy Violations

Medium
Confidence
94% confidence
Finding
The README presents all user-facing instructions, invocation phrases, and workflow guidance exclusively in Chinese, including the exact phrases users are told to send to the AI client. Under the stated policy, forcing a specific language without offering a user choice or documenting a justified locale constraint is a natural-language policy violation.

Lp3

Medium
Category
MCP Least Privilege
Confidence
91% confidence
Finding
The skill documents use of shell execution, network access, local file writes, and environment-based secrets, but the manifest does not declare any explicit tool scope or permissions boundaries. This creates an over-privileged execution surface where an agent could invoke sensitive capabilities without clear least-privilege constraints or user/auditor visibility.

Vague Triggers

Medium
Confidence
85% confidence
Finding
The natural-language trigger is intentionally broad and instructs the agent to infer parameters and proceed with internal workflows, while the skill also exposes paid, monitoring, and operational side effects. Broad invocation criteria increase the chance that ordinary user queries are routed into a capability set with hidden costs or account-changing actions without sufficiently crisp boundaries.

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
94% confidence
Finding
This workflow allows the agent to initiate a paid VOC operation by default and accept server-side auto-confirmed charges without obtaining contemporaneous user approval for that specific run. Because the action can immediately consume credits and generate billable results, the agent is effectively empowered to make spending decisions autonomously.

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
93% confidence
Finding
The documented behavior normalizes a pattern where the agent runs billable generation first and only asks for confirmation if the server demands it. This makes user consent dependent on backend pricing logic rather than the agent's own safety boundary, creating a real risk of unauthorized credit consumption.

Description-Behavior Mismatch

Medium
Confidence
95% confidence
Finding
The top-level description says the skill does not handle advertising-budget-related tasks, yet this section instructs the agent to generate ad/search-term keyword recommendations. Even if it does not set budgets directly, it materially expands into advertising optimization, creating a deceptive scope boundary and increasing risk of misuse beyond what the user expected.

Autonomous Decision Making

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

**确认与扣点**
- 报价返回 `autoConfirm: true` 时直接生成,不要再问「要不要」。生成后一句话交代:本次扣了多少、
  还剩几次免确认(或「免费版小额不问」)。策略由服务端决定:免费版小额不问;付费版前几次不问,之后先问。
- 用户说「以后别问了 / 50 以内直接做」→ 运行 `autoconfirm 50`;说「以后每次先问我」→ `autoconfirm off`;
  说「恢复默认」→ `autoconfirm default`。这是唯一需要你代用户设置的东西,设完复述一句当前规则。
Confidence
95% confidence
Finding
The section explicitly instructs the agent to proceed automatically when the quote indicates autoConfirm and only disclose the charge afterward. Post-hoc disclosure is not valid consent for an operation that can spend user credits and create persistent artifacts, so this is a clear autonomy-over-spending flaw.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
**确认与扣点**
- 报价返回 `autoConfirm: true` 时直接生成,不要再问「要不要」。生成后一句话交代:本次扣了多少、
  还剩几次免确认(或「免费版小额不问」)。策略由服务端决定:免费版小额不问;付费版前几次不问,之后先问。
- 用户说「以后别问了 / 50 以内直接做」→ 运行 `autoconfirm 50`;说「以后每次先问我」→ `autoconfirm off`;
  说「恢复默认」→ `autoconfirm default`。这是唯一需要你代用户设置的东西,设完复述一句当前规则。
- 报价需要确认时,只说两个数:这次多少积点、余额多少,然后等用户一个「好」。采集是**固定单价**:直接说「15 积点/页 × 3 页 = 45 积点」,不要说成「预计 / 最多」——价格不会浮动;商品评论不够这么多页时只收实际采到的页数,差额自动退回(`pricingNote` 已写好这句)。不要罗列参数。
Confidence
90% confidence
Finding
This instruction lets the agent change the user's future spending-confirmation policy via autoconfirm settings based on conversational phrases. Altering account-level authorization behavior is a sensitive preference change that can enable broader unattended spending if misinterpreted or socially engineered.

Static analysis

No suspicious patterns detected.