Back to skill

Security audit

Amazon 单 ASIN 运营周报

Security checks for vulnerabilities and agentic risk

Overview

This skill appears to be a legitimate ARI Amazon reporting integration, but it exposes broader paid, persistent, and export capabilities than its single-ASIN weekly-report framing clearly scopes.

Install only if you are comfortable giving this skill ARI account access and letting it manage paid analysis, monitoring settings, exports, and local key storage. Before using it, set autoconfirm to ask every time if you want per-run approval, avoid custom ARI_BASE_URL values unless you control the endpoint, and review any export path or schedule/watch change before approving it.

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

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/ari.py:61
Finding
Bearer API Key Can Be Transmitted to an Arbitrary Non-TLS Endpoint<![CDATA[ ## Vulnerability Details **File Location**: `scripts/ari.py:61-71`, `scripts/ari.py:304-320`, `scripts/ari.py:336-350`, `scripts/ari.py:1457-1460` **Vulnerability Type**: Insufficient validation of an authenticated network destination **Risk Level**: Medium ### Vulnerable Code ```python def base_url(): """API base URL. A custom ARI_BASE_URL requires ARI_ALLOW_CUSTOM_BASE=1.""" override = (os.environ.get("ARI_BASE_URL") or "").strip().rstrip("/") if not override or override == PROD_BASE: return PROD_BASE if (os.environ.get("ARI_ALLOW_CUSTOM_BASE") or "").strip() != "1": emit(error_obj( "ARI_CUSTOM_BASE_BLOCKED", 0, "ARI_BASE_URL points to a non-official address: %s; request refused" % override, "For a development or self-hosted environment, also set " "ARI_ALLOW_CUSTOM_BASE=1.")) raise SystemExit(2) return override ``` The authenticated JSON request path subsequently attaches the API key: ```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 destination selection is used for SSE requests and authenticated downloads: ```python headers = { "Authorization": "Bearer " + r ...[truncated 2748 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Parse custom base URLs with `urllib.parse.urlsplit()` and reject malformed values. 2. Require `https` for every non-loopback custom endpoint. 3. If plaintext HTTP is needed for local development, permit it only for explicit loopback addresses such as `127.0.0.1`, `::1`, or `localhost`. 4. Reject URLs containing embedded usernames or passwords. 5. Consider an allowlist for approved self-hosted domains. 6. Do not forward the `Authorization` header across redirects to a different origin. Prefer disabling redirects for authenticated calls or validating every redirect target. 7. Replace or supplement the environment-only opt-in with an explicit CLI trust operation that records the approved origin and displays a clear warning. 8. Compare the normalized origin before attaching credentials, and fail closed if the origin differs from the trusted destination. 9. Add tests covering HTTP destinations, malformed URLs, cross-origin redirects, embedded credentials, and environment-variable injection. ]]>

T09 · Insecure Skill Coding Practices

Note
Location
scripts/ari.py:1474
Finding
Export Function Can Overwrite Arbitrary User-Writable Files<![CDATA[ ## Vulnerability Details **File Location**: `scripts/ari.py:1443-1479`, `scripts/ari.py:1607-1621` **Vulnerability Type**: Unrestricted file overwrite and symlink following **Risk Level**: Low ### Vulnerable Code The download helper writes the entire response to the supplied destination using truncating mode: ```python def request_download(path, params, dest): """Download a non-JSON response to a local file.""" query = {"method": "GET", "path": path, "params": {k: v for k, v in (params or {}).items() if v not in (None, "")}, "payload": None} url = base_url() + path if query["params"]: url += "?" + urllib.parse.urlencode(query["params"], doseq=True) 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() if "application/json" in ctype: out = json.loads(body.decode("utf-8", errors="replace")) if isinstance(out, dict): out["_query"] = query return out tail = body[-300:].decode("utf-8", errors="replace") if "# export error:" in tail: return error_obj("ARI_EXPORT_ERROR", 200, tail.split("# export error:", 1)[1].strip(), "Export failed before completion; no file was written.", query) with open(dest, "wb") as fh: fh.write(body) return {"success": True, "data": {"savedTo": os.path.abspath(dest), "bytes": len(body), "contentType": ctype.split(";")[0].strip()}, "_query": query, "links": links()} ``` The destinatio ...[truncated 2915 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Create export files exclusively by default, for example with `os.open()` using `O_CREAT | O_EXCL | O_WRONLY`. 2. Refuse to overwrite an existing destination unless the user explicitly provides a `--force` option. 3. Before writing, reject symbolic links using `lstat()` and platform-appropriate no-follow controls such as `O_NOFOLLOW`. 4. Constrain Agent-initiated exports to a dedicated export directory unless the user explicitly approves another location. 5. Normalize the destination with `realpath()` and verify that it remains within the approved directory. 6. Write to a securely created temporary file in the destination directory, flush and synchronize it, and then atomically rename it. 7. Validate that the parent directory exists and is not unexpectedly writable by other users. 8. Display the resolved destination and require confirmation when an existing file would be replaced. 9. Add tests for existing files, symlinks, traversal paths, concurrent destination creation, and failed downloads. ]]>
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 (36)

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
81% confidence
Finding
The export path allows writing downloaded report or review data to an arbitrary filesystem path supplied by --out. In an agent or automation context, this can overwrite sensitive local files or persist potentially sensitive business data outside the expected skill storage boundary, which exceeds the stated weekly-brief purpose.

Lp3

Medium
Category
MCP Least Privilege
Confidence
91% confidence
Finding
The skill instructs use of shell, network, environment variables, and file-writing behavior (`scripts/ari.py`, API key setup/configuration, local key storage, exports) but does not declare permissions. This creates a transparency and policy-enforcement gap: a host may allow execution without users understanding that credentials can be stored locally and files can be written or exported.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding
The declared purpose is a narrow weekly single-ASIN brief, but the skill text authorizes a much broader operational surface: account authorization, preference changes, report export, recurring schedules, competitor/watch management, and multiple paid analysis workflows. That mismatch can mislead users and reviewers about what the skill may do, increasing the chance of unauthorized state changes, billing actions, or data export under the guise of a simple reporting skill.

Description-Behavior Mismatch

Medium
Confidence
95% confidence
Finding
The skill metadata describes a weekly brief for a single subscribed ASIN, but the CLI exposes broad account management, monitoring, competitor tracking, workbench actions, exports, and paid operations. This scope expansion increases the blast radius if the skill is invoked by an agent that assumes a narrowly scoped reporting tool.

Context-Inappropriate Capability

Medium
Confidence
96% confidence
Finding
The export feature can persist review CSVs and report HTML/Markdown to arbitrary local files, which is not necessary for generating a weekly single-ASIN brief. In an agent setting, this creates an unnecessary data exfiltration and persistence channel for potentially sensitive account data.

Description-Behavior Mismatch

High
Confidence
96% confidence
Finding
The documentation for a narrowly scoped 'single-ASIN weekly operator' instead teaches use of a broad ARI toolkit covering collection, analysis, monitoring, exports, billing-affecting operations, and other workflows. This scope mismatch is dangerous because an agent may infer it is authorized to invoke unrelated capabilities, causing overreach, unintended paid actions, or access to data/functions outside the user’s requested weekly brief.

Context-Inappropriate Capability

Medium
Confidence
91% confidence
Finding
The watch-management and free digest sections introduce persistent monitoring and summary retrieval capabilities that are broader than a confirmed paid weekly brief. In agent settings, exposing these paths can lead the model to substitute free watch/digest flows for the intended gated workflow or to create/modify monitoring state without the user clearly requesting it.

Context-Inappropriate Capability

Medium
Confidence
93% confidence
Finding
The file documents many unrelated capabilities—alerts, workbench advice, benchmark, leaderboard, exports, and report browsing—that exceed the declared weekly-operator purpose. This increases the attack surface for prompt-driven tool misuse, enabling an agent to browse, export, or trigger ancillary functions that may expose extra data or incur charges beyond the intended weekly report use case.

Intent-Code Divergence

Medium
Confidence
88% confidence
Finding
The documentation says the installed skill is a specialized scenario-focused skill, yet immediately frames it as a gateway to a general-purpose ARI CLI with many unrelated workflows. This contradiction is risky because agents often rely on local instructions to determine authorization boundaries; inconsistent claims can cause unsafe assumptions that broader actions are permissible under the specialized skill.

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 permits a paid operation to be triggered and completed based on server-side `autoConfirmed: true`, with instructions not to ask the user again before generation. Even if the backend supports auto-confirm, the agent is still being directed to perform chargeable actions without fresh, action-specific consent in the current conversation, which can cause unauthorized spending.

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 skill instructs the agent to run `voc ... --confirm` after a minimal acknowledgment, while the command may also trigger collection, waiting, report generation, and archival in one step. Bundling several consequential actions into a single confirmation raises the risk of the user not understanding scope, cost, and side effects.

Autonomous Decision Making

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

**确认与扣点**
- 报价返回 `autoConfirm: true` 时直接生成,不要再问「要不要」。生成后一句话交代:本次扣了多少、
  还剩几次免确认(或「免费版小额不问」)。策略由服务端决定:免费版小额不问;付费版前几次不问,之后先问。
- 用户说「以后别问了 / 50 以内直接做」→ 运行 `autoconfirm 50`;说「以后每次先问我」→ `autoconfirm off`;
  说「恢复默认」→ `autoconfirm default`。这是唯一需要你代用户设置的东西,设完复述一句当前规则。
Confidence
94% confidence
Finding
The instruction to directly generate paid output whenever quote returns `autoConfirm: true` normalizes autonomous billing behavior. In context, this skill is marketed as a user-confirmed weekly report, so silently switching to backend-determined auto-confirm makes the consent model less safe, not more safe.

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
Allowing the agent to change persistent `autoconfirm` settings on the user's behalf can materially alter future billing behavior beyond the current request. Although the text says this is only done when the user asks, it still represents a sensitive account preference change that can enable future autonomous charges if interpreted loosely.

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
Allowing the agent to change persistent `autoconfirm` settings on the user's behalf can materially alter future billing behavior beyond the current request. Although the text says this is only done when the user asks, it still represents a sensitive account preference change that can enable future autonomous charges if interpreted loosely.

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
84% confidence
Finding
The guidance to accept a minimal user reply ('一个好') after presenting only cost and balance encourages low-friction consent for chargeable actions. This can produce ambiguous authorization records and weak assurance that the user understood what exact operation, scope, and side effects they approved.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
说「恢复默认」→ `autoconfirm default`。这是唯一需要你代用户设置的东西,设完复述一句当前规则。
- 报价需要确认时,只说两个数:这次多少积点、余额多少,然后等用户一个「好」。采集是**固定单价**:直接说「15 积点/页 × 3 页 = 45 积点」,不要说成「预计 / 最多」——价格不会浮动;商品评论不够这么多页时只收实际采到的页数,差额自动退回(`pricingNote` 已写好这句)。不要罗列参数。

**新手(`check` 返回 `autoConfirm.mode` 为 `first_runs` / `free_small`,或问"然后呢")**
- 报告讲完只推一个下一步,附接口返回的成本,不写死月费用。用户同意再 `schedule --set weekly`。
- 不解释命令名,不列功能清单。用户问「还能做什么」时按他的产品状态给一条建议,不超过三句。
Confidence
80% confidence
Finding
Conditioning workflow behavior on `autoConfirm.mode` to streamline follow-up actions for 'new users' can increase the chance that inexperienced users are nudged into state-changing or paid operations with insufficient explanation. In this context, simplifying UX is useful, but using billing-mode heuristics to suppress detail weakens informed 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
88% confidence
Finding
The same `autoconfirm` functionality represents persistent autonomous decision-making risk because it modifies account behavior for future paid requests rather than only executing the current user-approved task. If misused by an agent, it can create an ongoing condition where later analysis runs are auto-approved and charge credits without fresh confirmation.

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
88% confidence
Finding
The same `autoconfirm` functionality represents persistent autonomous decision-making risk because it modifies account behavior for future paid requests rather than only executing the current user-approved task. If misused by an agent, it can create an ongoing condition where later analysis runs are auto-approved and charge credits without fresh confirmation.

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
91% confidence
Finding
This section states that VOC generation may proceed automatically when server-side auto-confirm rules match, which allows a paid operation to execute without task-time user confirmation. In an agent skill handling API keys and billable actions, this creates a real risk of unintended charges or collection/analysis activity if the agent treats quote results as implicit approval.

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
90% confidence
Finding
Documenting `autoConfirm` in quote responses indicates that the platform may authorize and execute analysis based on prior server-side policy instead of immediate user approval. Within a skill, that increases the chance that an agent initiates a paid run after only checking a quote, leading to unauthorized spend or actions contrary to the user's present intent.

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
90% confidence
Finding
This duplicate finding points to the same auto-confirm execution path, where analysis can proceed and consume credits without a fresh confirmation interaction. The risk is amplified in agent workflows because natural-language requests for a weekly brief can be misinterpreted as permission to run billable operations automatically.

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
90% confidence
Finding
This duplicate finding points to the same auto-confirm execution path, where analysis can proceed and consume credits without a fresh confirmation interaction. The risk is amplified in agent workflows because natural-language requests for a weekly brief can be misinterpreted as permission to run billable operations automatically.

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
89% confidence
Finding
The inclusion of `autoConfirmNote` and related eligibility metadata reinforces that the service supports no-prompt execution of paid analysis under some conditions. That is a genuine safety concern for an agent integration because such metadata can encourage skipping explicit consent, resulting in unauthorized charges or unintended data processing.

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
89% confidence
Finding
Again, the documented auto-confirm path enables autonomous execution of chargeable operations. Even though this appears to be product documentation rather than exploit code, it describes a capability that becomes a true vulnerability when exposed through an agent that may act on behalf of the user without robust consent controls.

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
89% confidence
Finding
Again, the documented auto-confirm path enables autonomous execution of chargeable operations. Even though this appears to be product documentation rather than exploit code, it describes a capability that becomes a true vulnerability when exposed through an agent that may act on behalf of the user without robust consent controls.

Static analysis

No suspicious patterns detected.