T01 · Skill Instruction Hijacking
- Location
SKILL.md:76- Finding
Remote Service Is Given Unrestricted Control Over User-Facing Output
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This exchange-rate skill needs review because it acts as a broad remote service client that fetches, stores, and forwards API secrets beyond what a simple rate lookup clearly requires.
Install only after the publisher narrows and clearly documents the remote execution boundary, removes or separates purchase-history access, disables plaintext secret persistence by default, restricts the API base URL to trusted HTTPS origins, and pins dependencies. Treat any stored PRANA_SKILL keys as sensitive credentials.
SKILL.md:76Remote Service Is Given Unrestricted Control Over User-Facing Output
scripts/prana_skill_client.py:491API Credentials Can Be Sent to an Arbitrary User-Selected Host
scripts/prana_skill_client.py:229Fetched Secret Keys Are Persisted in a Plaintext Project File by Default
SKILL.md:12Unauthenticated Credential Provisioning Is Combined with Persistent Global Agent Configuration
SKILL.md:59Setup Instructions Install Unpinned Third-Party Dependencies
This second mismatch finding is substantively the same issue: the skill markets itself as a currency assistant but operationally behaves as a generic client for remote Prana/Claw calls with credential handling and thread management. Such deception or poor disclosure materially increases the chance of unsafe approval and secret exposure.
This second mismatch finding is substantively the same issue: the skill markets itself as a currency assistant but operationally behaves as a generic client for remote Prana/Claw calls with credential handling and thread management. Such deception or poor disclosure materially increases the chance of unsafe approval and secret exposure.
The document describes an exchange-rate assistant, but nearly the entire runbook is about retrieving platform API keys, invoking a generic agent endpoint, and polling results, with no exchange-rate-specific logic. In context, this makes the skill more dangerous because the business purpose provides cover for unrelated privileged operations.
Referenced artifact was not completely inspected
NODE_OPTIONS=--experimental-default-type=module node scripts/prana_skill_client.js -m "…" [-t thread_id] [-n]
Referenced artifact was not completely inspected
**Python 脚本 pip 依赖**(用于解析 `SKILL.md` 的 YAML frontmatter):
The skill includes an unrelated capability to retrieve purchase-history links using combined public and secret keys. This is especially risky because billing/payment-history access is unrelated to exchange-rate queries and could expose sensitive account activity under the guise of a harmless finance helper.
The code automatically retrieves platform API credentials from a remote endpoint and writes them to config/api_key.txt on disk. For a skill that should only perform exchange-rate lookups, acquiring and persisting reusable platform credentials is excessive and expands compromise impact if the filesystem, repo, logs, or package contents are exposed.
This skill advertised as an exchange-rate assistant is actually a generic remote wrapper that forwards user input and locally available credentials to a remote Prana/OpenClaw service. That mismatch is dangerous because it conceals the true trust boundary and enables arbitrary remote behavior under an innocuous financial-assistant label, increasing phishing, data exfiltration, and deceptive execution risk.
The script is not a local exchange-rate tool; it forwards arbitrary user messages to a remote agent-run endpoint using a server-selected skill key. That makes the package a generic remote capability launcher under a misleading finance-themed label, which can bypass user expectations, local review, and scope restrictions. In the skill context, this mismatch is more dangerous because users may trust it as a narrow utility while it can invoke broader remote behavior.
The skill requires access to environment variables, network endpoints, and persistent configuration, but it declares no explicit tool scope or permissions boundary. That makes the trust model opaque and increases the risk of over-privileged execution, especially because the document instructs fetching and storing API keys and restarting the gateway.
The skill tells operators to retrieve and configure secret/public API keys, persist them in the environment, and restart infrastructure without any security warning, consent prompt, or guidance on least-privilege handling. That omission raises the risk of accidental secret exposure, unsafe persistence, and misuse by users who believe they are only enabling exchange-rate lookup.
The document instructs external network calls that obtain and later transmit credentials, but it does not clearly warn users that secrets and request data will be sent to remote services. In this context, the lack of disclosure is more dangerous because the advertised function sounds like a simple informational tool rather than a credentialed remote-execution wrapper.
The instructions explicitly combine public and secret keys into an authentication header for a payment-history endpoint, which is disproportionate to the stated exchange-rate use case. Handling high-value credentials in an unrelated skill expands the blast radius if the skill is misused, logged, or executed in a broader-trust environment.
The top-level doc comment describes this file as a 'Prana encapsulation skill' thin client whose behavior matches another wrapper implementation. That documentation frames the file as generic transport/wrapper infrastructure, which conflicts with the skill manifest’s portrayal of a specialized exchange-rate assistant.
The script's natural-language comments, help text, prompts, and error messages are presented in Chinese only, including usage guidance and operational notices. This imposes a specific language on users without any visible opt-in or alternative locale support, matching the language/locale policy violation criteria.
The skill persists fetched API credentials locally without an explicit opt-in or prominent warning to the user. Silent secret storage creates avoidable exposure through accidental commits, local compromise, or reuse by other processes, especially because the stored material appears to be platform access keys rather than task-specific exchange-rate tokens.
顶部文档将脚本描述为纯通信薄客户端,但实际实现包含读取 SKILL.md frontmatter、解析环境变量与配置文件、自动获取 API key、写入 config/api_key.txt,以及设置进程环境变量等本地状态管理行为。虽然这些不一定是核心业务逻辑,但已超出“仅负责通信”的字面描述。
This code file contains natural-language descriptions and CLI help text that assume Chinese as the only interaction language. The policy explicitly flags language or locale constraints when the skill forces a specific language without user opt-in, and no alternative language option or justification is provided here.
The code can automatically fetch API credentials from a remote service and persist them to config/api_key.txt, then export them into process environment variables. Automatic credential acquisition and local storage materially expand the trust boundary and create credential exposure risk through disk leakage, repo inclusion, overly broad reuse, or downstream tool access. For a simple exchange-rate assistant, this behavior is disproportionate and increases suspicion.
The argparse description, help strings, and runtime error messages are all presented only in Chinese, which imposes a language choice on users. Because no opt-in, locale selection, or documented regional justification appears in the file, this matches the language-policy violation category.
All user-facing instructions and naming are presented only in Chinese, and the document does not offer any user language or locale choice. Per SQP-3, forcing a specific language without opt-in can be a natural-language policy violation unless the locale constraint is explicitly justified.
Detected: suspicious.env_credential_access, suspicious.exposed_secret_literal