Back to skill

Security audit

Amazon 竞品 Listing 差距

Security checks for vulnerabilities and agentic risk

Overview

The skill is not clearly malicious, but it exposes a much broader account-linked, billable ARI operations surface than its narrow listing-gap description suggests.

Install only if you intend to give this skill broad ARI account access, not just one competitor Listing-gap workflow. Before use, review or disable auto-confirm billing behavior, avoid custom ARI_BASE_URL settings unless you control the endpoint, and be aware it can change monitoring/workbench/account settings and create local exports when invoked.

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
SKILL.md:112
Finding
Automatic Retrieval of Unrelated Account-Wide Alerts Violates Least Privilege<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:112-116`; supporting implementation in `scripts/ari.py:1500-1505` **Vulnerability Type**: Excessive authenticated data access **Risk Level**: Medium ### Relevant Code ```python def cmd_alerts(args): if args.mark_read: emit(request_json("POST", "/api/v1/alerts/read"), args.compact) return emit(request_json( "GET", "/api/v1/alerts", params={"limit": args.limit} ), args.compact) ``` The instructions in `SKILL.md:112-116` direct the agent to retrieve alerts at the beginning of a session after running the account check, even when the user only requested a competitor Listing gap analysis. ### Technical Analysis The Skill declares a specialized purpose: comparing a main ASIN with an authorized competitor using product-page fields, images, and review evidence. Account-wide review alerts are not required to perform that comparison. The authenticated alerts endpoint can return information concerning other products and prior account activity. Automatically invoking it places unrelated account data into the agent's context without an explicit user request or task-specific need. Authentication itself is legitimate, and the endpoint does not bypass server authorization. The issue is that the Skill directs the agent to exercise broader account access than is necessary for its declared specialized function, violating least-privilege and data-minimization principles. ### Attack Path 1. A user loads the specialized competitor Listing gap Skill. 2. The user requests analysis of a particular main ASIN and competitor. 3. The agent follows the mandatory session workflow in `SKILL.md`. 4. After the account check, the agent invokes `alerts`. 5. The CLI sends an authenticated `GET /api/v1/alerts` request. 6. Account-wide alerts unrelated to the requested ASIN are returned and placed in the model context. 7. Those alerts may subsequently be summarized, logged, or ...[truncated 628 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Remove the instruction requiring `alerts` to run automatically at session start. 2. Invoke the alerts endpoint only when the user explicitly requests alerts, review monitoring, or account-wide issue triage. 3. Where the API supports it, add an ASIN or product identifier filter and default to the ASIN currently being analyzed. 4. Before retrieving account-wide alerts, tell the user that the request may include alerts for products outside the active task and obtain consent. 5. Keep read-only alert retrieval separate from `--mark-read`, and continue requiring an explicit user request before modifying alert state. 6. Add regression tests verifying that a standard Listing-gap workflow calls only account validation, capability, product profile, quote, and run/status endpoints. ]]>

T05 · Unauthorized Access and Privilege Escalation

Warning
Location
scripts/ari.py:1169
Finding
Runtime Arguments Can Override the Specialized Skill's Fixed Workflow Boundary<![CDATA[ ## Vulnerability Details **File Location**: `scripts/ari.py:1169-1171`; related argument exposure at `scripts/ari.py:1652-1656` **Vulnerability Type**: Specialized capability-boundary bypass **Risk Level**: Medium ### 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() ``` ```python def add_operation_args(parser, confirm=False): parser.add_argument("--asin", required=True) parser.add_argument("--site", default="amz_us", choices=SITES) parser.add_argument("--workflow") parser.add_argument("--focus") parser.add_argument("--competitor") parser.add_argument("--request-id", default="") ``` The immutable defaults declare: ```json { "workflow": "page_compare", "focus": "listing_gap", "outputTemplate": "ops_page_compare" } ``` ### Technical Analysis The specialized Skill states that its operations workflow is fixed to `page_compare/listing_gap` and must not accept an arbitrary workflow or focus. However, `operation_payload()` gives command-line arguments precedence over the values in `skill-defaults.json`. Consequently, a caller can supply another `--workflow` and `--focus` pair. The implementation checks the pair against the workflows enabled by the remote service, but it does not check that the pair matches this Skill package's declared fixed contract. This is not arbitrary remote-code execution and does not permit unrestricted prompt injection. The server must still recognize and authorize the selected workflow. Nevertheless, it allows the specialized Skill to exercise account capabilities outside its advertised Listing-gap boundary and may cause a different paid analysis to run. ### Attack Path 1. The specialized Skill is installed with fixed default ...[truncated 1229 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. In specialized builds, remove the `--workflow` and `--focus` arguments from `operations quote` and `operations run`. 2. Always obtain these values directly from `skill-defaults.json`. 3. If shared parser compatibility requires retaining the arguments, reject any supplied value that differs from the packaged defaults: ```python expected_workflow = defaults.get("workflow") expected_focus = defaults.get("focus") if args.workflow and args.workflow != expected_workflow: return None, error_obj( "ARI_FIXED_WORKFLOW_VIOLATION", 403, "This specialized Skill does not allow workflow overrides." ) if args.focus and args.focus != expected_focus: return None, error_obj( "ARI_FIXED_FOCUS_VIOLATION", 403, "This specialized Skill does not allow focus overrides." ) ``` 4. Include the fixed workflow, focus, output template, channel, and request identifier in the quote response, then verify all of them again before `operations run`. 5. Prefer a signed or server-bound quote token so the run endpoint can verify that the executed operation is identical to the quoted specialized operation. 6. Add tests proving that alternate workflow/focus values fail locally before any quote or run request is sent. ]]>
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 (39)

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
83% confidence
Finding
The export/download path sends the Bearer API key to whatever base_url() resolves to, and custom base overrides are allowed when ARI_ALLOW_CUSTOM_BASE=1 is present. In a hostile or compromised execution environment, an attacker who can influence both environment variables can redirect authenticated requests and capture the API key or returned data.

