T09 · Insecure Skill Coding Practices
- Location
config.yaml:10- Finding
Hard-Coded API Credential and Unrestricted Transmission to a Nonstandard Endpoint
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill has a legitimate media-to-skill purpose, but its default setup exposes a plaintext API key and sends screenshots or video frames to a nonstandard remote endpoint without strong disclosure or review controls.
Review this skill before installing. Do not use the bundled API key, rotate it if it is yours, and replace the default endpoint with a trusted provider. Only process videos or screenshots that are safe to send to that provider, and manually inspect any generated SKILL.md before installing or publishing it.
config.yaml:10Hard-Coded API Credential and Unrestricted Transmission to a Nonstandard Endpoint
src/skill_generator.py:36Untrusted Multimodal Model Output Is Written Directly into Installable Agent Instructions
src/mllm/openai_provider.py:12Sensitive Screenshots and Video Frames Are Uploaded Without a Prominent Destination-Specific Privacy Warning
requirements.txt:1Unpinned Runtime Dependencies Permit Unreviewed Future Releases
Calling an external OpenAI-compatible API for generic multimodal analysis is a significant behavior that should be explicitly declared, especially when users may supply screenshots or videos containing secrets, proprietary workflows, or internal system details. When that networked behavior is not accurately reflected in the skill's declared purpose and permissions, it creates a meaningful risk of silent data exfiltration to third-party services.
Calling an external OpenAI-compatible API for generic multimodal analysis is a significant behavior that should be explicitly declared, especially when users may supply screenshots or videos containing secrets, proprietary workflows, or internal system details. When that networked behavior is not accurately reflected in the skill's declared purpose and permissions, it creates a meaningful risk of silent data exfiltration to third-party services.
Calling an external OpenAI-compatible API for generic multimodal analysis is a significant behavior that should be explicitly declared, especially when users may supply screenshots or videos containing secrets, proprietary workflows, or internal system details. When that networked behavior is not accurately reflected in the skill's declared purpose and permissions, it creates a meaningful risk of silent data exfiltration to third-party services.
Calling an external OpenAI-compatible API for generic multimodal analysis is a significant behavior that should be explicitly declared, especially when users may supply screenshots or videos containing secrets, proprietary workflows, or internal system details. When that networked behavior is not accurately reflected in the skill's declared purpose and permissions, it creates a meaningful risk of silent data exfiltration to third-party services.
Referenced artifact was not completely inspected
- `SKILL.md` — A fully compliant OpenClaw skill with proper frontmatter
The skill advertises use of environment variables, file output, and external MLLM providers, but does not declare an explicit tool scope such as permissions or allowed-tools. That creates an under-specified trust boundary: users and orchestrators cannot easily tell that the skill may write files and make authenticated network calls, which increases the risk of unintended data exposure or overbroad execution.
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.
---
name: best-practice-skill-creator
description: Create OpenClaw skills from best practice videos or image sequences. Use when creating skill from video, generating skill from screenshots, converting tutorial to skill, building best practice automation.
user-invocable: true
metadata: {"openclaw":{"emoji":"🎓","requires":{"anyBins":["python3","python"]},"os":["darwin","linux","win32"],"primaryEnv":"MLLM_API_KEY"}}
---
The invocation description is broad enough that the skill may be selected for common 'create a skill' requests beyond the intended video/screenshot workflow. Over-broad routing is dangerous because it can trigger unnecessary file generation, external API usage, or handling of sensitive inputs in situations where a narrower or safer skill should have been chosen.
This configuration hard-codes what appears to be a live API key alongside an external base URL, creating immediate credential exposure and enabling unauthorized use of the remote service. Because this skill processes videos and images for skill generation, it may transmit potentially sensitive user content to a third-party endpoint, and the unusual mismatch of an 'openai' provider using a nonstandard cloubic URL with a Gemini model increases suspicion of unsafe or deceptive routing.
providers:
openai:
api_key: "sk-9Ld6xm13fTFHmfQYigDyStTcVrXEjxerlLxizlu6nRs"
base_url: "https://api.cloubic.com/v1"
model: "gemini-3.1-pro-preview"
gemini:
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.
def main():
parser = argparse.ArgumentParser(
description="Create OpenClaw skills from best practice videos or image sequences.",
formatter_class=argparse.RawDescriptionHelpFormatter,
epilog="""\
Examples:
The tool sends extracted frames or images to an external MLLM provider for analysis, but the CLI does not give an explicit warning or require acknowledgment that user media will leave the local system. This is dangerous because screenshots and videos may contain secrets, personal data, or proprietary information that users may not realize are being transmitted to a third party.
This code sends the user-provided prompt and base64-encoded image contents to an external Gemini API via HTTP, but there is no confirmation prompt, logging, comment, or docstring warning that user data is transmitted off-system. For a code file, outbound transmission of potentially sensitive user or system data should have some visible disclosure unless clearly documented elsewhere.
The method posts user-supplied prompt text and base64-encoded images to a remote OpenAI-compatible endpoint via client.post, which is a privacy-relevant network transmission. In this file there is no confirmation prompt, logging/print statement, or comment/docstring warning that user content will be sent externally.
This manifest file says environment variables override file values, but it does not specify when operators should rely on one mechanism versus the other or provide exclusion guidance. In manifest-style skill configuration, that lack of specificity can lead to unintended behavior because multiple configuration sources may appear valid at the same time.
The file sets a fixed active provider by default and does not present any user-selectable language or locale behavior. While not a strong violation, this is the only natural-language policy-adjacent issue visible in the file and could be improved by documenting user choice where provider behavior may imply language/locale defaults.
The manifest describes a tool for creating OpenClaw skills from videos or image sequences. In addition to media processing and skill generation, the code loads provider configuration and reads API key/base URL/model values from configuration files and environment variables, which is a separate credential-handling capability not stated in the manifest.
The dependency is specified with a lower bound only, which allows any newer release to be installed. This weakens build reproducibility and can unintentionally pull in a vulnerable or breaking version through future installs, making supply-chain risk harder to assess and control.
httpx>=0.27.0
Pillow>=10.0.0
opencv-python>=4.8.0
PyYAML>=6.0
Because httpx is not pinned, it is impossible to verify from this manifest whether deployment will use a version affected by known advisories. This creates a real supply-chain exposure: a vulnerable release could be selected now or later depending on resolver behavior and environment state.
Pillow is not pinned to an exact version, so installations may resolve to different releases over time. Because Pillow has had multiple historical security issues in image parsing, leaving it unpinned increases uncertainty and supply-chain exposure for a skill that likely processes untrusted images or screenshots.
httpx>=0.27.0
Pillow>=10.0.0
opencv-python>=4.8.0
PyYAML>=6.0
Pillow has numerous known advisories, and the unpinned requirement prevents verification that only a safe version will be installed. Given this skill's likely handling of screenshots or image sequences, image-decoding vulnerabilities are more relevant and increase the practical risk.
opencv-python is declared with only a minimum version, so future installations can silently consume newer releases without review. In software that processes video or image data, this can increase risk because parser-related flaws in media libraries may be introduced or remain unverifiable.
httpx>=0.27.0
Pillow>=10.0.0
opencv-python>=4.8.0
PyYAML>=6.0
opencv-python has known historical vulnerabilities, and the manifest does not constrain the installed release precisely enough to determine safety. Since the skill context involves video or image sequence processing, any flaw in media parsing libraries is more operationally significant than in a non-media workflow.
PyYAML is unpinned, allowing uncontrolled version selection at install time. This is more concerning than a typical library because YAML parsers have a history of unsafe deserialization issues, so lack of pinning makes it harder to guarantee that only a fixed, safe release is used.
httpx>=0.27.0
Pillow>=10.0.0
opencv-python>=4.8.0
PyYAML>=6.0
PyYAML has a history of deserialization and input-handling issues, and the manifest does not pin a version, so the actual installed release cannot be verified as safe. If this skill reads YAML-based configuration or generated artifacts, a vulnerable parser version could materially increase attack surface.