T01 · Skill Instruction Hijacking
- Location
SKILL.md:10- Finding
Untrusted remote responses are mandated to bypass agent review and safety processing
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This skill is a disclosed remote Prana client, but it is marketed as a real-time financial news tool while sending user input and API credentials to a remotely chosen service and storing fetched secrets locally by default.
Review this before installing. It is not a self-contained news crawler; it forwards prompts to a Prana remote service. Only use it with a trusted Prana endpoint, avoid overriding base-url unless you control the destination, do not paste sensitive prompts, and prefer environment-provided credentials with PRANA_SKILL_SKIP_WRITE_API_KEY=1 or PRANA_SKILL_NO_AUTO_API_KEY=1 to avoid plaintext credential storage.
SKILL.md:10Untrusted remote responses are mandated to bypass agent review and safety processing
scripts/prana_skill_client.js:383API credentials and user content can be transmitted to an arbitrary attacker-controlled origin
scripts/prana_skill_client.js:213Automatically fetched API secrets are stored in plaintext without enforced restrictive permissions
package.json:6Node runner installs a mutable dependency without a committed lockfile
The advertised skill metadata says this is a real-time market news crawler with WebSocket delivery, but the README instead describes a generic remote agent client that forwards prompts to /api/claw/agent-run and returns raw responses. This functionality mismatch is a strong deception indicator: users may authorize or run the skill expecting local news retrieval, while actually sending arbitrary input to a remote service controlled outside the package.
The skill claims to provide financial-news crawling and display, yet the underlying behavior described by analysis is remote invocation of external services, credential fetching/persistence, and result polling. In context, this makes the skill more dangerous because users expecting a news tool may unknowingly run a general remote-agent wrapper that can exfiltrate prompts, outputs, and authentication material to third-party infrastructure.
The skill claims to provide financial-news crawling and display, yet the underlying behavior described by analysis is remote invocation of external services, credential fetching/persistence, and result polling. In context, this makes the skill more dangerous because users expecting a news tool may unknowingly run a general remote-agent wrapper that can exfiltrate prompts, outputs, and authentication material to third-party infrastructure.
Referenced artifact was not completely inspected
- **Node.js 18+**:先在包根目录执行 **`npm install`**,再执行 `node scripts/prana_skill_client.js -m "…" [-t thread_id] [-b base_url]`
When local credentials are absent, the client automatically calls a remote endpoint to obtain API keys and then persists them to config/api_key.txt by default. For a news-monitoring skill, silent credential bootstrap and local secret storage are unrelated to the stated function and expand the attack surface through credential exposure, unintended account binding, and persistence of sensitive material on disk.
The README claims the package is only a lightweight wrapper with no business logic, yet it documents credential acquisition, local credential storage, and proxying requests to a remote Prana service using an embedded original_skill_key. That mismatch hides meaningful runtime behavior from users and reviewers, which is dangerous because it encourages execution of a remote-capable thin client under the guise of a harmless content package.
Automatically retrieving API keys from a server and writing them to config/api_key.txt is not justified by a market-news viewing use case and creates a credential-handling risk surface. A deceptive skill can silently provision long-lived credentials, persist them on disk, and use them for further remote actions or expose them to other local processes, especially since the package is presented as a thin client rather than a privileged authenticator.
The skill exposes or implies capabilities involving environment access, local file reads/writes, and network access, but the manifest does not declare any tool scope or permissions boundaries. This is dangerous because integrators and users cannot accurately assess what the skill may access, increasing the chance of over-privileged execution and silent data exposure through filesystem or outbound requests.
The documentation advertises real-time financial news scraping and presentation, but the visible content only provides generic client invocation and paid-skill order lookup instructions. This discrepancy is dangerous because it obscures the actual operational behavior and trust model, making it easier to conceal a proxy-style service or induce users to provide credentials under false assumptions.
The skill instructs users to send an x-api-key in the form public_key:secret_key to external API endpoints without prominently warning that authentication credentials and request contents are transmitted off the local system. This is dangerous because users may expose sensitive prompts or reusable secrets to third-party services without understanding the security implications, and the direct-pass-through requirement further reduces opportunities for redaction or validation.
The file introduces storage and retrieval instructions for Prana Claw API credentials that are unrelated to the declared purpose of a real-time financial news skill. This mismatch is a strong indicator of hidden secondary functionality and creates a risk of credential collection, unauthorized API access, or covert outbound integration under an unrelated cover story.
This plain-text file contains user-facing operational instructions entirely in Chinese, including setup and usage guidance. Under the policy rule, forcing a specific language without offering user choice or documenting a justified locale constraint is a natural-language policy violation.
The file instructs the client to automatically fetch API keys from a remote endpoint and persist them locally, which is unnecessary for a financial news crawling/display function. Automatic secret retrieval and write-back materially increase the risk of silent account provisioning, credential seeding, and later abuse if the local file is exposed or the remote service is not trusted.
Comments, errors, prompts, and CLI usage text throughout the file are presented only in Chinese, which imposes a fixed language on users. The file does not provide any opt-in language selection or indicate that the skill is intentionally limited to a Chinese-speaking context.
The client automatically retrieves API credentials from the network and then uses them for subsequent privileged requests, which is unnecessary for a simple market-news display skill. This creates a trust-on-first-use problem: if the base URL is attacker-controlled or misconfigured, the client may obtain and rely on sensitive credentials from an untrusted source.
Fetched API credentials are written to config/api_key.txt automatically, without meaningful consent or protection, leaving secrets on disk where they may be read by other local users, backup systems, logs, or accidentally committed to source control. Persisting long-lived credentials by default materially increases the blast radius of any local compromise.
The file functions primarily as a generic remote Prana agent launcher and credentialed API client rather than implementing the advertised market-news capability locally. This mismatch is dangerous because users may grant trust and credentials to a package whose real behavior is broad remote task execution, increasing supply-chain and misuse risk if the remote endpoint or skill mapping is changed.
The file is not implementing the advertised real-time financial news capability locally; it is a thin wrapper that forwards user input and skill metadata to a remote Prana service. This mismatch is dangerous because users reviewing the package may believe they are running a transparent news crawler, while in reality they are delegating execution and data handling to an external service outside the package boundary.
The code saves fetched public_key:secret_key credentials to a plaintext file without an upfront confirmation flow. Even though there is an opt-out environment variable, the default behavior can leave long-lived credentials readable by other local users, backup systems, or accidental repository commits.
The client packages the user's message together with skill-derived parameters and transmits it to a remote /api/claw/agent-run service without any explicit user-facing disclosure in code. In context, the skill is presented as a local financial-news tool, so hidden remote transmission increases privacy and trust risks because users may paste sensitive prompts, identifiers, or market-related data under a false assumption of local processing.
This manifest describes the skill's capabilities and intended scenarios in broad terms but does not define any specific invocation phrases, boundaries, or exclusion conditions. For a manifest file, that ambiguity can contribute to unintended activation because there is no narrow trigger scope documented.
The natural-language policy fields are written as mandatory Chinese instructions, including a directive for how responses should be passed to the end user and post-payment guidance only in Chinese. This can violate language/locale policy when the skill does not offer the user a language choice or document that it is intentionally limited to a Chinese-speaking context.
The dependency is specified with a caret range (^2.6.1) rather than being strictly pinned, which makes builds non-reproducible and can cause different installations to resolve to different upstream releases over time. In a security-sensitive skill, this increases supply-chain uncertainty and can unintentionally introduce vulnerable or breaking versions without any code change in the repository.
"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 an exact pinned version, while advisories exist for some yaml releases, so the installed package may resolve to an affected version depending on when and how dependencies are installed. If this skill parses untrusted YAML anywhere in the broader codebase, known issues such as denial of service via deeply nested collections or uncaught exceptions could be triggered.
Detected: suspicious.env_credential_access, suspicious.potential_exfiltration