T09 · Insecure Skill Coding Practices
- Location
scripts/generate_image.py:56- Finding
Undocumented Automatic Google Provider Can Transmit Local Images
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill mostly does what it says, but its image script can automatically use an undeclared Google provider and send prompts or local images there.
Review this before installing if your environment has a GEMINI_API_KEY or strict provider allowlists. Use explicit provider selection, avoid sensitive prompts or private media unless you approve third-party processing, and remember Atlas API usage is billed to the configured account.
scripts/generate_image.py:56Undocumented Automatic Google Provider Can Transmit Local Images
scripts/generate_image.py:309API-Controlled Output URLs Are Downloaded Without Validation
There is a material description-behavior mismatch. The description presents a broad Wan video-and-image generation skill centered on Alibaba Wan 2.6/2.5, with multiple video modalities and video-specific controls. The supplied code chunk only implements image generation/editing workflows and file upload/model listing, with Atlas Cloud and Google AI Studio providers. It does not generate, edit, transform, upload, or download videos, and contains no logic for duration, resolution, camera shots, audio guidance, or prompt expansion. The code’s actual primary purpose is image generation/editing, not the declared video-heavy multimodal Wan skill.
The code substantially matches part of the description: it does support text-to-video, image-to-video, video-to-video, audio input, local file upload, model listing, polling, and downloading outputs through Atlas Cloud. However, the declared purpose is broader than the actual implementation. The script only targets video workflows via the /model/generateVideo endpoint and saves video outputs; there is no separate image-generation or image-editing path, no text-to-image endpoint, and no photo editing logic. Many claimed features such as prompt expansion, multi/single camera shot support, 1080p/15-second constraints, and support for 18 model variants are not directly implemented in code—they may be pass-through API parameters at best, but are not evidenced here. Because the description explicitly says to use the skill for generating/editing images and photos, while the code only implements video-related operations, this is a material description/behavior mismatch.
The trigger text is extremely broad and could cause the skill to activate for generic image, video, marketing, or visual-content requests that may not specifically require this third-party integration. Because the skill sends prompts and media to an external paid API, over-triggering raises risks of unnecessary data disclosure, unexpected charges, and users unknowingly routing content to a third party.
The skill declares access to environment secrets and makes outbound network calls, but does not explicitly scope or constrain those capabilities with a permissions/allowed-tools declaration. In a skill that handles a billing-enabled API key and transmits user prompts and media to a third-party service, missing tool scoping increases the chance of unintended secret access or broader-than-expected external communication.
This workflow explicitly sends prompts and authorization credentials to a third-party API and may upload user media for processing. In context, external transmission is expected for the feature, but it remains security-relevant because it exposes potentially sensitive user content and uses an account-wide billing key.
# Step 1: Submit
curl -s -X POST "https://api.atlascloud.ai/api/v1/model/generateVideo" \
-H "Authorization: Bearer $ATLASCLOUD_API_KEY" \
-H "Content-Type: application/json" \
-d '{
This workflow explicitly sends prompts and authorization credentials to a third-party API and may upload user media for processing. In context, external transmission is expected for the feature, but it remains security-relevant because it exposes potentially sensitive user content and uses an account-wide billing key.
# Step 1: Submit
curl -s -X POST "https://api.atlascloud.ai/api/v1/model/generateVideo" \
-H "Authorization: Bearer $ATLASCLOUD_API_KEY" \
-H "Content-Type: application/json" \
-d '{
This example sends an image URL, prompt, and API credential to an external service for image-to-video generation. Even though that is the intended function, user-supplied media may contain sensitive or proprietary content, so automatic transmission to a third party has privacy and billing implications.
curl -s -X POST "https://api.atlascloud.ai/api/v1/model/generateVideo" \
-H "Authorization: Bearer $ATLASCLOUD_API_KEY" \
-H "Content-Type: application/json" \
-d '{
Video-to-video processing transmits source video URLs and prompts to a third-party API, which can expose sensitive recordings or proprietary media. Because video content often carries more identifying or confidential information than text alone, the context makes external transmission more sensitive here.
curl -s -X POST "https://api.atlascloud.ai/api/v1/model/generateVideo" \
-H "Authorization: Bearer $ATLASCLOUD_API_KEY" \
-H "Content-Type: application/json" \
-d '{
Audio-guided generation transmits audio URLs and prompts externally, which may reveal copyrighted, confidential, or personal audio content. The inclusion of additional media types broadens the privacy surface and increases the chance that users unintentionally share sensitive data.
curl -s -X POST "https://api.atlascloud.ai/api/v1/model/generateVideo" \
-H "Authorization: Bearer $ATLASCLOUD_API_KEY" \
-H "Content-Type: application/json" \
-d '{
This text-to-image example still sends user prompts and the authorization token to a third-party service, which can leak sensitive prompt content or incur charges. Although lower risk than direct media upload, prompts may still contain confidential business, personal, or regulated information.
curl -s -X POST "https://api.atlascloud.ai/api/v1/model/generateImage" \
-H "Authorization: Bearer $ATLASCLOUD_API_KEY" \
-H "Content-Type: application/json" \
-d '{
Image editing requires sending one or more source images to the remote API, which creates a direct privacy and confidentiality exposure for user-provided media. Because edited images may be personal photos or proprietary assets, this external transfer is materially security-relevant even if intentional.
curl -s -X POST "https://api.atlascloud.ai/api/v1/model/generateImage" \
-H "Authorization: Bearer $ATLASCLOUD_API_KEY" \
-H "Content-Type: application/json" \
-d '{
The flash image-to-video example also transmits user image content and prompts to the external provider. The faster or cheaper model variant does not reduce the underlying privacy and billing risk associated with sending user media off-platform.
curl -s -X POST "https://api.atlascloud.ai/api/v1/model/generateVideo" \
-H "Authorization: Bearer $ATLASCLOUD_API_KEY" \
-H "Content-Type: application/json" \
-d '{
The manifest describes a skill for generating both AI videos and images, including text-to-image and image editing across Wan 2.5/2.6 variants. This file only supports listing models, uploading media, submitting to a /model/generateVideo endpoint, polling video predictions, and downloading returned outputs; there is no image-generation or image-editing implementation here.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
import urllib.error
import urllib.parse
API_BASE = "https://api.atlascloud.ai/api/v1"
def get_api_key():
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
import urllib.error
import urllib.parse
API_BASE = "https://api.atlascloud.ai/api/v1"
def get_api_key():
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
import urllib.error
import urllib.parse
API_BASE = "https://api.atlascloud.ai/api/v1"
def get_api_key():
The docstring says the script supports text-to-video, image-to-video, video-to-video, and local file upload, which can imply local files are accepted directly as generation inputs. In the implemented CLI, generate only accepts --image, --video, and --audio as URL strings, while local files must be uploaded separately via the upload command first.