Back to skill

Security audit

Telegram Voice Transcribe

Security checks for vulnerabilities and agentic risk

Overview

This skill performs the stated transcription task, but it can upload sensitive voice recordings to OpenAI by default and can fetch arbitrary URLs without enough scoping or warning.

Review this carefully before installing. Use it only if you are comfortable with voice recordings being sent to OpenAI unless --local is explicitly used, avoid URL mode or sandbox it tightly, and make sure Telegram users know their audio may be automatically processed by a persistent hook.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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
Findings (3)

T09 · Insecure Skill Coding Practices

Error
Location
scripts/transcribe.py:45
Finding

Unrestricted URL Retrieval Enables Server-Side Request Forgery and Resource Exhaustion

Content
View full analysis
str: ext = os.path.splitext(url.split("?")[0])[1] or ".ogg" tmp = tempfile.NamedTemporaryFile(suffix=ext, delete=False) urllib.request.urlretrieve(url, tmp.name) return tmp.name ``` The URL is accepted directly from the command line and then passed to the downloader: ```python src.add_argument("--url", help="Direct audio URL") ``` ```python elif args.url: tmp_path = download_url(args.url) audio_path = tmp_path ``` In default API mode, the downloaded content is subsequently opened and sent to OpenAI: ```python with open(audio_path, "rb") as f: result = client.audio.transcriptions.create(file=f, **kwargs) ``` ```python if args.local: result = transcribe_local(audio_path, args.language, args.model) else: if not args.openai_key: raise RuntimeError("OPENAI_API_KEY not set (or use --local for free mode)") result = transcribe_api(audio_path, args.language, args.openai_key) ``` ### Technical Analysis The `--url` argument is treated as a trusted direct audio location. The implementation does not: - Enforce the documented HTTPS-only expectation. - Restrict accepted URL schemes. - Reject loopback, private, link-local, multicast, or reserved destinations. - Revalidate destinations following redirects. - Set an explicit timeout for this download. - Limit the number of downloaded bytes. - Validate the response MIME type, file signature, or actual audio format. - Confirm that the retrieved resource is appropriate for transcription. This creates a server-side request forgery primitive whenever an attacker can influence the URL passed ...[truncated 2270 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/transcribe.py:135
Finding

Audio Is Uploaded to OpenAI by Default Despite Local and Private Publication Claims

Content
View full analysis
--language es ``` ### Technical Analysis Voice recordings can contain credentials, private conversations, personal data, health information, business information, or other sensitive material. The script transmits the entire recording to OpenAI unless the caller explicitly supplies `--local`. API mode is part of the declared functionality and is not inherently unauthorized. The risk arises from the mismatch between: - Publication language emphasizing local and private opera ...[truncated 1863 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Note
Location
references/setup.md:5
Finding

Installation Instructions Use Unpinned Third-Party Dependencies

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (10)

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The documentation makes strong privacy claims such as 'audio never leaves your server' and '100% free' while also advertising an optional OpenAI Whisper API mode. That creates a misleading security posture: users may deploy or enable API mode without realizing audio is transmitted to a third party, which can cause unintended disclosure of voice content and metadata.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The API mode instructions tell users how to send audio to the OpenAI Whisper API but do not clearly warn that user voice data leaves the local server. In a messaging/transcription skill handling potentially sensitive voice notes, this omission can lead to unintentional third-party disclosure and privacy/compliance issues.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
92% confidence
Finding

The skill invokes capabilities that access environment variables and external networks, but it does not declare any tool scope or permissions boundary in the skill manifest. That creates an authorization and review gap: operators and automated policy systems cannot easily see that the skill will read secrets like OPENAI_API_KEY and TELEGRAM_BOT_TOKEN and transmit data to third-party services.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The skill description says it transcribes audio with OpenAI Whisper but does not clearly warn that user audio and associated metadata may be sent off-platform to external services. This can cause inadvertent disclosure of sensitive voice content, identifiers, and contextual metadata because users or calling agents may invoke the skill without informed consent or appropriate handling expectations.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The instruction to always pass --language es forces Spanish processing regardless of the user's actual language or consent. While not directly enabling code execution, it can degrade transcription accuracy, mis-handle user content, and impose a processing assumption that may lead to incorrect downstream actions based on a faulty transcript.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The setup encourages automatic forwarding of user voice messages to an external transcription service but does not warn operators to obtain user consent or disclose that audio content leaves Telegram/OpenClaw for third-party processing. In privacy-sensitive deployments, this can cause unauthorized sharing of personal or sensitive audio data and create compliance risk.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The manifest describes a Telegram voice transcription skill, but this setup guide explicitly tells OpenClaw or the agent to invoke transcribe.py through execFileSync and exec. Spawning subprocesses is not an obvious requirement of transcription itself and represents an additional capability that could be reused beyond the stated purpose.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The example hook sets msg.text to a Spanish-only string (Transcripción) and the usage examples recommend --language es for accuracy, but the document does not indicate this is optional or limited to Spanish-speaking deployments. This can violate language/locale policy by imposing a specific language without user opt-in.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Low
Category
Not specified by scanner
Confidence
81% confidence
Finding

The 'What it does' section presents a specific intent: reading Telegram-downloaded .ogg files from OpenClaw's inbound media directory and transcribing them locally. Later usage examples document a broader behavior using arbitrary files like 'audio.ogg' with API mode, which contradicts the earlier workflow-specific description rather than merely omitting detail.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
84% confidence
Finding

The policy applies to natural-language locale choices in any file type. The primary workflow example fixes the transcription language to Spanish, and the surrounding instructions do not state that this is only an example or that the user should choose their preferred language first.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.