Back to skill

Security audit

Macro-Driver-Pro: 宏观晴雨表

Security checks for vulnerabilities and agentic risk

Overview

This skill appears purpose-aligned for macro-financial reports, but its billing flow is under-scoped because it advertises no authentication while requiring a caller-supplied user_id for automatic payment handling.

Review this before installing. The market-data function is coherent, and there is no local code or persistence, but the skill should not be used for billing-sensitive workflows unless the provider documents authentication, signed payment authorization, replay protection, a strict request schema, and privacy handling for user_id.

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
manifest.json:7
Finding
Caller-controlled billing identity is exposed without declared authentication## Vulnerability Details **File Location**: `manifest.json:7-10`; related billing behavior documented in `skill.md:17-21` **Vulnerability Type**: Missing authentication for a billing-related API **Risk Level**: High ### Vulnerable Code `manifest.json:7-10` ```json "auth": { "type": "none" }, "api": { "type": "openapi", ``` `skill.md:17-21` ```markdown # ## 💰 计费与支付协议 # * **单次定价**:0.001 USD # * **支付机制**:本技能深度集成 **SkillPay 协议**。 # * **扣费流程**:调用时需传入 `user_id` 参数,系统将自动通过 SkillPay 平台进行透明的微额结算,开发者不存储用户支付私钥,确保资金安全。 ``` The billing documentation states that the caller supplies a `user_id` and that the system uses it for automatic SkillPay settlement. However, the manifest explicitly declares that the API requires no authentication. The supplied artifacts do not define a signed payment authorization, authenticated principal, ownership check, nonce, timestamp, or replay protection that securely binds the supplied identifier to its owner. ### Technical Analysis A caller-controlled identifier is not an authentication credential. If the backend trusts `user_id` when selecting the account to charge, an unauthenticated caller could submit another user's identifier. Even if SkillPay performs additional undocumented server-side checks, the published interface contract is insecure and does not communicate the controls clients must provide. The backend implementation is not included in the audited package, so successful unauthorized charging cannot be verified statically. The confirmed configuration issue is that a billing-related API is advertised with no authentication while its documented billing flow depends on caller-supplied identity. ### Attack Path 1. An attacker discovers or guesses another user's SkillPay identifier. 2. The attacker sends a POST request to the public `/api/v1/macro-report` endpoint. 3. The attacker places the target identifier in the request body's `user_id` field. 4. The API receives ...[truncated 737 chars]
Remediation
## Remediation Suggestions - Require authenticated access to every billing-related operation. - Bind `user_id` to an authenticated principal instead of trusting a caller-selected identifier. - Require a server-verifiable SkillPay authorization token or signed payment intent covering the user, operation, amount, audience, and expiration time. - Add unique nonces and timestamps, persist consumed nonces, and reject expired or replayed authorizations. - Use opaque, non-enumerable account identifiers and apply rate limits to identity and payment failures. - Return authorization failures without revealing whether a submitted user identifier exists. - Update the manifest and OpenAPI security schemes to accurately describe the required authentication mechanism. - Add integration tests proving that altered identities, missing signatures, expired requests, and replayed requests are rejected before report generation or billing.

T09 · Insecure Skill Coding Practices

Warning
Location
openapi.json:1
Finding
Report endpoint accepts an unrestricted arbitrary JSON payload## Vulnerability Details **File Location**: `openapi.json:1` **Vulnerability Type**: Overly permissive request schema and insufficient input constraints **Risk Level**: Medium ### Vulnerable Code `openapi.json:1` ```json "/api/v1/macro-report":{"post":{"summary":"Generate Report","description":"接收来自 SkillPay 或 OpenClaw 的请求","operationId":"generate_report_api_v1_macro_report_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload Data"}}},"required":true} ``` ### Technical Analysis The request body is defined only as an object with `additionalProperties: true`. It has no declared properties, required fields, formats, maximum lengths, nesting limits, or payload-size constraints. Consequently, every arbitrary JSON object conforms to the published schema. This is especially risky for an AI-agent integration because an agent may serialize unnecessary conversation data, credentials, personal information, internal metadata, or attacker-controlled fields into a request. Those fields are then transmitted to the external service at `macro-driver-pro.vercel.app`. The permissive contract also expands the backend's input-processing attack surface. If undeclared fields are later consumed by server-side logging, billing, templates, queries, or downstream integrations, they can create mass-assignment, injection, denial-of-service, or log-forging risks. The backend source is unavailable, so those secondary exploit classes are not confirmed by this audit. ### Attack Path 1. An attacker influences an agent or direct API client to include excessive or sensitive fields in the report payload. 2. The client validates the request against the published OpenAPI schema. 3. Validation succeeds because all additional properties are permitted and no field constraints exist. 4. The client transmits the complete arbitrary object to the external Vercel endpoint. 5. The service receive ...[truncated 774 chars]
Remediation
## Remediation Suggestions - Replace the unrestricted object with an explicit request schema containing only fields required by the operation. - Set `additionalProperties` to `false`. - Declare all required properties and enforce strict types, formats, enumerations, and minimum and maximum lengths. - Define `user_id` as an opaque identifier and validate it only after binding it to authenticated payment authorization. - Configure strict request-body size, object-depth, property-count, and processing-time limits on both the gateway and application. - Avoid accepting conversation history, prompts, credentials, environment variables, or unrelated agent context. - Minimize and redact request logging, establish a retention policy, and document what information is transmitted and stored. - Reject unknown fields server-side rather than relying exclusively on client-side OpenAPI validation. - Add negative tests for unknown properties, oversized payloads, excessive nesting, malformed identifiers, and sensitive-context leakage.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
Findings (3)

Natural-Language Policy Violations

Medium
Confidence
92% confidence
Finding
The OpenAPI natural-language descriptions include Chinese-only text such as "根路径路由:解决 Vercel 部署后的 404 报错" and "接收来自 SkillPay 或 OpenClaw 的请求". This imposes a specific language on consumers of the spec without any opt-in or explanation that the API is intended only for a Chinese-speaking audience.

Missing User Warnings

Medium
Confidence
91% confidence
Finding
The skill explicitly requires a user_id to be sent during invocation for automated billing, but the description does not clearly warn users that this identifier will be transmitted to third-party infrastructure or explain how it is handled. Even if the identifier is not highly sensitive by itself, undisclosed transmission tied to payment flows can create privacy, tracking, and account-linkage risks.

Natural-Language Policy Violations

Low
Confidence
94% confidence
Finding
SQP-3 applies to all file types and includes language or locale policy violations. The natural-language content throughout the file is exclusively Chinese, and there is no indication that users can opt into another language or that the skill is intentionally limited to a Chinese-speaking or region-specific audience.

Static analysis

No suspicious patterns detected.