T09 · Insecure Skill Coding Practices
- Location
config/settings.json:29- Finding
Plaintext Third-Party API Credentials Distributed with the Skill
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill is a plausible podcast workflow, but it ships real-looking secrets and can automatically send episode metadata to Discord without clear opt-in.
Review before installing. Do not use this package with confidential guest names, unreleased topics, or private transcripts unless the credentials are removed, the gateway token is deleted, Discord posting is made explicit and opt-in, and all API keys are supplied by your own secure configuration. Any exposed keys should be considered compromised and rotated.
config/settings.json:29Plaintext Third-Party API Credentials Distributed with the Skill
scripts/podcast-pre-production.cjs:187Hardcoded OpenClaw Gateway Bearer Token Used as an Authentication Fallback
scripts/podcast-pre-production.cjs:187Automatic Disclosure of Episode and Guest Metadata to a Configured Discord Channel
The README shows use of external APIs (tavily, gemini) and workflows involving guest research and transcript processing, but it does not warn users that podcast topics, guest names, and transcript contents may be sent to third-party services. This creates a real privacy and data-handling risk because users may process unpublished content or personal data without informed consent or awareness of external transmission.
The skill advertises execution of Node scripts and references API keys/configuration, but it does not declare any explicit tool scope or permissions boundary. In a skill that performs research and transcript processing, undeclared environment or tool access increases the chance of over-broad execution, secret exposure, or unintended file/system access by the hosting agent.
The description and all user-facing instructions are written in Chinese, effectively forcing a single language for the skill experience. There is no opt-in language selection or explicit documentation that the skill is intentionally limited to a Chinese-speaking or China-specific audience.
The skill processes guest research data and episode transcripts, which may contain personal data, sensitive opinions, or unpublished content, yet the description provides no privacy or data-handling warning. Users may unknowingly submit third-party personal information or confidential recordings to external APIs, creating compliance, consent, and data leakage risks.
The host_name value is set to 繁哥, which indicates a specific language/locale presentation baked into the skill configuration. For a general-purpose skill config, this can create a language/locale policy issue because users are not offered a choice or opt-in to that locale-specific output.
The natural-language description is entirely in Chinese and emphasizes domestic-platform adaptation, which suggests a fixed language/locale orientation without any indication that users can choose another language. This may violate language/locale policy when the skill appears to assume a specific language by default rather than offering opt-in or documenting a justified regional restriction.
The file header presents this as a usable 'Podcast Post-Production Pipeline', but the implementation of later generators depends on undeclared variables such as guestName and topic, causing runtime failure before outputs are produced. This is an active contradiction between the script's documented purpose/usage and what the code can actually do.
The file uses Chinese-language usage text and later formats dates/times with the fixed 'zh-CN' locale and Asia/Shanghai timezone, indicating the skill is designed to operate in a single language/locale. The file does not offer opt-in or a configurable locale, which matches the policy concern for forcing a specific language or locale without user choice.
The manifest describes an end-to-end podcast production pipeline with research, outline generation, show notes, and social promotion support, but this file's actual behavior is limited to creating local markdown templates. Although it reads a transcript file, the transcript is never used to derive notes, descriptions, highlights, or platform-adapted content, so the implemented behavior falls short of the claimed automation.
The generated output uses toLocaleDateString('zh-CN') and similar fixed locale/timezone calls elsewhere, which forces Chinese localization regardless of user preference. Because no user-selectable locale or documented regional limitation is present, this is a natural-language locale policy issue.
This output template embeds a fixed Chinese locale and Shanghai timezone for generated timestamps. Hard-coding a locale in user-facing content without offering a choice or documenting a justified regional scope violates the stated natural-language locale policy.
This template forces Chinese localization and Shanghai timezone for output metadata. The skill does not provide any mechanism for users to select another language or locale, so it enforces a specific locale by default.
The generated social-media package includes metadata localized only for zh-CN and Asia/Shanghai. Without opt-in or a documented regional requirement, this is an avoidable language/locale policy issue.
This template again fixes output to Chinese locale and Shanghai timezone, making the skill's user-facing content locale-specific with no choice for users. That matches the natural-language policy concern around forced locale behavior.
User-provided topic and guest information are sent to Tavily for external research without explicit notice or consent. In a podcast workflow this may seem normal, but guest identities or unreleased episode topics can be sensitive, so silent transfer to a third-party service creates privacy and confidentiality risk.
The script performs an outbound side effect by posting episode status/details to Discord, but that behavior is outside the core local pre-production flow and is not clearly disclosed by the stated scope. Undisclosed external messaging increases data exposure risk because topics, guest names, and workflow metadata are transmitted to another system without explicit user consent or a clearly bounded trust model.
The code includes a hardcoded fallback bearer token for a local messaging gateway, which is a credential exposure issue and enables unauthorized use of that gateway if the script or repository is shared. Even though the endpoint is localhost, embedded secrets are dangerous because they can be reused by other local processes or attackers with code access, and they normalize hidden privileged capabilities unrelated to the main research function.
The script sends generated episode details, including topic and possibly guest name, to Discord without clear upfront disclosure. This creates an unnecessary external dissemination path for potentially embargoed production information, especially risky in media workflows where episode plans and guest participation may be confidential until publication.
Most user-facing instructions and descriptions are provided only in Chinese, which effectively forces a specific language for users of the skill. The file does not offer an alternative language option or explain that the skill is intentionally limited to a Chinese-language audience.
The package description presents a very broad end-to-end automation capability covering multiple podcast-production tasks, but it does not define any specific trigger phrases, scope boundaries, or exclusion conditions. In a manifest context, this kind of broad natural-language description can contribute to unintended invocation because it overlaps with many common podcast-related requests.
The natural-language interface and usage text are presented in Chinese, and the script later formats time using the zh-CN locale, but there is no indication that this is optional or required for a region-specific purpose. This can violate language/locale policy when a skill forces a specific language without user opt-in.
The generated outline always uses the zh-CN locale and Asia/Shanghai timezone for its timestamp. This is a locale-specific behavior that is not presented as configurable or justified as region-specific, which may conflict with organizational language/locale policy.