T09 · Insecure Skill Coding Practices
- Location
scripts/skill_router.py:51- Finding
API Key Disclosure Through Cross-Origin HTTP Redirects
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill appears to do what it claims, but its API-key handling has a credible redirect-related exposure risk users should review before installing.
Install only if you are comfortable sending prompts, image URLs, generation settings, and a Media.io API key to Media.io. Use a scoped or low-credit API key if possible, avoid confidential or regulated content, and consider fixing the router to disable redirects before using it with a valuable key.
scripts/skill_router.py:51API Key Disclosure Through Cross-Origin HTTP Redirects
The skill clearly integrates with Media.io OpenAPI, but the documentation does not warn users that prompts and uploaded images will be transmitted to an external third-party service for processing. This can lead to unintentional disclosure of sensitive data, especially if users assume processing is local or only within the agent environment.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
"description": "API to query user credits balance.",
"api_header": "{\"list\": [{\"name\": \"X-API-KEY\", \"value\": \"API key to authorize requests\"}, {\"name\": \"Content-Type\", \"value\": \"application/json\"}], \"title\": \"Authorizations\", \"describe\": \"Add the following authorization information in the request header\"}",
"api_body": "{\"title\": \"Request Body\", \"category\": [{\"list\": [], \"title\": \"Query Credits\", \"describe\": \"Request body to query user credits balance\"}]}",
"api_request_demo": "{\"title\": \"Example Request\", \"request\": [{\"title\": \"Query User Credits\", \"language\": \"cURL\", \"code_example\": \"curl --request POST \\n --url https://openapi.media.io/user/credits \\n --header 'Content-Type: application/json' \\n --header 'X-API-KEY: <api-key>' \\n --data '{}'\"}]}",
"api_response": "{\"list\": [{\"name\": \"code\", \"type\": \"integer\", \"describe\": \"Response status code, 0 indicates success\"}, {\"name\": \"msg\", \"type\": \"string\", \"describe\": \"Response message, empty string on success\"}, {\"name\": \"data\", \"type\": \"object\", \"describe\": \"Response data object\"}, {\"name\": \"credits\", \"type\": \"integer\", \"describe\": \"User credits balance, located within the data object\"}], \"title\": \"Response\", \"describe\": \"After the request is successfully processed, the server will return the following response\"}",
"api_code_demo": "{\"list\": [{\"code\": \"0\", \"describe\": \"Success\"}, {\"code\": \"40001\", \"describe\": \"Invalid API key\"}, {\"code\": \"40002\", \"describe\": \"API key expired\"}], \"title\": \"Status Code\"}",
"content": null,
The Vidu Q2 entry documents submitting an image URL and prompt to https://openapi.media.io/generation/vidu/i2v-vidu-q2, but there is no user-facing disclosure that potentially sensitive user content is transmitted off-system for processing. Because this file is a JSON documentation/manifest file, SQP-2 applies to missing warnings about privacy-impacting behavior.
The Vidu Q3 image-to-video entry describes uploading user-controlled content and parameters, including image URL, prompt, and audio-generation options, to a remote generation endpoint, but it does not disclose the privacy implications of that transfer. This is a documentation omission affecting user awareness of external processing.
The text-to-video entry documents sending prompts and generation preferences to a remote API endpoint but does not warn users that their text inputs will leave the local environment and be processed by an external provider. That is a missing privacy disclosure under SQP-2 for this manifest/documentation file.
This code accesses a sensitive credential via API_KEY and sends it to a remote service in the X-API-KEY header. Although the behavior is functionally required, the file provides no user-facing prompt, print/log notice, or explicit warning comment/docstring that credentials will be used and transmitted.
This JSON manifest documents outbound HTTP requests that require sending an X-API-KEY header to openapi.media.io, but it provides no warning about handling credentials or the fact that authentication data is transmitted to a third-party endpoint. For markdown and manifest-style documentation, SQP-2 applies when descriptions omit warnings about behaviors affecting privacy or system integrity.