Lp3

Medium
Category
MCP Least Privilege
Confidence
94% confidence
Finding
The skill invokes shell, network, environment-variable, and file-write capabilities via a local CLI (`python scripts/ari.py`) but does not declare permissions or constrain them in metadata. This creates a trust-boundary problem: users and the host platform may believe the skill is a narrow listing-comparison tool, while it can access local secrets, modify local state, and perform outbound requests with billing implications.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding
The documented behavior far exceeds the declared purpose: beyond competitor listing-gap analysis, the skill can configure authentication, inspect account balances, manage subscriptions and schedules, export data, run multiple paid analyses, and create monitoring workflows. This mismatch is dangerous because it can mislead users and policy layers into granting trust to a much broader and more financially impactful automation surface than advertised.

Description-Behavior Mismatch

High
Confidence
97% confidence
Finding
The file exposes broad product-operations workflows far beyond the declared listing-gap comparison purpose, including capability discovery, profile retrieval, pricing, execution, and run status. This mismatch increases the skill's effective authority and makes it easier for an invoking agent or user to perform unintended paid or sensitive business operations under a narrower-looking manifest.

Description-Behavior Mismatch

High
Confidence
98% confidence
Finding
Watch management, alerts, workbench, and AI advice functionality are unrelated to competitor listing-gap comparison and materially expand monitoring and workflow-control capabilities. Hidden breadth is dangerous in agent settings because downstream systems may grant trust based on the manifest description while the code can do much more.

Description-Behavior Mismatch

Medium
Confidence
90% confidence
Finding
The code can write arbitrary local export files, which is a side effect not disclosed by the skill metadata. In an agent environment, undeclared filesystem write capability increases risk of data spillage, overwriting user files, or creating sensitive artifacts on disk without informed consent.

Context-Inappropriate Capability

