other
- Location
scripts/upload_video_file.sh:40- Finding
API Credentials and User Media Are Transmitted to an Unverified Endpoint
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This upload skill performs mostly relevant video API actions, but it asks for reusable secrets and media files while hard-coding a questionable service destination and including account-changing actions beyond simple upload.
Install only if you trust the publisher and have verified that `api-w3stream.attoaioz.cyou` is the intended service endpoint for your account. Use a least-privileged upload-only or short-lived key where possible, avoid passing secrets on the command line, confirm the exact file path before upload, and do not allow delete or update operations unless you explicitly intend them.
scripts/upload_video_file.sh:40API Credentials and User Media Are Transmitted to an Unverified Endpoint
scripts/create_video_default.sh:4Secret API Keys Are Exposed Through Process Arguments and Shell History
scripts/upload_video_file.sh:68Predictable Temporary File Enables Local Symlink and Integrity Attacks
scripts/create_video_default.sh:13Unescaped Video Titles Permit JSON Structure Injection
scripts/upload_video_file.sh:36Upload Scripts Report Success Without Validating HTTP or Pipeline Failures
The declared description centers on a full video upload workflow: creating video objects, uploading a file, finalizing the upload, and returning a video link. The supplied code does none of those things. It is a shell script that calls a /api/videos/cost endpoint to retrieve transcoding price information based on duration and output qualities. This is a materially different primary purpose, so the description does not accurately represent the code's behavior.
The declared description describes a full upload workflow: create video objects, upload the file, complete the upload, and return the final video link. The supplied code chunk performs only one subset of that workflow: sending a POST request to create a video object with a hardcoded custom quality configuration. There is no file transfer step, no completion/finalization call, and no logic to extract or return a video link. While the code is related to AIOZ Stream video creation, it materially underimplements the described end-to-end behavior, so the description does not accurately represent this specific code chunk.
The declared description presents a full quick-upload workflow: create video objects with default or custom encoding settings, upload the file, complete the upload, and return a link. The supplied code only performs the initial create-video API call with a title. It does not handle file upload, upload completion, link extraction/return, or custom encoding options. While creating a video object is consistent with part of the description, the actual code chunk implements only a narrow subset of the declared functionality, so the description overstates what this code actually does.
The declared description says the skill performs a video upload workflow: create a video object, upload the file, finalize the upload, and return a link. The supplied code does none of that. It only issues a GET request to retrieve details for a specified video ID from the API. This is a materially different primary purpose and capability from uploading videos, so the description does not accurately represent the code.
The declared description describes a full video-upload workflow: creating video objects, uploading a video, completing the upload, and returning a video link. The supplied code instead performs a different task: it uploads a thumbnail image (.png/.jpg) to the thumbnail endpoint for an already existing video ID. This is not a supporting implementation detail of the declared flow; it is a separate media-management action with a different primary purpose and different required inputs.
The code only implements the file-upload portion of the described workflow. It accepts credentials, a preexisting VIDEO_ID, and a local file path; computes hashes; uploads the file in one or more parts; and calls a completion endpoint. It does not create a video object, does not set encoding configurations, and does not obtain or return a user-facing video link. While the general domain matches video upload to an AIOZ-related API, the declared description overstates the implemented behavior in material ways.
Delete-video functionality is materially more dangerous than upload and is not justified by the skill's stated purpose. In an agent context, bundling destructive account operations into an upload skill increases the risk of unintended or socially engineered deletion of user assets.
Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).
echo ""
# Cleanup temp file
rm -f /tmp/chunk_hash_$$
# Move to next chunk
START_POS=$((END_POS + 1))
The README instructs users to pass a secret API key directly as a command-line argument, which can expose credentials through shell history, process listings, audit logs, CI job logs, and terminal recordings. Because this skill is specifically for uploading to a remote API using long-lived authentication headers, disclosure of the secret key could allow unauthorized API access and misuse of the user's account.
The skill instructs use of shell-capable tooling (curl, jq, md5sum) but does not declare an explicit tool scope such as allowed tools or permissions. In an agent setting, missing scope boundaries increases the chance the skill can invoke shell operations more broadly than users expect, including reading local files and transmitting them to remote endpoints.
This skill is explicitly designed to transmit sensitive material externally: API credentials are sent as headers on every request and local video files are uploaded to a third-party service. External transmission is expected for the use case, but it still creates real exfiltration risk if users provide the wrong file path, if prompts are manipulated, or if the destination/domain is not tightly validated.
emoji: "🎬"
requires:
bins:
- curl
- jq
- md5sum
---
The multipart upload step sends a local file and associated hash to an external service, which is the core behavior of the skill but also the primary security risk. In an agent environment, any capability that reads local paths and posts their contents remotely can be abused to exfiltrate unintended files if path handling and user consent are weak.
Then upload via multipart form-data with the Content-Range header:
curl -s -X POST "https://api-w3stream.attoaioz.cyou/api/videos/VIDEO_ID/part" \
-H 'stream-public-key: PUBLIC_KEY' \
-H 'stream-secret-key: SECRET_KEY' \
-H "Content-Range: bytes 0-$END_POS/$FILE_SIZE" \
The manifest frames the skill as a simple upload helper, but the documentation also enables broader account operations including listing, updating, thumbnail upload, pricing, and deletion. This scope expansion matters because users or orchestrators may authorize the skill for upload-only tasks while it actually contains instructions for additional state-changing actions against the same API.
The documented delete call is destructive and irreversible in effect, yet the skill provides no warning, confirmation, or safety checks. Without confirmation guidance, an agent could execute deletion from an ambiguous prompt or prompt-injection chain, causing loss of video assets.
The manifest identifies the skill as "w3stream-video-upload" and describes uploading to the W3Stream API, while the provided skill metadata says the skill is "aioz-stream-video-upload" for the AIOZ Stream API. This mismatch can mislead reviewers and users about the skill’s true identity and destination service, increasing the risk of misconfiguration, accidental trust, or deceptive repackaging.
This shell script sends the provided public and secret keys as HTTP headers to a remote API using curl. Although the usage message shows that keys are required, there is no warning, confirmation, or explanatory comment disclosing that credentials will be transmitted over the network.
This script transmits sensitive credentials (stream-public-key and stream-secret-key) to an external service via HTTP headers. Although this appears necessary for the skill’s intended API interaction, it is still a real security-sensitive behavior because the skill causes secret material to leave the local environment and trusts a hard-coded third-party endpoint, increasing exposure if the endpoint is malicious, mistyped, compromised, or monitored.
fi
# Example: 720p and 1080p with h264 codec
curl -s -X POST 'https://api-w3stream.attoaioz.cyou/api/videos/create' \
-H 'stream-public-key: '"$PUBLIC_KEY" \
-H 'stream-secret-key: '"$SECRET_KEY" \
-H 'Content-Type: application/json' \
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
exit 1
fi
curl -s -X POST 'https://api-w3stream.attoaioz.cyou/api/videos/create' \
-H 'stream-public-key: '"$PUBLIC_KEY" \
-H 'stream-secret-key: '"$SECRET_KEY" \
-H 'Content-Type: application/json' \
This shell script sends the provided public and secret keys as HTTP headers to a remote API, but the file contains no warning, confirmation, or explanatory comment disclosing that credentials will be transmitted off-host. The usage message only describes required arguments and does not inform the user about the network action or credential handling.
The script performs a video-detail retrieval operation even though the skill metadata describes an upload-focused workflow. That mismatch expands the skill's effective capabilities beyond what a user would reasonably expect, which can enable undisclosed data access and weaken informed consent around API operations using supplied credentials.
The script transmits the provided public and secret keys as HTTP headers to a remote API without any explicit user disclosure in the skill behavior. Even if sent over HTTPS, silently using sensitive credentials in a secondary operation increases the risk of unintended credential exposure, misuse, or user surprise, especially when combined with undocumented read-access behavior.
The manifest describes a skill for creating video objects, uploading the video file, completing the upload, and returning the video link. This script performs a separate operation: uploading a thumbnail image to an existing video via a dedicated thumbnail endpoint, which is not mentioned in the stated skill description.
The script performs an HTTP POST that sends the provided public/secret keys in headers and uploads a local thumbnail file, but it provides no confirmation prompt and no explicit disclosure that credentials and file contents will be transmitted to a remote service. For a code file, this is a safety-relevant network operation involving credentials and local data, and the visible usage text does not warn about that behavior.
The script accepts the secret key as a positional command-line argument, which can expose it through shell history, process listings, audit logs, or job-control tooling visible to other local users. In a skill intended for API uploads, this is a real credential-handling weakness because the secret is used directly for authentication to the remote service.
These curl requests transmit the selected video file and authentication headers to an external service. The script logs that it is uploading, but it does not clearly disclose that file data and credentials are being sent to a remote endpoint or provide any warning about that privacy/security impact.
No suspicious patterns detected.