Back to skill

Security audit

Qwen Asr Skill

Security checks for vulnerabilities and agentic risk

Overview

The skill appears to be a real speech-to-text service, but it exposes under-documented network endpoints and a forced-alignment feature that its own documentation says is absent.

Review before installing. Run it only behind trusted local access or add authentication/signature checks, restrict webhook audio inputs to validated uploads or decoded audio bytes, remove or explicitly gate /align if this is meant to be the minimal edition, and pin dependencies/model revisions before deployment.

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
index.js:266
Finding

Unauthenticated Webhook Permits Server-Side Retrieval of Attacker-Controlled Audio Resources

Content
View full analysis
{ try { const { type, payload } = req.body; switch (type) { case 'audio.message': // Process an audio message from OpenClaw const { audio, userId, sessionId, language } = payload; const normalizedLanguage = language ? dialectMap.normalize(language) : null; const transcribeResult = await new Promise((resolve, reject) => { const options = { mode: 'json', pythonPath: process.env.PYTHON_PATH || 'python3', scriptPath: __dirname, args: [ audio, '--device', modelConfig.device, '--dtype', modelConfig.dtype, ], }; if (normalizedLanguage) { options.args.push('--language', normalizedLanguage); } PythonShell.run('asr.py', options, (err, results) => { if (err) reject(err); else resolve(results[0]); }); }); ``` ```python # asr.py def transcribe_audio( audio_input: str, language: Optional[str] = None, return_timestamps: bool = False, model_config: Optional[Dict[str, Any]] = None ) -> Dict[str, Any]: """ Args: audio_input: Audio path, URL, base64 data, or a numpy-array/sample-rate tuple """ results = model.transcribe( audio=audio_input, language=language, return_time_stamps=return_timestamps, ) ``` ### Technical Analysis The server listens on all network interfaces by default, while `/webhook` has no authentication, webhook signature verification, authorization ...[truncated 2541 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
requirements.txt:2
Finding

Mutable and Unlocked Third-Party Dependencies Create Supply-Chain Risk

Content
View full analysis
=2.0.0 qwen-asr>=0.0.6 transformers>=4.37.0 sentencepiece>=0.1.99 protobuf>=4.25.0 numpy>=1.24.0 ``` ```json { "dependencies": { "express": "^4.18.2", "multer": "^1.4.5-lts.1", "axios": "^1.6.0", "python-shell": "^5.0.0", "dotenv": "^16.3.1" }, "devDependencies": { "nodemon": "^3.0.1" } } ``` ```bash # SKILL.md installation instructions npm install pip install -r requirements.txt ``` ### Technical Analysis Python dependencies use unbounded minimum-version constraints, while Node.js dependencies use caret ranges. No package lockfile or Python hash-locked requirements were present in the audited directory. As a result, two installations of the same reviewed source can resolve to different third-party code. A future compromised, malicious, or unexpectedly incompatible package release could be selected without any corresponding modification to this project. Package installation and later imports execute third-party code with the privileges of the installing user or service account. This finding does not establish that any currently named package is malicious; it identifies the unsafe and non-reproducible resolution process. ### Attack Path 1. A user follows the documented installation procedure. 2. `npm install` resolves versions permitted by caret ranges because no committed lockfile fixes the dependency graph. 3. `pip install -r requirements.txt` resolves any available versions satisfying the broad `>=` constraints. 4. If an allowed release or transitive dependency is compromised, its installation hooks or runtime modules execute in the user's environment. 5. The compromised component obtains the same filesystem, network, and process privileges as the installer or running ASR ...[truncated 645 chars]
Remediation
View remediation

other

Warning
Location
index.js:180
Finding

Undocumented Forced-Alignment Endpoint Allows Remote Model Download and Resource Consumption

Content
View full analysis
{ let audioPath = null; let cleanupFiles = []; try { const { text, language, audio: audioBase64 } = req.body; if (!text) { return res.status(400).json({ success: false, error: 'Missing text parameter' }); } if (!language) { return res.status(400).json({ success: false, error: 'Missing language parameter' }); } const normalizedLanguage = dialectMap.normalize(language); if (req.file) { audioPath = req.file.path; cleanupFiles.push(audioPath); } else if (audioBase64) { if (typeof audioBase64 === 'string' && audioBase64.startsWith('data:audio')) { audioPath = audioBase64; } else { return res.status(400).json({ success: false, error: 'Invalid base64 audio data' }); } } else { return res.status(400).json({ success: false, error: 'Missing audio parameter' }); } const options = { mode: 'json', pythonPath: process.env.PYTHON_PATH || 'python3', scriptPath: __dirname, args: [ audioPath, '--model', modelConfig.modelName, ...[truncated 2827 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (30)

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill documentation explicitly states that the minimal version excludes forced alignment and timestamps (L12, L77-L80), yet the API section documents a timestamps request parameter (L48) as if timestamp output is supported. This is an active contradiction in the documented intent and exposed behavior description, not merely an omission.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

User-facing natural-language content in the module docstring, comments, argument descriptions, and CLI description is written only in Chinese, which imposes a language choice on users without offering an alternative. The policy allows fixed locale only when explicitly justified or when users are given a language/locale choice, neither of which is present here.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
85% confidence
Finding

The code passes user-controlled audio_input directly to model.transcribe, and the CLI explicitly advertises that the input may be a file path or URL. If the underlying model/library resolves URLs, this can trigger unexpected outbound network access, enabling SSRF-like behavior, metadata endpoint access, or unintended data exfiltration in environments where the skill runs with network reachability. In an ASR skill, accepting remote audio can be legitimate, but doing so without validation, allowlisting, or user-facing disclosure makes the behavior risky.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
82% confidence
Finding

The /align endpoint receives both audio and text, then passes them to a Python transcription/alignment process. This is a safety- and privacy-relevant data-processing action, but the code provides no user-facing warning, confirmation, or explanatory documentation in this file about processing potentially sensitive speech or transcript content.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
86% confidence
Finding

The /webhook endpoint accepts audio payloads and forwards them into the transcription pipeline, which is a privacy-relevant operation involving user data. While there is technical processing logic, this code path contains no user-facing disclosure, confirmation, or explanatory comment indicating that incoming audio content will be processed and transformed into text.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The package description is written entirely in Chinese, and the skill metadata also presents user-facing descriptions in Chinese without any indication that users can choose another language. This can violate language/locale policy when a skill imposes a specific language by default rather than offering an opt-in or documenting a justified regional constraint.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The OpenClaw skill description is user-facing metadata and is entirely in Chinese, but the manifest does not state that the skill is limited to a Chinese-language environment or offer alternative locales. That creates a natural-language policy concern because the skill appears to force one language without user opt-in.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

This code file contains user-facing comments and console output entirely in Chinese, such as the script description and all test status messages. Under the policy, forcing a specific language without user opt-in is a natural-language locale violation unless the constraint is explicitly documented and justified.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
87% confidence
Finding

This markdown file describes a network-affecting behavior: the skill automatically downloads about 6GB of model weights from Hugging Face on first run. While the behavior is mentioned under privacy notes, it is not presented as a user-facing warning in the installation or usage flow, so users may not expect the network transfer and disk impact before enabling the skill.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
97% confidence
Finding

This Python file contains its top-level documentation entirely in Chinese, and later user-facing print messages are also Chinese-only. For a general-purpose CPU optimization skill, that imposes a specific language on users without offering a choice or documenting a justified region-specific scope.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
93% confidence
Finding

Using a caret range for express allows installation of newer semver-compatible releases that may change over time, reducing build reproducibility and weakening supply-chain assurance. In a network-exposed skill, drifting dependency resolution can unexpectedly introduce vulnerable or behavior-changing versions during install or deployment.

Content

Scanner excerpt · package.json (reported line 23)May include surrounding context.

json
"author": "OpenClaw Team",
  "license": "Apache-2.0",
  "dependencies": {
    "express": "^4.18.2",
    "multer": "^1.4.5-lts.1",
    "axios": "^1.6.0",
    "python-shell": "^5.0.0",

Unverifiable Dependency: express has 5 known advisory(ies) (CVE-2024-10491 (Express ressource injection); CVE-2014-6393 (No Charset in Content-Type Header in express); CVE-2024-9266 (Express Open Redirect vulnerability) +2 more), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Content

No source excerpt is available for this finding.

Unverifiable Dependency: multer has 13 known advisory(ies) (CVE-2026-5038 (Multer vulnerable to Denial of Service via incomplete cleanup of aborted uploads); CVE-2025-47935 (Multer vulnerable to Denial of Service via memory leaks from unclosed streams); CVE-2025-47944 (Multer vulnerable to Denial of Service from maliciously crafted requests) +10 more), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
94% confidence
Finding

Using an unpinned axios version permits dependency drift, which is risky because HTTP client libraries frequently receive security fixes for SSRF, redirect, and parsing issues. If this skill fetches remote resources or communicates with external services, a silently upgraded or downgraded transitive set can alter trust boundaries unexpectedly.

Content

Scanner excerpt · package.json (reported line 25)May include surrounding context.

json
"dependencies": {
    "express": "^4.18.2",
    "multer": "^1.4.5-lts.1",
    "axios": "^1.6.0",
    "python-shell": "^5.0.0",
    "dotenv": "^16.3.1"
  },

Unverifiable Dependency: axios has 16 known advisory(ies) (CVE-2026-44494 (axios Vulnerable to Full Man-in-the-Middle via Prototype Pollution Gadget in `co); CVE-2026-44495 (axios Vulnerable to Credential Theft and Response Hijacking via Prototype Pollut); CVE-2025-62718 (Axios has a NO_PROXY Hostname Normalization Bypass that Leads to SSRF) +13 more), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
91% confidence
Finding

python-shell bridges Node.js and Python execution, so version drift here can affect command execution behavior, argument handling, and process-management semantics. While the manifest alone does not prove exploitation, leaving this package unpinned increases supply-chain uncertainty in a component that often sits near code-execution boundaries.

Content

Scanner excerpt · package.json (reported line 26)May include surrounding context.

json
"express": "^4.18.2",
    "multer": "^1.4.5-lts.1",
    "axios": "^1.6.0",
    "python-shell": "^5.0.0",
    "dotenv": "^16.3.1"
  },
  "devDependencies": {

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
88% confidence
Finding

An unpinned dotenv dependency creates non-deterministic builds and can introduce unexpected runtime configuration parsing changes. The direct security impact is limited, but configuration-loading libraries affect secrets handling and startup behavior, so exact version control is preferable.

Content

Scanner excerpt · package.json (reported line 27)May include surrounding context.

json
"multer": "^1.4.5-lts.1",
    "axios": "^1.6.0",
    "python-shell": "^5.0.0",
    "dotenv": "^16.3.1"
  },
  "devDependencies": {
    "nodemon": "^3.0.1"

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Content

Scanner excerpt · package.json (reported line 30)May include surrounding context.

json
"dotenv": "^16.3.1"
  },
  "devDependencies": {
    "nodemon": "^3.0.1"
  },
  "openclaw": {
    "skillId": "qwen-asr-skill",

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
81% confidence
Finding

This requirements file contains a natural-language comment in Chinese ('Python 依赖(极简版 - 仅 0.6B 模型)'). Under the policy, language/locale constraints should not be forced without user opt-in; the file provides no indication of language choice or justification.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
91% confidence
Finding

Using a lower-bound-only version specifier for torch allows future installs to resolve to different releases over time, including versions with incompatible behavior or known vulnerabilities. In ML stacks this increases supply-chain risk and makes it difficult to verify whether the deployed version is affected by published advisories.

Content

Scanner excerpt · requirements.txt (reported line 2)May include surrounding context.

text
# Python 依赖(极简版 - 仅 0.6B 模型)
torch>=2.0.0
qwen-asr>=0.0.6
transformers>=4.37.0
sentencepiece>=0.1.99

Unverifiable Dependency: torch has 16 known advisory(ies) (CVE-2025-2953 (PyTorch susceptible to local Denial of Service); CVE-2022-45907 (PyTorch vulnerable to arbitrary code execution); CVE-2025-32434 (PyTorch: `torch.load` with `weights_only=True` leads to remote code execution) +13 more), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
83% confidence
Finding

torch has multiple published advisories, and because the manifest does not pin a specific version, it is impossible to determine whether deployed environments are exposed. In this context, the risk is amplified because ML frameworks often process untrusted model artifacts and serialized data.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
88% confidence
Finding

The qwen-asr dependency is not pinned, so installations may pull different package versions over time. That weakens reproducibility and can introduce vulnerable or malicious package updates into the environment without code changes in the skill itself.

Content

Scanner excerpt · requirements.txt (reported line 3)May include surrounding context.

text
# Python 依赖(极简版 - 仅 0.6B 模型)
torch>=2.0.0
qwen-asr>=0.0.6
transformers>=4.37.0
sentencepiece>=0.1.99
protobuf>=4.25.0

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
91% confidence
Finding

An unpinned transformers dependency permits uncontrolled upgrades to versions that may contain security flaws or breaking behavior. Given this library's large attack surface and plugin/model-loading features, version drift materially increases supply-chain and exposure risk.

Content

Scanner excerpt · requirements.txt (reported line 4)May include surrounding context.

text
# Python 依赖(极简版 - 仅 0.6B 模型)
torch>=2.0.0
qwen-asr>=0.0.6
transformers>=4.37.0
sentencepiece>=0.1.99
protobuf>=4.25.0
numpy>=1.24.0

Unverifiable Dependency: transformers has 16 known advisory(ies) (CVE-2023-2800 (transformers has Insecure Temporary File); CVE-2026-4372 (HuggingFace transformers vulnerable to remote code execution); CVE-2025-3933 (Transformers is vulnerable to ReDoS attack through its DonutProcessor class) +13 more), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
86% confidence
Finding

transformers has known advisories and is left unpinned, so the environment may resolve to a vulnerable release without visibility. This is more dangerous in an AI skill because model-loading, tokenization, and file-handling features can expand the attack surface for malicious inputs or artifacts.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
86% confidence
Finding

sentencepiece specified only with a minimum version means builds are not reproducible and may consume future releases with unresolved security issues. While not automatically exploitable by itself, this is a real dependency hygiene weakness.

Content

Scanner excerpt · requirements.txt (reported line 5)May include surrounding context.

text
torch>=2.0.0
qwen-asr>=0.0.6
transformers>=4.37.0
sentencepiece>=0.1.99
protobuf>=4.25.0
numpy>=1.24.0

Static analysis

No suspicious patterns detected.