T09 · Insecure Skill Coding Practices
- Location
scripts/prana_skill_client.py:461- Finding
API credentials and user content can be transmitted to an arbitrary endpoint
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This is a remote stock-analysis wrapper, but it stores API keys locally and can send those credentials and your prompt to a configurable server.
Review before installing. Use only the intended Prana/Claw endpoint, avoid passing a custom base URL, prefer environment variables or a secret manager over config/api_key.txt, set PRANA_SKILL_SKIP_WRITE_API_KEY=1 if using auto-fetch, and make sure config/api_key.txt is never committed or shared.
scripts/prana_skill_client.py:461API credentials and user content can be transmitted to an arbitrary endpoint
scripts/prana_skill_client.py:262Fetched secret keys are persisted in plaintext with uncontrolled file permissions
package.json:6Node installation resolves a non-locked third-party dependency
Undisclosed calls to agent-run/result endpoints, automatic retrieval of public/secret keys, and writing API credentials to config/api_key.txt materially expand the risk surface beyond a normal stock-analysis skill. In this context, the deception is especially concerning because a finance-themed skill does not reasonably imply infrastructure-client behavior or local credential persistence.
Undisclosed calls to agent-run/result endpoints, automatic retrieval of public/secret keys, and writing API credentials to config/api_key.txt materially expand the risk surface beyond a normal stock-analysis skill. In this context, the deception is especially concerning because a finance-themed skill does not reasonably imply infrastructure-client behavior or local credential persistence.
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 README explicitly documents that the client will automatically fetch API credentials and write them to config/api_key.txt by default. Storing long-lived secrets in a predictable plaintext file increases the chance of accidental disclosure through local compromise, backups, logs, packaging, or repository inclusion, especially because this package is intended for broad third-party use.
The README instructs users to paste either full API key JSON or public_key:secret_key directly into a plaintext file. That normalizes insecure secret handling and makes credential leakage more likely via source control, shared directories, shell history, endpoint malware, or support bundle collection.
The skill advertises executable client scripts and credential-based API access, but the manifest shown does not declare any tool scope or permissions. That makes the skill's ability to use network, local files, and environment-derived secrets non-transparent, which increases the chance of over-privileged execution and unsafe deployment decisions.
The skill description and usage instructions are written entirely in Chinese, which can indicate a language-specific constraint. The file does not offer an alternative language, user opt-in, or explain that the skill is intentionally limited to Chinese-language users or A-share market contexts, creating a potential language/locale policy issue.
The markdown instructs users to supply an x-api-key in public_key:secret_key format and references local credential storage, but it does not warn about the sensitivity of those secrets or safe handling practices. This can lead to accidental exposure through shell history, logs, screenshots, copied commands, or insecure files, especially because the skill already appears to manage credentials locally.
This code file contains user-facing CLI errors and prompts entirely in Chinese, beginning with the message on L077 and continuing throughout the script. Under the policy for natural-language violations, forcing a specific language without user opt-in is a locale/language policy issue because users are not offered any alternative or configuration.
The skill's stated purpose is financial analysis of A-share stocks, but the wrapper reads ACCOUNT_ID plus multiple environment variables containing API secrets and uses them to provision access. Handling platform credentials may be an implementation concern for a generic client, yet it is not a capability justified by the business purpose described in the manifest.
The client will automatically fetch API credentials from a remote endpoint and, unless explicitly disabled, persist them to config/api_key.txt on disk. For a public stock-analysis skill, this expands the trust boundary and creates unnecessary secret-handling behavior that is not apparent from the skill description, increasing the risk of credential leakage through local filesystem exposure, accidental commits, or use against an attacker-controlled base URL.
The module docstring and user-facing messages are entirely in Chinese, which imposes a locale choice in natural-language interaction. Under the stated policy, forcing a specific language without opt-in or documented justification is a policy concern.
When API keys are auto-fetched, the script persists them to config/api_key.txt by default without an explicit confirmation step. Storing long-lived credentials on disk can expose them to other local users, backups, accidental commits, or malware, turning a convenience feature into credential leakage risk.
The script sends the user-provided message and API credentials to a remote service endpoint, but the CLI flow does not present a clear runtime warning, consent step, or privacy notice before transmission. In a stock-analysis skill, users may input sensitive trading ideas, account-related context, or proprietary research, so silent exfiltration to a third-party service creates a genuine confidentiality and informed-consent risk.
The manifest uses Chinese-only natural-language text in the description and payment flow instructions, which effectively forces a specific language for understanding and use of the skill. The policy allows locale constraints only when they are explicitly justified or when users are given a language/locale choice, neither of which is present here.
All instructional text in the file is written in Chinese, including setup and operational guidance, with no indication that the skill is intended only for a Chinese-speaking audience or that users may choose another language. This is a natural-language locale policy concern because it imposes a specific language without user opt-in.
The dependency is specified with a caret range (^2.6.1), which allows newer minor and patch versions to be installed without explicit review. This weakens reproducibility and supply-chain control, and can result in unexpectedly pulling a vulnerable or breaking release in future installs.
"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 includes yaml without an exact pinned version, while known advisories exist for some yaml releases. Because the allowed version range is not fixed, installations may resolve to an affected version depending on when and where the skill is installed, creating avoidable uncertainty around denial-of-service conditions such as crashes or stack overflows during YAML parsing.