Back to skill

Security audit

亚马逊产品改进建议 · 评论驱动迭代

Security checks for vulnerabilities and agentic risk

Overview

This appears to be a real ARI Amazon review tool, but it needs Review because it can spend credits automatically, alter account confirmation settings, create ongoing monitoring, and write exports locally.

Install only if you are comfortable giving this skill an ARI account key and allowing it to run paid review-analysis workflows. Before use, set auto-confirm to always ask if you want every charge approved, avoid custom ARI_BASE_URL values unless you control the server, and use default export filenames or a safe directory.

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

Error
Location
scripts/ari.py:57
Finding
ARI Bearer Credential Can Be Redirected to an Arbitrary Network Origin<![CDATA[ ## Vulnerability Details **File Location**: `scripts/ari.py:57-71`, `scripts/ari.py:133-160`, `scripts/ari.py:300-320`, and `scripts/ari.py:337-350` **Vulnerability Type**: Authenticated request redirection and credential disclosure **Risk Level**: High ### Vulnerable Code The API origin can be replaced with an arbitrary environment-provided URL: ```python def base_url(): 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, "If this is an intentional development environment, also set " "ARI_ALLOW_CUSTOM_BASE=1.")) raise SystemExit(2) return override ``` Authenticated requests then attach the locally stored production credential to the selected origin: ```python def request_json(method, path, payload=None, params=None): 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" req = urllib.request.Request( url, data=data, headers=headers, method=method ) with urllib.request.urlopen(req, timeout=TIMEOUT_SEC) as resp: raw = resp.read().decode("utf-8") ``` The same behavior exists in the SSE request path: ```python def request_sse(path, payload, recovery_hint=None): url = base_url() + path headers = { "Authorization": "Bearer " + require_key(), "Accept": "text/event-stream", ...[truncated 2921 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. **Do not reuse production credentials with custom origins.** - If `ARI_BASE_URL` differs from the official origin, require a separate variable such as `ARI_CUSTOM_API_KEY`. - Refuse to fall back to `ARI_API_KEY` or `~/.ari/config.json` in custom-origin mode. 2. **Restrict allowed destinations.** - Parse the URL with `urllib.parse.urlsplit`. - Require the `https` scheme. - Reject embedded usernames or passwords, fragments, unexpected ports, and malformed hostnames. - Use an explicit allowlist of approved development or self-hosted domains. 3. **Prefer build-time endpoint selection.** - Remove runtime custom-origin overrides from distributed production Skills. - Produce a separate development build when custom endpoints are necessary. 4. **Provide visible destination confirmation.** - Before sending credentials to a non-production service, show the normalized destination and require explicit interactive confirmation. - Do not treat an environment variable alone as sufficient authorization. 5. **Separate credential storage by origin.** - Store each credential under a configuration entry keyed by the normalized service origin. - Ensure a credential issued for one origin is never automatically sent to another. 6. **Add security regression tests.** - Verify that production credentials cannot be sent to an arbitrary host. - Verify that HTTP, user-information URLs, unapproved ports, and non-allowlisted domains are rejected. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/ari.py:1452
Finding
Export Output Path Allows Arbitrary Writable File Overwrite<![CDATA[ ## Vulnerability Details **File Location**: `scripts/ari.py:1452-1475`, `scripts/ari.py:1587-1603`, and `scripts/ari.py:1921-1929` **Vulnerability Type**: Unrestricted file write and symlink-following overwrite **Risk Level**: Medium ### Vulnerable Code The download routine writes the response body directly to the caller-controlled destination using truncating mode: ```python def request_download(path, params, dest): 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(), } req = urllib.request.Request(url, headers=headers, method="GET") with urllib.request.urlopen(req, timeout=TIMEOUT_SEC) as resp: ctype = resp.headers.get("Content-Type", "") body = resp.read() with open(dest, "wb") as fh: fh.write(body) ``` The export command passes the unrestricted `--out` value directly to that routine: ```python def cmd_export(args): if args.report_id: fmt = args.format or "md" dest = args.out or ( "ari_report_%d.%s" % (args.report_id, "html" if fmt == "html" else "md") ) emit(request_download( "/api/v1/export/reports/%d" % args.report_id, {"format": fmt}, dest, ), args.compact) return dest = args.out or ("ari_reviews_%s.csv" % args.asin.upper()) emit(request_download( "/api/v1/export/reviews", {"asin": args.asin.upper(), "site": args.site}, dest, ), args.compact) ``` The argument parser imposes no path restrictions: ```python p = sub.add_parser( "export", parents=[common], ...[truncated 2734 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. **Use a dedicated export directory.** - Resolve all default output names beneath a directory such as `~/ARI/exports`. - Reject paths that resolve outside that directory unless a user explicitly authorizes the exact path. 2. **Refuse overwrites by default.** - Open new files with exclusive creation, such as mode `xb`. - Add a separate `--force` option for intentional replacement. - Require explicit confirmation before honoring `--force`. 3. **Defend against symbolic links.** - Reject destinations that are symbolic links. - On supported systems, use `os.open` with `O_CREAT | O_EXCL | O_WRONLY | O_NOFOLLOW`. - Verify that the opened object is a regular file with `os.fstat`. 4. **Normalize and validate paths.** - Resolve the parent directory before opening the destination. - Reject parent traversal and unexpected absolute paths. - Ensure the destination remains within the approved export root. 5. **Use atomic file creation.** - Write to a securely created temporary file inside the destination directory. - Flush and synchronize it, then atomically rename it to the final validated path. - Do not replace an existing file unless overwrite was explicitly authorized. 6. **Constrain generated commands.** - Skill instructions should direct the Agent to use automatically generated filenames unless the user explicitly requests another destination. - Display the normalized destination before performing an overwrite. ]]>
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 (33)

Lp3

Medium
Category
MCP Least Privilege
Confidence
90% confidence
Finding
The skill advertises and documents capabilities that require shell execution, network access, environment-variable handling, and local file writes, but it does not declare permissions. This creates a transparency and containment gap: a user or platform may invoke a seemingly simple review-analysis skill without realizing it can access credentials, run commands, and persist data locally.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding
The declared purpose is narrow product-improvement analysis, but the instructions cover a much broader operational surface: credential management, billing/credits, data collection, monitoring creation/deletion, exports, workflow execution, and account-setting changes. This mismatch is dangerous because it can mislead users and policy systems into granting trust to a skill that can perform materially different and more sensitive actions than its description suggests.

Description-Behavior Mismatch

Medium
Confidence
92% confidence
Finding
The skill claims to provide product-improvement suggestions, but the CLI exposes a much broader control surface: account configuration, billing-related checks, monitoring, exports, workflow execution, and mutation endpoints. This capability sprawl increases the chance that an agent or user invokes sensitive side-effecting operations outside the advertised purpose, violating least privilege and expanding misuse risk.

Context-Inappropriate Capability

Medium
Confidence
88% confidence
Finding
The skill includes local file write/export capability that is not necessary for generating product-improvement advice. In an agent setting, write-capable export increases the risk of unreviewed data exfiltration to disk, sensitive report spillage, or unintended persistence of account data on shared hosts.

Context-Inappropriate Capability

Medium
Confidence
90% confidence
Finding
Persistent watch and monitoring management goes beyond one-shot analysis and allows creation, pause/resume, deletion, and event retrieval for ongoing account-level surveillance. In a product-improvement skill, these side-effecting lifecycle operations materially broaden impact if the tool is misused or called unexpectedly by an agent.

Context-Inappropriate Capability

Medium
Confidence
89% confidence
Finding
Workbench status mutation and single-review AI reply generation are support/operations features, not product-iteration analysis. These endpoints can change account state and trigger paid AI actions, creating a larger and riskier action surface than the skill description suggests.

Description-Behavior Mismatch

Medium
Confidence
88% confidence
Finding
The usage guide exposes capabilities far beyond the declared skill purpose of turning review complaints into product-improvement recommendations, including operations workflows, watch/monitoring, alerts, exports, and category-ranking features. This creates scope expansion and confused-deputy risk: a user or orchestrating agent may invoke broader account-affecting or cost-incurring actions under a narrowly described skill, reducing informed consent and weakening policy boundaries.

Description-Behavior Mismatch

Medium
Confidence
91% confidence
Finding
The guide promotes authorization, paid collection, automatic execution under prior rules, and recurring monitoring workflows rather than only recommendation generation implied by the skill metadata. That mismatch is dangerous because it may lead users or agent frameworks to authorize data collection, billing, or ongoing monitoring they did not expect from a seemingly analysis-only 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
95% confidence
Finding
The skill instructs the agent to run billable VOC generation by default and accept server-side auto-confirmed charges without obtaining per-action consent from the user in the current interaction. This is dangerous because it allows autonomous spending and task execution based on backend policy rather than explicit, contemporaneous user authorization.

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 documented flow authorizes the agent to proceed from quote to execution with `--confirm` after minimal acknowledgement, while also auto-completing collection and waiting steps. In context, this combines paid execution, network actions, and state changes with insufficiently robust confirmation semantics, increasing the risk of unintended charges or collection tasks.

Autonomous Decision Making

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

**确认与扣点**
- 报价返回 `autoConfirm: true` 时直接生成,不要再问「要不要」。生成后一句话交代:本次扣了多少、
  还剩几次免确认(或「免费版小额不问」)。策略由服务端决定:免费版小额不问;付费版前几次不问,之后先问。
- 用户说「以后别问了 / 50 以内直接做」→ 运行 `autoconfirm 50`;说「以后每次先问我」→ `autoconfirm off`;
  说「恢复默认」→ `autoconfirm default`。这是唯一需要你代用户设置的东西,设完复述一句当前规则。
Confidence
95% confidence
Finding
The instruction to 'directly generate' when `autoConfirm: true` normalizes autonomous paid execution and discourages asking the user for consent. In a skill that can spend credits and create reports, this materially increases the chance of unauthorized billing or execution beyond the user's intent.

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 section minimizes confirmation to 'two numbers' and 'wait for a 好', which is too weak for billable actions and account policy changes. A minimal token response can be misinterpreted, especially in multilingual or noisy conversations, causing unintended execution.

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 section minimizes confirmation to 'two numbers' and 'wait for a 好', which is too weak for billable actions and account policy changes. A minimal token response can be misinterpreted, especially in multilingual or noisy conversations, causing unintended execution.

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
88% confidence
Finding
This guidance continues the weak-confirmation pattern into subsequent workflow behavior, relying on concise acknowledgements for actions with financial consequences. In context, the danger is amplified because the skill already has broad operational scope and can chain from analysis into recurring paid features.

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
91% confidence
Finding
This entry exposes a command that modifies the account's confirmation threshold for paid actions. In an autonomous agent context, that creates a real risk that the agent could reduce or disable confirmation safeguards and thereby authorize later chargeable analyses without an immediate, transaction-specific approval step.

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
91% confidence
Finding
This entry exposes a command that modifies the account's confirmation threshold for paid actions. In an autonomous agent context, that creates a real risk that the agent could reduce or disable confirmation safeguards and thereby authorize later chargeable analyses without an immediate, transaction-specific approval step.

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
88% confidence
Finding
This section states that `voc` may directly generate and complete collection/analysis when server-side auto-confirm rules match, without a new per-run confirmation. In an agent workflow, that means a user request phrased as exploratory or informational could trigger a billable operation if the agent does not add its own consent gate.

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
89% confidence
Finding
This passage confirms that an analysis command may execute immediately under auto-confirm, creating a pathway for autonomous paid actions. The danger is amplified in agent usage because natural-language ambiguity can be misread as authorization, especially when the backend permits silent execution.

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
89% confidence
Finding
This passage confirms that an analysis command may execute immediately under auto-confirm, creating a pathway for autonomous paid actions. The danger is amplified in agent usage because natural-language ambiguity can be misread as authorization, especially when the backend permits silent execution.

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
91% confidence
Finding
The skill exposes a command to configure automatic spending/confirmation thresholds for paid operations. In an agent context, allowing the tool itself to relax future confirmation requirements can reduce user oversight and enable subsequent paid actions without fresh 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:
        if value in ("off", "ask", "0"):
Confidence
91% confidence
Finding
This logic parses values that can disable asking or set broader auto-confirm behavior for future paid actions. Because the skill's purpose is analysis rather than account-spending policy management, this creates a dangerous pathway for reducing safeguards inside the same tool.

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
91% confidence
Finding
This logic parses values that can disable asking or set broader auto-confirm behavior for future paid actions. Because the skill's purpose is analysis rather than account-spending policy management, this creates a dangerous pathway for reducing safeguards inside the same tool.

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
91% confidence
Finding
This logic parses values that can disable asking or set broader auto-confirm behavior for future paid actions. Because the skill's purpose is analysis rather than account-spending policy management, this creates a dangerous pathway for reducing safeguards inside the same tool.

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
93% confidence
Finding
The PUT /api/v1/user/autoconfirm call directly mutates the account's confirmation policy, enabling more autonomous paid execution later. In an agent skill, changing consent thresholds is security-sensitive because it weakens financial control boundaries rather than merely performing the advertised analysis task.

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
93% confidence
Finding
The PUT /api/v1/user/autoconfirm call directly mutates the account's confirmation policy, enabling more autonomous paid execution later. In an agent skill, changing consent thresholds is security-sensitive because it weakens financial control boundaries rather than merely performing the advertised analysis task.

Static analysis

No suspicious patterns detected.