T09 · Insecure Skill Coding Practices
- Location
scripts/transcribe_large.sh:42- Finding
Python Code Injection Through an Unsafely Interpolated Audio Path
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill claims private local transcription, but its packaged code can automatically send audio to OpenAI or Groq and exposes an unauthenticated local daemon.
Review carefully before installing. Do not rely on the current package as local-only unless cloud dependencies and auto cloud fallback are removed or disabled. Avoid loading the LaunchAgent plist unless you have audited the exact plist and know how to unload it. Run the daemon only in a trusted local environment, and prefer an authenticated or upload-only design that does not accept arbitrary filesystem paths.
scripts/transcribe_large.sh:42Python Code Injection Through an Unsafely Interpolated Audio Path
scripts/daemon.py:120Unauthenticated Daemon Accepts Arbitrary Local Filesystem Paths
README.md:35Optional Login Persistence Uses an Unavailable and Unaudited LaunchAgent Definition
scripts/daemon.py:104Unbounded HTTP Request Body Can Exhaust Memory, Disk, and Processing Resources
scripts/transcriber.py:112Automatic Backend Selection Can Upload Audio Despite Local-Only Privacy Claims
requirements.txt:4Unpinned Dependencies and Unnecessary Cloud SDKs Increase Supply-Chain Exposure
The claimed scope is a private local Apple-Silicon MLX Whisper skill, but the finding indicates backend and model selection beyond that scope, including non-local/cloud options. This broader-than-declared behavior is dangerous because users may deploy it under false assumptions about privacy boundaries, platform restrictions, and where their data is processed.
The claimed scope is a private local Apple-Silicon MLX Whisper skill, but the finding indicates backend and model selection beyond that scope, including non-local/cloud options. This broader-than-declared behavior is dangerous because users may deploy it under false assumptions about privacy boundaries, platform restrictions, and where their data is processed.
The claimed scope is a private local Apple-Silicon MLX Whisper skill, but the finding indicates backend and model selection beyond that scope, including non-local/cloud options. This broader-than-declared behavior is dangerous because users may deploy it under false assumptions about privacy boundaries, platform restrictions, and where their data is processed.
The claimed scope is a private local Apple-Silicon MLX Whisper skill, but the finding indicates backend and model selection beyond that scope, including non-local/cloud options. This broader-than-declared behavior is dangerous because users may deploy it under false assumptions about privacy boundaries, platform restrictions, and where their data is processed.
The file-level documentation explicitly advertises cloud backends (OpenAI and Groq) even though the skill metadata promises private local transcription with no API costs. This mismatch is dangerous because users may rely on the manifest’s privacy claims while audio can in fact be routed to third-party services, creating confidentiality and billing risk.
The automatic backend selection falls back to OpenAI or Groq whenever their packages and API keys are present, despite the skill being described as local and private. In environments where these credentials are set, users can unknowingly have audio sent off-device and incur charges, directly violating expected trust and privacy boundaries.
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.
cp com.local-whisper.plist ~/Library/LaunchAgents/
launchctl load ~/Library/LaunchAgents/com.local-whisper.plist
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.
cp com.local-whisper.plist ~/Library/LaunchAgents/
launchctl load ~/Library/LaunchAgents/com.local-whisper.plist
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.
cp com.local-whisper.plist ~/Library/LaunchAgents/
launchctl load ~/Library/LaunchAgents/com.local-whisper.plist
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.
cp com.local-whisper.plist ~/Library/LaunchAgents/
launchctl load ~/Library/LaunchAgents/com.local-whisper.plist
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.
cp com.local-whisper.plist ~/Library/LaunchAgents/
launchctl load ~/Library/LaunchAgents/com.local-whisper.plist
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.
cp com.local-whisper.plist ~/Library/LaunchAgents/
launchctl load ~/Library/LaunchAgents/com.local-whisper.plist
The skill requests users to run shell commands, install Python packages, start a daemon, expose a localhost HTTP service, and configure a CLI command, but it declares no explicit tool scope or permissions. This is dangerous because reviewers and users cannot easily see that the skill needs shell, network, environment, and file-write capabilities, increasing the chance of over-trusting or deploying it in contexts where those capabilities are inappropriate.
The file comments market the package as a local Whisper/MLX solution while simultaneously including cloud API packages. That inconsistency is security-relevant because operators may deploy the skill under the assumption that sensitive voice data remains on-device, when the dependency set supports remote transmission and expands the attack surface.
The requirements declare cloud STT client libraries (OpenAI and Groq) even though the skill is described as private and local-only. This creates a real trust-boundary mismatch: downstream code can silently route audio or transcripts to third-party services, defeating users’ privacy expectations and increasing the chance of unintended data exfiltration.
The JSON mode allows a caller to supply an arbitrary local file path, and the daemon will verify existence, read its size, and pass it to the transcriber. Because the service listens on localhost without authentication, any local process able to connect can induce reads of arbitrary files and potentially exfiltrate sensitive content if the downstream transcription stack or error messages expose file-derived data.
The help text explicitly states that translation mode is 'to English', which imposes a specific output language. The file does not present this as a user choice at request time or document locale selection safeguards, so it can violate language/locale policy expectations.
The script claims private local transcription, but its default behavior is to contact a daemon over HTTP first and send metadata about the user-supplied audio file, including its absolute path. Even if the file contents are not uploaded by this script, transmitting local filesystem paths to a network service can leak sensitive host information and violates the stated privacy expectation, especially if the daemon is remote via environment configuration.
This curl invocation performs external transmission to an endpoint controlled by an environment variable, so the destination may be non-local even though the default is localhost. In the context of a speech-to-text skill marketed as local and private, unguarded network transmission increases the risk of privacy leakage and surprising data flow beyond what users expect.
)
local response
response=$(curl -s -X POST "$DAEMON_URL/transcribe" \
-H "Content-Type: application/json" \
-d "$json_payload" \
--connect-timeout 2 \
The script sends the absolute audio file path to a daemon over plain HTTP without any explicit runtime warning or consent flow. This can expose usernames, directory names, project names, or other sensitive path elements to another process or host, and if CLAWD_WHISPER_URL is changed from localhost, the disclosure extends off-device contrary to the skill's privacy-focused description.
The script usage and argument parsing indicate support for both --translate and --language, suggesting those options affect the transcription request. In the embedded Python code, only translation_mode is used and the parsed LANGUAGE value is never passed to Transcriber.transcribe, so the documented language option does nothing.
The top-level docstring presents the module as a transcription component while enumerating OpenAI and Groq cloud backends. In the context of a manifest advertising private local Apple-Silicon transcription with no API costs, this documentation reflects an implementation intent that contradicts the claimed skill intent rather than merely omitting details.
The skill's stated purpose is local transcription with MLX Whisper on Apple Silicon, but the code checks for OPENAI_API_KEY and GROQ_API_KEY and later uses them to initialize remote clients. Credential handling for third-party cloud services is not justified by a manifest centered on private local processing.
The API transcription path opens the local audio file and submits it to external transcription services without any user-facing warning or consent mechanism in this code. In the context of a skill advertised as private/local for Telegram and WhatsApp audio, this creates meaningful privacy risk because potentially sensitive voice messages may be exfiltrated to third parties unexpectedly.
Line L047 tells the user to replace their existing tools.media.audio config, and the later config block wires all supported voice-message transcription through this local script. While the file explains benefits and model download behavior, it does not explicitly warn that this modifies the user's global transcription pipeline and may affect existing behavior for incoming media.
No suspicious patterns detected.