High
Confidence
98% confidence
Finding
Updating review-handling statuses and generating AI advice for customer reviews are operational actions outside the stated listing-gap comparison use case. This unjustified authority expansion can alter business workflows and create paid side effects that users and orchestrators would not expect from the skill description.

Context-Inappropriate Capability

Medium
Confidence
86% confidence
Finding
Category leaderboard access is not necessary for listing-gap comparison and broadens the skill into market intelligence beyond its declared purpose. Even if server-side pricing exists, exposing unrelated paid analytics under a narrower manifest creates permission and expectation mismatches.

Description-Behavior Mismatch

High
Confidence
97% confidence
Finding
The documentation presents a broad ARI review-analysis and operations assistant, while the manifest says this skill is only for listing-gap comparison. This scope mismatch can induce the agent to invoke unrelated collection, monitoring, export, reporting, and paid-analysis flows that the user did not intend, violating least privilege and undermining policy boundaries.

Description-Behavior Mismatch

High
Confidence
95% confidence
Finding
The documented watch and operations capabilities exceed the stated 'comparison only' scope and include ongoing monitoring, workflow execution, and other operational actions. In an agent context, such instructions expand the action surface and may trigger persistent or billable operations unrelated to the advertised skill, increasing risk of unauthorized actions and data access.

Description-Behavior Mismatch

Medium
Confidence
92% confidence
Finding
The negative-review workbench, category ranking, export, and report-management instructions are unrelated to the declared listing-gap comparison purpose. This can mislead the agent into handling broader datasets and management actions than expected, creating unnecessary exposure of user data and enabling out-of-scope paid or sensitive operations.

Intent-Code Divergence

High
Confidence
98% confidence
Finding
The file title and opening description identify the skill as a review-analysis assistant, contradicting the manifest's identity as an Amazon competitor listing-gap comparator. Contradictory identity signals are dangerous in prompt-driven systems because they can override the intended tool behavior, causing the agent to select the wrong workflow and perform actions outside approved scope.

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
The workflow authorizes the skill to proceed with paid report generation whenever the backend marks the request `autoConfirmed: true`, without obtaining a fresh user confirmation in-session. Even if server-side rules permit this, it is still autonomous spending behavior from the user's perspective and can trigger unintended charges or data collection.

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 instructions direct the agent to run confirmed paid operations after minimal confirmation logic and to rely on service-side automation for collection and report generation. This increases the chance of the agent taking financially or operationally significant actions with insufficiently specific user consent about collection, waiting, storage, and billing side effects.

Autonomous Decision Making

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

**确认与扣点**
- 报价返回 `autoConfirm: true` 时直接生成,不要再问「要不要」。生成后一句话交代:本次扣了多少、
  还剩几次免确认(或「免费版小额不问」)。策略由服务端决定:免费版小额不问;付费版前几次不问,之后先问。
- 用户说「以后别问了 / 50 以内直接做」→ 运行 `autoconfirm 50`;说「以后每次先问我」→ `autoconfirm off`;
  说「恢复默认」→ `autoconfirm default`。这是唯一需要你代用户设置的东西,设完复述一句当前规则。
Confidence
95% confidence
Finding
The skill explicitly tells the agent to generate outputs and incur charges automatically when `autoConfirm: true`, normalizing autonomous execution over direct user approval. In a billing-connected skill, this weakens informed consent and makes accidental spend more likely, especially because the skill also exposes many nontrivial paid features beyond its headline purpose.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
**确认与扣点**
- 报价返回 `autoConfirm: true` 时直接生成,不要再问「要不要」。生成后一句话交代:本次扣了多少、
  还剩几次免确认(或「免费版小额不问」)。策略由服务端决定:免费版小额不问;付费版前几次不问,之后先问。
- 用户说「以后别问了 / 50 以内直接做」→ 运行 `autoconfirm 50`;说「以后每次先问我」→ `autoconfirm off`;
  说「恢复默认」→ `autoconfirm default`。这是唯一需要你代用户设置的东西,设完复述一句当前规则。
