T01 · Skill Instruction Hijacking
- Location
skill.yaml:14- Finding
Untrusted Remote Responses Are Mandated for Direct Pass-Through
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill is a disclosed remote wrapper for a finance-news service, but it handles API secrets and remote output in ways users should review carefully before installing.
Install only if you trust the Prana service and understand that your messages, thread IDs, request IDs, and API key are sent to the configured endpoint. Avoid using a custom base URL unless you control it and it is HTTPS; prefer environment-provided credentials, set PRANA_SKILL_SKIP_WRITE_API_KEY=1 to avoid writing secrets to disk, and keep config/api_key.txt out of source control. Treat remote responses as untrusted service output rather than local verified news data.
skill.yaml:14Untrusted Remote Responses Are Mandated for Direct Pass-Through
scripts/prana_skill_client.py:415API Credentials and User Messages Can Be Sent to an Arbitrary Base URL
scripts/prana_skill_client.py:228Fetched Secret Keys Are Persisted in Plaintext with Default Filesystem Permissions
package.json:1Dependency Installation Is Not Reproducibly Locked
The skill claims to provide a finance-news crawler/streaming UI, but the documented flow is actually a CLI thin client that forwards prompts to a remote Prana/Claw service, reads local config, handles API keys, and polls job status. That discrepancy can conceal the true trust boundary and cause operators to expose credentials or sensitive prompts to an unexpected third-party execution service.
The skill claims to provide a finance-news crawler/streaming UI, but the documented flow is actually a CLI thin client that forwards prompts to a remote Prana/Claw service, reads local config, handles API keys, and polls job status. That discrepancy can conceal the true trust boundary and cause operators to expose credentials or sensitive prompts to an unexpected third-party execution service.
Referenced artifact was not completely inspected
- **Node.js 18+**:先在包根目录执行 **`npm install`**,再执行 `node scripts/prana_skill_client.js -m "…" [-t thread_id] [-b base_url]`
The file is not a local finance-news crawler/viewer at all; it is a thin wrapper that forwards arbitrary user input and embedded skill identifiers to a remote backend for execution. This creates a strong capability/description mismatch, preventing users and reviewers from understanding what code actually runs and expanding the trust boundary to an external service that may perform unintended actions with supplied credentials and prompts.
The README explicitly documents that API credentials may be automatically fetched and written to config/api_key.txt, but the warning about credential sensitivity appears later and is easy to miss relative to the behavior description. This creates a real risk of accidental secret persistence on disk, exposure via backups or shared workspaces, and later leakage through source control or local compromise.
The skill exposes or implies code capabilities including environment access, file operations, and network access, but declares no explicit tool scope or permission boundaries. In a skill that is presented as a simple financial news feed, this lack of least-privilege disclosure makes it harder for integrators to assess what the client may access and increases the risk of unintended credential, file, or network use.
The documentation presents the skill as a real-time financial news product, but the integration instructions require direct use of generic /api/claw/agent-run and /api/claw/agent-result proxy endpoints. In context, that makes the skill more dangerous because it is not a verifiable news-fetching implementation but a wrapper around remote agent execution, which changes the data exposure and execution-risk profile.
The markdown instructs users to send sensitive credentials in the x-api-key header as public_key:secret_key to an external API but gives no warning about handling, storage, rotation, or exposure risks. In a skill already misaligned with its claimed function, this increases the chance that users disclose reusable secrets to a third-party service without informed consent.
The file documents storing and automatically retrieving Prana Claw API credentials in a skill whose declared purpose is real-time financial news crawling and display. This mismatch is a strong indicator of hidden or unnecessary credential-handling behavior, and auto-fetching/writing secrets to disk expands the attack surface by persisting sensitive tokens where they may be exfiltrated or accidentally committed.
The comments explicitly describe a client that requests API keys and writes them back to disk by default. Automatically materializing credentials into a local file is dangerous because it can leave secrets in plaintext, increase the chance of accidental source control inclusion, and create an opaque secret-handling path unrelated to the advertised news-monitoring use case.
This code path fetches API credentials from a remote endpoint and includes a helper to persist them locally, which is functionality unrelated to a market-news display skill and materially expands the trust boundary. A client that can autonomously acquire and store secrets creates unnecessary credential exposure risk, especially if the endpoint is reachable without prior authentication or if the local filesystem is shared, backed up, or later committed.
Fetched credentials are written to config/api_key.txt automatically, without an interactive warning or opt-in in the normal execution path. Persisting secrets to disk increases the chance of accidental disclosure through source control, backups, permissive file permissions, local compromise, or other users on the same machine.
The client automatically attempts to retrieve API keys from /api/v1/api-keys and then caches them, effectively turning the skill into a secret bootstrapper. For a finance-news skill, this is especially suspicious because the feature is not needed for core functionality and could be abused to obtain reusable credentials for broader platform access.
The client sends the composed content, including the user's message and skill invocation parameters, to the remote /api/claw/agent-run endpoint. While network use is part of a client wrapper's purpose, this code path lacks a visible user-facing notice, log, or prompt indicating that user-provided content will be transmitted to an external service.
The module docstring is written as user-facing skill description text entirely in Chinese and describes how the skill should be used, without indicating any language choice or opt-in. Under the policy, forcing a specific language or locale without user choice is a natural-language policy violation unless clearly justified as region-specific.
The client can automatically fetch API credentials from a remote endpoint and then persist them to config/api_key.txt on disk. For a news-monitoring skill this is unnecessary and risky because it silently expands privilege acquisition, stores secrets locally, and could expose reusable credentials through filesystem access, packaging mistakes, or accidental commits.
This manifest describes a general-purpose real-time financial news crawling and display capability, but provides no specific activation phrases, scope limits, or negative examples indicating when the skill should or should not be invoked. In manifest files, this lack of trigger specificity can lead to unintended invocation from loosely related finance-news requests.
The manifest uses locale-specific policy fields and instructions in Chinese for runtime behavior and post-payment handling, without any indication that users may choose another language or locale. Per the policy, forcing a specific language without opt-in is a natural-language policy concern unless the locale restriction is clearly documented and justified.
The manifest explicitly instructs the system to pass upstream API responses directly to the end user without rewriting or summarization. In a network-enabled skill that proxies external endpoints, this can expose sensitive, unsafe, or attacker-controlled content verbatim, including tokens, internal errors, untrusted markup, or prompt-injection-style instructions returned by upstream services.
The manifest embeds paid-skill order verification against an external commerce API that is not necessary for a real-time financial news crawler/display skill. This expands the trust boundary, introduces credential-handling requirements, and creates a risk of unnecessary outbound data flows or misuse of user/API secrets if the commerce integration is triggered or abused.
L14-L18 引入了一个访问 https://claw-uat.ebonex.io/api/order/skills 的购买记录查询流程,并要求使用 API 凭证鉴权。对于一个以实时财经新闻抓取与展示为目的的技能,这属于额外的账户/订单管理能力,不是其核心功能的直接实现。
The file's user-facing guidance is entirely written in Chinese, which imposes a specific language on users without any opt-in or alternative locale. The policy explicitly calls for flagging language or locale constraints when the skill does not offer a user choice or document a justified regional limitation.
The dependency is specified with a caret range (^2.6.1), which allows installation of newer 2.x releases that are not cryptographically or operationally fixed by this manifest. That weakens build reproducibility and can unexpectedly pull in a vulnerable or breaking release through the supply chain, even though the package itself is not obviously malicious.
"type": "module",
"description": "Prana encapsulated skill — install deps for the Node runner: npm install",
"dependencies": {
"yaml": "^2.6.1"
},
"engines": {
"node": ">=18.0.0"
The manifest references yaml without pinning an exact vetted version, while known advisories exist for some yaml releases, including denial-of-service style crashes from malformed or deeply nested YAML input. Because the installed version cannot be verified from this file alone, there is residual risk that an affected release could be resolved at install time.
Detected: suspicious.env_credential_access, suspicious.exposed_secret_literal