Back to skill

Security audit

🎤 Transcribe audio files using Qwen ASR. 千问STT

Security checks for vulnerabilities and agentic risk

Overview

This is a coherent audio transcription skill, but it uploads user audio to a third-party demo service without a clear pre-upload privacy notice or consent step.

Review this skill before installing if your audio may contain private, business, legal, medical, biometric, or confidential speech. It sends audio to qwen-qwen3-asr-demo.ms.show for processing, and the package does not document retention or consent handling. Prefer using it only with audio you are comfortable sharing with that external service, and consider pinning dependencies before use.

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

T08 · Insecure Dependencies

Warning
Location
scripts/main.py:1
Finding
Unpinned Third-Party Runtime Dependencies<![CDATA[ ## Vulnerability Details **File Location**: `scripts/main.py:1-4`; `SKILL.md:9-16` **Vulnerability Type**: Unpinned dependency resolution and unnecessary third-party package installation **Risk Level**: Medium ### Vulnerable Code `scripts/main.py:1-4`: ```python # /// script # requires-python = ">=3.11" # dependencies = ["aiohttp", "argparse", "gradio_client"] # /// ``` `SKILL.md:9-16`: ```yaml "install": [ {"id": "uv-brew", "kind": "brew", "formula": "uv", "bins": ["uv"], "label": "Install uv (brew)"}, {"id": "uv-pip", "kind": "pip", "formula": "uv", "bins": ["uv"], "label": "Install uv (pip)"}, {"id": "pip-aiohttp", "kind": "pip", "formula": "aiohttp", "label": "Install aiohttp (pip)"}, {"id": "pip-argparse", "kind": "pip", "formula": "argparse", "label": "Install argparse (pip)"}, {"id": "pip-gradio", "kind": "pip", "formula": "gradio_client", "label": "Install gradio (pip)"}, ], ``` ### Technical Analysis The skill declares `aiohttp`, `argparse`, and `gradio_client` without exact versions or package integrity hashes. The documented `uv run scripts/main.py` invocation can therefore resolve packages available from the configured package index at execution time rather than a fixed, previously audited dependency set. This creates a supply-chain risk because an unexpectedly changed or compromised dependency release could introduce arbitrary code into the skill's runtime. Python packages can execute code during installation, import, or normal library use. The external `argparse` package is unnecessary because the project requires Python 3.11 or later and `argparse` is already included in the Python standard library. Declaring it as a third-party dependency adds avoidable package-resolution and supply-chain exposure. No evidence was found that the currently named packages are malicious. The vulnerability is the absence of version and integrity controls, not a confirmed compromise of those packages. ### Attack Path 1. An ...[truncated 1402 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Remove `argparse` from both the inline dependency declaration and installation metadata because it is part of the Python 3.11 standard library. 2. Pin `aiohttp` and `gradio_client` to exact, reviewed versions rather than unconstrained package names. 3. Generate and commit a reviewed lockfile so dependency versions and transitive dependencies remain reproducible. 4. Require package hashes or equivalent integrity verification where supported by the installation workflow. 5. Update dependencies through a controlled review process that includes vulnerability scanning and changelog inspection. 6. Configure dependency resolution to use trusted package indexes only and reject unexpected alternate sources. 7. Periodically rebuild the locked environment and audit both direct and transitive dependencies for known vulnerabilities. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (4)

Lp3

Medium
Category
MCP Least Privilege
Confidence
91% confidence
Finding
The skill appears to perform network-backed transcription via an external Qwen ASR demo service, but it does not declare any explicit tool scope or permissions. This reduces transparency and weakens policy enforcement, making it easier for a user or host system to invoke a skill with outbound network behavior that was not clearly disclosed or constrained.

Missing User Warnings

Medium
Confidence
97% confidence
Finding
The skill description says 'No configuration or API key required' and describes transcription functionality, but it does not warn that user audio is sent to an external demo service. Audio often contains sensitive personal or business information, so undisclosed third-party transmission creates a meaningful privacy and consent risk in this context.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The skill uploads user-provided audio to an external third-party service for transcription, but the code provides no explicit user-facing notice or consent step before transmitting potentially sensitive voice data off-device. In a voice-message transcription skill, this is especially risky because audio commonly contains personal, confidential, or biometric information, so silent exfiltration to a remote endpoint creates a real privacy and compliance issue.

Natural-Language Policy Violations

Low
Confidence
73% confidence
Finding
The transcribe function defaults the language parameter to "auto", causing the service to infer language unless the user explicitly overrides it. This can conflict with a policy requiring explicit user language or locale choice rather than silent automatic selection.

Static analysis

No suspicious patterns detected.