- 报价需要确认时,只说两个数:这次多少积点、余额多少,然后等用户一个「好」。采集是**固定单价**:直接说「15 积点/页 × 3 页 = 45 积点」,不要说成「预计 / 最多」——价格不会浮动;商品评论不够这么多页时只收实际采到的页数,差额自动退回(`pricingNote` 已写好这句)。不要罗列参数。
Confidence
92% confidence
Finding
This same instruction also encourages minimalistic confirmation ('just two numbers' and wait for a brief acknowledgment), which is weak for actions with monetary consequences. Sparse confirmations are easier to elicit accidentally and may not ensure the user understands scope, recurring effects, or downstream collection behavior.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
**确认与扣点**
- 报价返回 `autoConfirm: true` 时直接生成,不要再问「要不要」。生成后一句话交代:本次扣了多少、
  还剩几次免确认(或「免费版小额不问」)。策略由服务端决定:免费版小额不问;付费版前几次不问,之后先问。
- 用户说「以后别问了 / 50 以内直接做」→ 运行 `autoconfirm 50`;说「以后每次先问我」→ `autoconfirm off`;
  说「恢复默认」→ `autoconfirm default`。这是唯一需要你代用户设置的东西,设完复述一句当前规则。
- 报价需要确认时,只说两个数:这次多少积点、余额多少,然后等用户一个「好」。采集是**固定单价**:直接说「15 积点/页 × 3 页 = 45 积点」,不要说成「预计 / 最多」——价格不会浮动;商品评论不够这么多页时只收实际采到的页数,差额自动退回(`pricingNote` 已写好这句)。不要罗列参数。
Confidence
92% confidence
Finding
This same instruction also encourages minimalistic confirmation ('just two numbers' and wait for a brief acknowledgment), which is weak for actions with monetary consequences. Sparse confirmations are easier to elicit accidentally and may not ensure the user understands scope, recurring effects, or downstream collection behavior.

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
89% confidence
Finding
The workflow steers novice users toward simplified, low-friction paid actions after state inspection, reducing meaningful friction for potentially billable automation. In the context of a skill already capable of schedule changes and monitoring setup, this increases the risk of users consenting without understanding persistence and cost implications.

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
86% confidence
Finding
Using `autoConfirm.mode` to classify users and adapt behavior can reduce scrutiny precisely for users least likely to understand billing mechanics. While not inherently malicious, it contributes to a pattern of agent-led decision-making around paid operations and weakens the safety margin in a financially connected workflow.

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
79% confidence
Finding
This section documents that `voc` may 'directly generate' and incur combined collection/analysis charges when server-side auto-confirm rules match, without a fresh explicit confirmation step in the current interaction. In an agent setting, that creates a real risk of autonomous paid actions triggered from ambiguous user requests, especially because the command can also perform data collection before analysis.

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
Same location and behavior: the documentation permits direct execution of billable analysis under `autoConfirm`. That is unsafe in a delegated-agent context because it weakens user-intent verification and can lead to unintended purchases or usage of account credits.

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
Same location and behavior: the documentation permits direct execution of billable analysis under `autoConfirm`. That is unsafe in a delegated-agent context because it weakens user-intent verification and can lead to unintended purchases or usage of account credits.

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
Again, this line documents direct execution under `autoConfirm`, which is materially risky in an agent environment handling account-linked paid actions. The skill context makes it more dangerous than a normal CLI manual because the agent could convert a loosely phrased analysis request into a chargeable operation without contemporaneous approval.

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
Again, this line documents direct execution under `autoConfirm`, which is materially risky in an agent environment handling account-linked paid actions. The skill context makes it more dangerous than a normal CLI manual because the agent could convert a loosely phrased analysis request into a chargeable operation without contemporaneous approval.

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
Again, this line documents direct execution under `autoConfirm`, which is materially risky in an agent environment handling account-linked paid actions. The skill context makes it more dangerous than a normal CLI manual because the agent could convert a loosely phrased analysis request into a chargeable operation without contemporaneous approval.

Static analysis

No suspicious patterns detected.