Back to skill

Security audit

Crazyrouter Stt

Security checks for vulnerabilities and agentic risk

Overview

This transcription skill does what it claims, but it can upload recordings and the API key to an undocumented, environment-controlled API destination.

Review before installing. Only use this skill with recordings you are willing to send to Crazyrouter or to whatever endpoint CRAZYROUTER_BASE_URL names in the runtime environment. Prefer removing or tightly controlling CRAZYROUTER_BASE_URL, and use a limited/rotatable API key if available.

Vulnerability Patterns
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Agent Memory PoisoningWrites attacker-controlled rules into memory that affect later sessions
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (1)

T09 · Insecure Skill Coding Practices

Error
Location
scripts/main.mjs:6
Finding
Unvalidated API Base URL Enables Credential and Media Disclosure<![CDATA[ ## Vulnerability Details **File Location**: `scripts/main.mjs`, lines 6 and 37-50 **Vulnerability Type**: Unvalidated destination for sensitive authenticated uploads **Risk Level**: High ### Vulnerable Code ```js const API_BASE = process.env.CRAZYROUTER_BASE_URL || "https://crazyrouter.com/v1"; ``` ```js const apiKey = getApiKey(); const fileBuffer = await readFile(args.input); const fileName = path.basename(args.input); console.error(`Transcribing: ${fileName} (${(fileBuffer.length / 1024).toFixed(1)}KB)`); console.error(`Model: ${args.model}${args.translate ? " (translate to English)" : ""}`); const endpoint = args.translate ? "translations" : "transcriptions"; const formData = new FormData(); formData.append("file", new Blob([fileBuffer]), fileName); formData.append("model", args.model); if (args.language) formData.append("language", args.language); const response = await fetch(`${API_BASE}/audio/${endpoint}`, { method: "POST", headers: { "Authorization": `Bearer ${apiKey}` }, body: formData, }); ``` ### Technical Analysis The script permits `CRAZYROUTER_BASE_URL` to control the origin receiving transcription requests. The value is used without validating its protocol, hostname, port, or trust relationship. Every request to the configured origin contains: - The `CRAZYROUTER_API_KEY` bearer credential in the `Authorization` header. - The complete contents of the user-selected audio or video file. - The original file's basename. - The requested model and optional language metadata. Although `SKILL.md` describes uploading media to `https://crazyrouter.com`, it does not document this destination override. If an attacker can influence the process environment, the attacker can set the base URL to a server they control. A normal transcription invocation will then disclose the credential and media directly to that server. This is an insecure trust-boundary implementation: sensitive authentication data and privat ...[truncated 1717 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Remove support for `CRAZYROUTER_BASE_URL` if changing the service destination is not a required feature: ```js const API_BASE = "https://crazyrouter.com/v1"; ``` 2. If an override is operationally necessary, validate it before processing any file or obtaining the API key: ```js const allowedOrigins = new Set(["https://crazyrouter.com"]); const apiUrl = new URL( process.env.CRAZYROUTER_BASE_URL || "https://crazyrouter.com/v1" ); if ( apiUrl.protocol !== "https:" || !allowedOrigins.has(apiUrl.origin) || apiUrl.username || apiUrl.password ) { throw new Error("Invalid or untrusted Crazyrouter API base URL"); } ``` 3. Enforce an explicit allowlist of trusted HTTPS origins rather than accepting arbitrary hostnames, IP addresses, protocols, or ports. 4. Reject URLs containing embedded credentials, fragments, unexpected ports, or ambiguous hostname representations. 5. Disable automatic redirects or validate every redirect destination. Never forward the bearer credential or media body to a different origin. 6. Document every supported configuration variable in `SKILL.md`, including its security implications. 7. Use a narrowly scoped API key where the provider supports scoped credentials, and rotate the key immediately if destination manipulation may already have occurred. 8. Validate the destination before reading the media file so invalid configuration fails without unnecessarily loading sensitive content. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
Findings (2)

Missing User Warnings

Medium
Confidence
96% confidence
Finding
The skill routes user-supplied audio/video content to a third-party service for transcription, but the description does not clearly warn users that their files leave the local environment and are sent to Crazyrouter. This creates a privacy and data-handling risk because users may provide sensitive recordings without informed consent or awareness of external processing.

Missing User Warnings

Medium
Confidence
93% confidence
Finding
The skill uploads the full user-supplied audio file to a third-party remote API for transcription, but the code provides no explicit warning, consent check, or disclosure at execution time that potentially sensitive audio/video contents will leave the local environment. This can expose private conversations, credentials spoken aloud, or regulated data to an external service, especially if users assume processing is local.

Static analysis

Detected: suspicious.env_credential_access

Environment variable access combined with network send.

Critical
Code
suspicious.env_credential_access
Location
scripts/main.mjs:6