T09 · Insecure Skill Coding Practices
- Location
scripts/image-edit.sh:85- Finding
Undisclosed Upload of Local Images to a Third-Party Temporary Hosting Service
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill mostly does what it says, but it has under-disclosed local-file upload behavior and a URL-handling flaw that could disclose local files.
Review before installing. Use this skill only with prompts and media you are comfortable sending to external AI services. Avoid local image editing unless you accept upload through a temporary public host, and do not let untrusted instructions choose transcription inputs because file:// style inputs could expose readable local files.
scripts/image-edit.sh:85Undisclosed Upload of Local Images to a Third-Party Temporary Hosting Service
scripts/transcribe.sh:55Arbitrary URI Scheme Handling Enables Local File Disclosure
The supplied code implements only a text chat/completions client for the Pollinations API. It constructs a messages array, posts to the chat completions endpoint, and extracts textual response content. There is no evidence in this chunk of image, video, audio, vision-analysis, or transcription functionality. While using Pollinations.ai is accurately represented, the declared description materially overstates the implemented capabilities of this specific code chunk.
The declared description describes a comprehensive Pollinations.ai skill covering text, images, videos, audio, analysis, and transcription via OpenAI-compatible endpoints. The supplied code chunk is much narrower: it only handles media generation by constructing a GET request to the Pollinations image endpoint and saving the returned file locally. It may incidentally support video output for certain models and includes an audio query flag, but there is no implementation for text generation, analysis, transcription, or general API coverage. Therefore the description materially overstates the skill's actual behavior for this code chunk.
The declared description presents a full-featured Pollinations.ai integration for generation and analysis tasks across multiple modalities. In contrast, this code chunk is a utility script whose sole function is to fetch and print model identifiers from Pollinations endpoints, with some hardcoded fallback model names. It does not call generation, analysis, or transcription endpoints, accept user content, or perform any AI task itself. While model listing is related to the Pollinations ecosystem, it is a materially narrower and different purpose than the declared end-user capabilities.
The skill allows selecting named external models such as Claude through a third-party integration, but does not explain routing, trust boundaries, or whether prompts may be forwarded to additional providers. In this context, external model selection can expose user data to different vendors with different handling policies, which is a real privacy and governance risk.
Usage:
scripts/chat.sh "your message"
scripts/chat.sh "your message" --model claude --temp 0.7
scripts/chat.sh "explain quantum physics" --model openai --max-tokens 500
scripts/chat.sh "list 3 colors" --json --model openai
scripts/chat.sh "solve this step by step" --model o3 --reasoning-effort high
The Gemini example reinforces that prompts can be routed to alternate external providers without explicit trust or privacy disclosures. Because the skill is broadly activatable, users may not realize their content is leaving the primary environment and being processed by a different vendor.
scripts/chat.sh "explain quantum physics" --model openai --max-tokens 500 scripts/chat.sh "list 3 colors" --json --model openai scripts/chat.sh "solve this step by step" --model o3 --reasoning-effort high scripts/chat.sh "translate to French" --system "You are a translator" --model gemini
**Options:**
Referenced artifact was not completely inspected
### 2. Image Generation (`scripts/image.sh`)
Referenced artifact was not completely inspected
### 2. Image Generation (`scripts/image.sh`)
Referenced artifact was not completely inspected
### 2. Image Generation (`scripts/image.sh`)
Referenced artifact was not completely inspected
### 2. Image Generation (`scripts/image.sh`)
Referenced artifact was not completely inspected
### 2. Image Generation (`scripts/image.sh`)
Referenced artifact was not completely inspected
### 2. Image Generation (`scripts/image.sh`)
Referenced artifact was not completely inspected
### 2. Image Generation (`scripts/image.sh`)
Referenced artifact was not completely inspected
### 2. Image Generation (`scripts/image.sh`)
Referenced artifact was not completely inspected
### 2. Image Generation (`scripts/image.sh`)
Referenced artifact was not completely inspected
### 2. Image Generation (`scripts/image.sh`)
Referenced artifact was not completely inspected
### 2. Image Generation (`scripts/image.sh`)
Referenced artifact was not completely inspected
### 3. Image Editing / Image-to-Image (`scripts/image-edit.sh`)
Referenced artifact was not completely inspected
### 3. Image Editing / Image-to-Image (`scripts/image-edit.sh`)
Referenced artifact was not completely inspected
### 3. Image Editing / Image-to-Image (`scripts/image-edit.sh`)
Referenced artifact was not completely inspected
### 3. Image Editing / Image-to-Image (`scripts/image-edit.sh`)
This example combines external provider selection with image analysis of local files, which can transmit sensitive visual data to a third-party model provider such as Claude. The context makes this more dangerous than ordinary text prompting because images may contain IDs, documents, faces, screens, or other high-sensitivity content.
scripts/analyze-image.sh "https://example.com/photo.jpg"
scripts/analyze-image.sh photo.jpg --prompt "What objects are in this image?"
scripts/analyze-image.sh image.png --model claude --prompt "Extract all text from this image"
Options:
The skill documents sending video content to a selected external model, which may reveal sensitive scenes, people, locations, or business activity to third-party providers. Video often contains more contextual and biometric data than text, so provider-routing ambiguity significantly increases privacy risk.
scripts/analyze-video.sh "https://example.com/video.mp4"
scripts/analyze-video.sh recording.mp4 --prompt "Summarize the key moments"
scripts/analyze-video.sh clip.mov --model gemini-large --prompt "Count the people"
Options:
Audio transcription with a selectable external model can expose voiceprints, conversations, and confidential meetings to a third-party provider. In this skill, the risk is elevated because the documentation encourages use with local files but does not pair that with strong data-transfer warnings or provider transparency.
Usage:
scripts/transcribe.sh recording.mp3
scripts/transcribe.sh podcast.wav --model gemini-large
scripts/transcribe.sh "https://example.com/audio.mp3" --prompt "Transcribe in French"
When the user provides a local file, the script silently uploads that file to litterbox.catbox.moe, an unrelated third-party host, making the image accessible outside the user's local environment. This is a clear data exfiltration/privacy risk because users may pass sensitive screenshots, identity documents, or internal images, and the skill context encourages routine AI image editing where such content is plausible.
The skill documents shell-based scripts and package installation steps but does not declare an explicit tool scope such as allowed-tools or permissions. That creates an authorization ambiguity where an agent may invoke shell capabilities more broadly than reviewers or users expect, increasing the chance of unintended command execution.