Back to skill

Security audit

亚马逊用户痛点挖掘 · 评论需求洞察

Security checks for vulnerabilities and agentic risk

Overview

This skill is review-worthy because it can spend ARI credits and change ongoing account settings from natural-language use, including documented automatic charge paths without a fresh confirmation.

Review the billing behavior before installing. If you use it, set the account to ask before every paid action unless you deliberately want small analyses to run automatically, avoid custom ARI_BASE_URL values unless they are your own trusted HTTPS service, and periodically check ARI schedules/watch settings and saved exports.

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:55
Finding
Bearer API key can be transmitted to an arbitrary or plaintext custom endpoint<![CDATA[ ## Vulnerability Details **File Location**: `scripts/ari.py:55-71` and `scripts/ari.py:300-320` **Vulnerability Type**: Insufficient validation of credential-bearing network destinations **Risk Level**: Medium ### Vulnerable Code ```python def base_url(): """API 基址。ARI_BASE_URL 覆盖必须同时显式设置 ARI_ALLOW_CUSTOM_BASE=1 才生效: 所有请求(含带 Bearer Key 的)都发往这里,若单凭一个环境变量就能改指向, 会话里被注入的一条 shell 命令就足以把 Key 重定向到第三方主机。双变量门槛 让「指向哪」与「我确认这是自己的环境」成为两个独立动作。 """ 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 指向非官方地址:%s,已拒绝发送请求" % override, "若这是你自己的开发/自建环境,请同时设置 ARI_ALLOW_CUSTOM_BASE=1 后重试;" "若你并未主动设置过 ARI_BASE_URL,请勿继续,先清除该环境变量。")) raise SystemExit(2) return override ``` ```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: ``` ### Technical Analysis The custom API endpoint mechanism uses two environment variables as an accidental-redirection safeguard, but it does not validate the URL schem ...[truncated 2442 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Require TLS for all credential-bearing remote endpoints: ```python parsed = urllib.parse.urlparse(override) if parsed.scheme != "https": raise SystemExit("Custom API endpoints must use HTTPS") ``` 2. If plaintext HTTP is required for local development, allow it only for loopback addresses such as `127.0.0.1`, `::1`, or `localhost`, and require a separate development-only flag. 3. Validate that the URL has: - An allowed scheme. - A non-empty hostname. - No embedded username or password. - No unexpected fragments. - A permitted port where appropriate. 4. Do not reuse a production `ari_live_*` credential with custom deployments. Use separate credentials scoped to each deployment. 5. Display the resolved API origin before device authorization or authenticated requests when it differs from the official service. 6. Consider requiring interactive approval of the exact custom origin or maintaining an explicit trusted-host allowlist in a protected local configuration file. 7. Apply the same origin validation consistently to JSON, SSE, public authorization, release, and export requests. ]]>

other

Warning
Location
scripts/ari.py:1105
Finding
Server-controlled auto-confirmation can initiate billable operations without current transaction approval<![CDATA[ ## Vulnerability Details **File Location**: `scripts/ari.py:1105-1114` and `scripts/ari.py:1318-1323` **Vulnerability Type**: Billing consent bypass through server-controlled auto-confirmation **Risk Level**: Medium ### Vulnerable Code ```python quote = request_json("POST", "/api/v1/analysis/quote", q_payload) if not ok(quote): return quote q_data = data_of(quote) or {} # 首次体验免确认(服务端策略 skill.autoConfirm):前几次小额直接生成,不再多问一轮。 auto_confirmed = False if not confirm and q_data.get("autoConfirm") and q_data.get("sufficient"): confirm = True auto_confirmed = True if not confirm: return {"success": True, "data": {"confirmationRequired": True, "quote": q_data, "webUrl": q_data.get("webUrl"), "message": "用户确认后追加 --confirm 才会生成并扣点。"}, "links": links()} ``` ```python # 首次体验免确认:服务端 autoConfirm=true 且「采集 + 报告」合计不超过单次上限时,直接跑完。 # 在聊天里多问一句「确认吗」,很多用户就不回了——先让他拿到结果。 auto_max = int(analysis_quote.get("autoConfirmMaxCredits") or 0) auto_confirmed = (not args.confirm and bool(analysis_quote.get("autoConfirm")) and sufficient and total_credits <= auto_max) if not args.confirm and not auto_confirmed: combined_quote["autoConfirmRemaining"] = analysis_quote.get("autoConfirmRemaining") emit({"success": True, "data": combined_quote, "links": links()}, args.compact) return ``` The Agent-facing instructions reinforce this behavior in `SKILL.md:85-87` and `SKILL.md:138-141` by directing the Agent to execute immediately when the service returns an auto-confirmation policy. ### Technical Analysis A caller can omit `--confirm`, yet the CLI may still convert the request into an authorized, billable operation based exclusively on fields returned by the remote quote endpoint. In `run_analysis()`, a response containing `autoConfirm=true` and `sufficient=true` changes the local `confirm` variable to `True`. In `cmd_voc()`, the response-provided `aut ...[truncated 2150 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Make the absence of `--confirm` strictly quote-only. Never derive current transaction consent solely from a server response. 2. Require an explicit local opt-in before automatic charging. Store the user-selected policy locally and protect it with restrictive permissions. 3. Enforce a client-side maximum independent of server-provided values. The effective limit should be the lower of: - The locally approved limit. - The server account limit. - The current quoted amount. 4. Before executing an automatically approved operation, display the exact charge and require affirmative consent unless the user has previously enabled a clearly scoped local policy. 5. Bind approval to the exact quote using a quote identifier, request identifier, amount, operation type, ASIN, site, and expiration time. Reject execution if any field changes. 6. Provide an explicit command for enabling, viewing, and disabling local auto-confirmation, with safe default behavior set to “always ask.” 7. Update the module documentation and user-facing instructions so they accurately describe whether `--confirm` is mandatory. 8. Add tests proving that: - No billable endpoint is invoked without `--confirm` under the default configuration. - A forged `autoConfirm=true` response cannot override local policy. - Charges above the locally approved limit are rejected. ]]>
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 (37)

Lp3

Medium
Category
MCP Least Privilege
Confidence
95% confidence
Finding
The skill instructs the agent to use shell, network, environment-variable handling, and local file writes, yet no permissions are explicitly declared. That creates a capability/consent gap: a user selecting a narrow 'pain-point mining' skill may unknowingly authorize local configuration changes, API key storage, network calls, and file exports. In this context, the mismatch is more dangerous because the skill also includes setup/configure flows and export/write operations, so these capabilities are not incidental—they are core behaviors that should be transparently declared and gated.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding
The advertised purpose is narrowly framed as extracting pain points from Amazon reviews, but the skill actually covers account management, paid task execution, recurring schedules, monitoring, competitor management, exports, and unrelated operations workflows. This description-behavior mismatch is dangerous because users may invoke the skill expecting read-only analysis while the agent is empowered to trigger billing, persist credentials, modify account settings, and create ongoing monitoring jobs. The broad hidden surface increases the chance of unintended or socially engineered actions.

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
96% confidence
Finding
This workflow tells the agent to run VOC generation by default and accept server-side auto-confirmed paid execution without obtaining an immediate, explicit user confirmation in-session. Even if the backend permits 'small amount' auto-confirm, the skill causes financially consequential actions from ambiguous user intent such as 'analyze reviews,' which violates least surprise and can lead to unauthorized charges. The risk is heightened because the command also triggers collection and report generation, not just a passive quote.

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
94% confidence
Finding
The command described here can automatically collect data, wait for task completion, generate a report, save it to the user center, and bill credits after only a minimal confirmation step. Bundling multiple side effects into one confirmation increases the chance that users do not understand they are authorizing data collection, persistence, and billing together. In a broad-trigger skill, that creates a meaningful risk of overreach and unintended paid execution.

Autonomous Decision Making

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

**确认与扣点**
- 报价返回 `autoConfirm: true` 时直接生成,不要再问「要不要」。生成后一句话交代:本次扣了多少、
  还剩几次免确认(或「免费版小额不问」)。策略由服务端决定:免费版小额不问;付费版前几次不问,之后先问。
- 用户说「以后别问了 / 50 以内直接做」→ 运行 `autoconfirm 50`;说「以后每次先问我」→ `autoconfirm off`;
  说「恢复默认」→ `autoconfirm default`。这是唯一需要你代用户设置的东西,设完复述一句当前规则。
Confidence
96% confidence
Finding
This instruction explicitly tells the agent to proceed with paid generation whenever the backend says `autoConfirm: true`, and not to ask the user first. That is a classic autonomous decision-making pattern for financially impactful actions: the backend policy becomes a substitute for informed user consent. Because the skill is marketed as an analysis tool, the context makes this more dangerous—users may not expect a simple analytical request to incur charges automatically.

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
The same line instructs the agent to execute account-level autoconfirm commands from conversational intent, which creates a persistent authorization change beyond the immediate task. While the user examples are explicit, the skill's broad activation and natural-language handling increase the likelihood of accidental or manipulated preference changes. The context therefore makes this more than a UX issue: it can lower future billing friction and expand downstream risk.

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
The same line instructs the agent to execute account-level autoconfirm commands from conversational intent, which creates a persistent authorization change beyond the immediate task. While the user examples are explicit, the skill's broad activation and natural-language handling increase the likelihood of accidental or manipulated preference changes. The context therefore makes this more than a UX issue: it can lower future billing friction and expand downstream risk.

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
88% confidence
Finding
The skill directs the agent to proactively recommend enabling weekly scheduled collection after reporting, using product/account state from `check` and `schedule`. Although it says to wait for user consent before execution, this is still autonomous steering toward a recurring, potentially billable state change, and the recommendation is driven by internal heuristics rather than a narrowly scoped request. In a skill already capable of schedule modification and billing, such nudging increases the risk of user confusion and unintended enrollment.

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
87% confidence
Finding
Although duplicated in the static findings, this is the same underlying issue: account-level auto-confirm settings can weaken transactional consent for future paid operations. In a tool-using agent, that creates a real risk of unintended charges if the agent optimizes for task completion over explicit approval.

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
87% confidence
Finding
Although duplicated in the static findings, this is the same underlying issue: account-level auto-confirm settings can weaken transactional consent for future paid operations. In a tool-using agent, that creates a real risk of unintended charges if the agent optimizes for task completion over explicit approval.

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
92% confidence
Finding
This section states that VOC generation may proceed automatically when server-side no-confirm rules are met, including collection, waiting, analysis, and archival. In an agent setting, that can cause external side effects and billable usage without an immediate per-action confirmation from the user, which is a meaningful consent and spending 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
90% confidence
Finding
This duplicate finding reflects the same issue: server-side first-use or threshold-based auto-confirm can bypass per-task approval in practice. That is especially relevant here because the skill references a live bearer token and billable analysis workflows.

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 reflects the same issue: server-side first-use or threshold-based auto-confirm can bypass per-task approval in practice. That is especially relevant here because the skill references a live bearer token and billable analysis workflows.

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
91% confidence
Finding
This is another duplicate of the same auto-confirm execution risk. The danger is not code execution on the host, but unauthorized financial/remote-action side effects caused by an agent acting without fresh user consent.

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
91% confidence
Finding
This is another duplicate of the same auto-confirm execution risk. The danger is not code execution on the host, but unauthorized financial/remote-action side effects caused by an agent acting without fresh user consent.

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
91% confidence
Finding
This is another duplicate of the same auto-confirm execution risk. The danger is not code execution on the host, but unauthorized financial/remote-action side effects caused by an agent acting without fresh user consent.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
emit(balance, args.compact)
        return
    # 免确认策略(1.4.5):告诉 agent 当前用户是「小额直接生成」还是「每次先问」
    auto = request_json("GET", "/api/v1/user/autoconfirm")
    emit({"success": True, "data": {
        "skillVersion": VERSION,
        "release": release,
Confidence
91% confidence
Finding
The skill explicitly retrieves and surfaces an autoconfirm policy that enables later paid operations without a per-action confirmation step. In an agent context, this weakens user consent boundaries because downstream commands may convert informational requests into billable actions based on account state rather than an explicit fresh approval.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
"release": release,
        "user": data_of(me),
        "balance": data_of(balance),
        "autoConfirm": data_of(auto) if ok(auto) else None,
    }, "links": links()}, args.compact)
Confidence
91% confidence
Finding
Exposing autoConfirm state is part of a workflow that allows the client to decide whether to proceed with paid actions automatically. In a conversational agent setting, this creates a real risk of unauthorized charges if the agent interprets user intent broadly and the service permits silent confirmation.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
}, "links": links()}, args.compact)


AUTOCONFIRM_MODE_NOTE = {
    "always_ask": "每次付费操作都会先报价、等你确认。",
    "user_limit": "{limit} 积点以内的操作直接生成,超过才问你。",
    "free_small": "免费版 {max} 积点以内的操作直接生成(用的是赠送积点)。",
Confidence
89% confidence
Finding
The built-in autoconfirm modes codify behavior where some paid actions can execute without a fresh prompt. That is dangerous in tool-using AI systems because it transfers spending authority from a human to automation based on stored policy rather than contemporaneous consent.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
}


def cmd_autoconfirm(args):
    """免确认阈值:不带参数=查看;`autoconfirm 50`=50 积点以内不问;`autoconfirm off`=每次都问;`autoconfirm default`=恢复默认。"""
    value = (args.value or "").strip().lower()
    if value:
Confidence
90% confidence
Finding
This command allows modifying the autoconfirm threshold, directly altering whether future paid operations need user confirmation. In an agent setting, permitting automation to change this threshold increases the chance of silent or repeated charges beyond user expectations.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
def cmd_autoconfirm(args):
    """免确认阈值:不带参数=查看;`autoconfirm 50`=50 积点以内不问;`autoconfirm off`=每次都问;`autoconfirm default`=恢复默认。"""
    value = (args.value or "").strip().lower()
    if value:
        if value in ("off", "ask", "0"):
Confidence
88% confidence
Finding
The parsing branch for values like off/ask/0 is part of the mutable autoconfirm-policy surface. The risk is not the parsing itself but that the skill supports programmatic lowering or raising of guardrails around billable operations.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
def cmd_autoconfirm(args):
    """免确认阈值:不带参数=查看;`autoconfirm 50`=50 积点以内不问;`autoconfirm off`=每次都问;`autoconfirm default`=恢复默认。"""
    value = (args.value or "").strip().lower()
    if value:
        if value in ("off", "ask", "0"):
Confidence
88% confidence
Finding
The parsing branch for values like off/ask/0 is part of the mutable autoconfirm-policy surface. The risk is not the parsing itself but that the skill supports programmatic lowering or raising of guardrails around billable operations.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
def cmd_autoconfirm(args):
    """免确认阈值:不带参数=查看;`autoconfirm 50`=50 积点以内不问;`autoconfirm off`=每次都问;`autoconfirm default`=恢复默认。"""
    value = (args.value or "").strip().lower()
    if value:
        if value in ("off", "ask", "0"):
Confidence
88% confidence
Finding
The parsing branch for values like off/ask/0 is part of the mutable autoconfirm-policy surface. The risk is not the parsing itself but that the skill supports programmatic lowering or raising of guardrails around billable operations.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
limit = int(value)
            except ValueError:
                emit(error_obj("ARI_BAD_ARGUMENT", 0, "参数不对",
                               "用法:autoconfirm 50(50 积点以内不问)/ autoconfirm off(每次都问)/ autoconfirm default(恢复默认)"),
                     args.compact)
                return
        out = request_json("PUT", "/api/v1/user/autoconfirm", {"limit": limit})
Confidence
90% confidence
Finding
Issuing a PUT to /user/autoconfirm changes account behavior for future charges, enabling autonomous decision-making over spend. This persists beyond a single action, so the security impact is broader than one accidental request.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
limit = int(value)
            except ValueError:
                emit(error_obj("ARI_BAD_ARGUMENT", 0, "参数不对",
                               "用法:autoconfirm 50(50 积点以内不问)/ autoconfirm off(每次都问)/ autoconfirm default(恢复默认)"),
                     args.compact)
                return
        out = request_json("PUT", "/api/v1/user/autoconfirm", {"limit": limit})
Confidence
90% confidence
Finding
Issuing a PUT to /user/autoconfirm changes account behavior for future charges, enabling autonomous decision-making over spend. This persists beyond a single action, so the security impact is broader than one accidental request.

Static analysis

No suspicious patterns detected.