Back to skill

Security audit

Voice-to-Protocol Transcriber

Security checks for vulnerabilities and agentic risk

Overview

The skill appears to be a local experiment note logger, but its voice-transcription claims do not match the code and it has avoidable file-write and dependency risks.

Review before installing. Treat this as a text-based protocol logger, not a working voice transcriber. Install only in an isolated environment, avoid running pip install -r requirements.txt until dependencies are cleaned up, choose a trusted save directory, and do not pass untrusted experiment names or record sensitive clinical/proprietary details without a retention plan.

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 (2)

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/main.py:161
Finding

Path Traversal Through the Experiment Name Allows Writes Outside the Save Directory

Content
View full analysis

Vulnerability Details

File Location: scripts/main.py, lines 161–166
Vulnerability Type: Path traversal and unrestricted file write
Risk Level: Medium

Vulnerable Code

python
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
filename_base = f"{self.experiment_name.replace(' ', '_')}_{timestamp}"

if self.output_format == "markdown":
    file_path = self.save_directory / f"{filename_base}.md"
    self._save_markdown(file_path)

Technical Analysis

The filename is derived from the user-controlled experiment_name, which is supplied through the --experiment command-line argument. The only transformation replaces spaces with underscores. Path separators, absolute paths, drive prefixes, and parent-directory components such as .. are not rejected.

When pathlib.Path joins a base directory with an absolute child path, the base directory is discarded. Relative traversal components can likewise cause the resolved destination to escape the intended save directory. The resulting path is subsequently opened in write mode by the selected save function.

Output extensions are appended by the application, and intermediate directories must already exist, but these restrictions do not prevent creation or replacement of matching files outside the configured directory.

Attack Path

  1. An attacker or untrusted caller invokes the script and controls --experiment.
  2. The attacker supplies an absolute or traversal-based name, such as /tmp/unauthorized or ../../tmp/unauthorized.
  3. save() incorporates that value into filename_base without filename sanitization or canonical path validation.
  4. The user issues the save or stop command.
  5. The script resolves the constructed path outside save_directory and opens it in write mode.
  6. A timestamped Markdown, JSON, or text file is created or replaced using the privileges of the process.

Impact Assessment

The vulnerability permits ...[truncated 553 chars]

Remediation
View remediation

Remediation Suggestions

  • Treat the experiment name strictly as a filename component rather than a path.
  • Reject absolute paths, path separators, drive prefixes, null characters, . components, and .. components.
  • Normalize the name to a conservative allowlist, such as letters, digits, underscores, and hyphens.
  • Resolve both the base directory and destination before writing, then verify that the destination remains beneath the resolved base directory.
  • Use exclusive file creation mode to prevent accidental replacement of existing files.
  • Generate a random or otherwise collision-resistant suffix instead of relying only on second-resolution timestamps.
  • Reject an empty filename after normalization.

Example hardening approach:

python
import re
import uuid

base_dir = self.save_directory.resolve()
safe_name = re.sub(r"[^A-Za-z0-9_-]+", "_", self.experiment_name).strip("_")

if not safe_name:
    raise ValueError("The experiment name does not contain a valid filename component")

filename = f"{safe_name}_{uuid.uuid4().hex}.md"
destination = (base_dir / filename).resolve()

if destination.parent != base_dir:
    raise ValueError("The output path is outside the configured save directory")

T08 · Insecure Dependencies

Warning
Location
requirements.txt:1
Finding

Unnecessary and Unpinned Packages Create a Dependency Supply-Chain Risk

Content
View full analysis

Vulnerability Details

File Location: requirements.txt, lines 1–3
Vulnerability Type: Dependency confusion and unpinned third-party dependencies
Risk Level: Medium

Vulnerable Code

text
dataclasses
enum
wave

Technical Analysis

The dependency file directs package installers to retrieve unpinned packages named dataclasses, enum, and wave from the configured package index.

enum and wave are names of Python standard-library modules. dataclasses is also part of the standard library in modern supported Python versions, although a backport may be appropriate for specific legacy versions. Installing registry packages under standard-library module names creates unnecessary dependency-confusion and module-shadowing exposure.

None of the entries is pinned to a reviewed version or protected by a cryptographic hash. Consequently, installation behavior can change without any modification to this repository. Package installation may also execute package build or installation logic under the privileges of the user running pip.

The project documentation separately lists speech and document-processing dependencies that do not match this file, further reducing confidence that these packages were deliberately selected and reviewed.

Attack Path

  1. A user follows the documented prerequisite and runs pip install -r requirements.txt.
  2. pip resolves the unpinned names against its configured package index or mirror.
  3. Third-party distributions are downloaded despite the application importing modules that are ordinarily supplied by Python itself.
  4. Package build or installation behavior executes in the installation environment.
  5. A compromised package release, unsafe private mirror, or dependency-confusion condition can introduce arbitrary third-party code before the Skill itself is run.

Impact Assessment

A malicious or compromised dependency could execute code with the permi ...[truncated 487 chars]

Remediation
View remediation

Remediation Suggestions

  • Remove enum and wave because the script uses the Python standard-library implementations.
  • Remove dataclasses when the minimum supported Python version includes it in the standard library.
  • If legacy Python support genuinely requires the dataclasses backport, apply an environment marker, pin an audited version, and require hashes.
  • Define and document a supported Python version to eliminate ambiguous backport requirements.
  • Regenerate the dependency file from actual runtime imports and reconcile it with the dependencies listed in SKILL.md.
  • Install dependencies inside an isolated virtual environment using a trusted package index.
  • Use hash-verified installation, for example with a reviewed lock file and pip install --require-hashes.
  • Add automated dependency scanning and periodic review of pinned package versions.
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (12)

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

The documented behavior materially overstates the skill's capabilities and understates its actual access patterns, claiming real-time voice transcription while also performing undeclared configuration reads and output writes. Security reviewers and users may grant trust or permissions based on the stated purpose, while the real implementation behaves differently, which is dangerous because it defeats informed consent and weakens policy enforcement.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
90% confidence
Finding

The skill documentation describes local file reads and writes, including configuration loading from the home directory and saving experiment records, but it declares no explicit tool scope such as permissions or allowed-tools. This creates a trust and review gap: operators cannot easily determine what filesystem access the skill requires, and hidden or broader-than-expected file access becomes harder to detect or constrain.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The documentation does not clearly warn users that voice transcription may capture sensitive spoken information and automatically save it to disk. In laboratory and clinical-adjacent settings, spoken notes can include proprietary research, patient-related details, or safety-sensitive observations, so silent persistence materially raises confidentiality and compliance risk.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The use case 'Any scenario requiring real-time step recording' is overly broad for a skill that captures and persists spoken content. Broad activation scope increases the chance the skill is used in inappropriate or sensitive contexts, including environments where confidential, regulated, or personal information may be recorded unintentionally.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The risk table claims there are no external API calls, yet elsewhere the document states speech recognition may require network connectivity, implying possible outbound data transfer. For a voice transcription tool used in lab settings, this inconsistency matters because spoken experimental details could be transmitted to third-party services without a clear disclosure of that risk.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The top-level documentation and CLI framing present the program as a voice transcription assistant, while the executable path only launches text mode. Misrepresenting operational behavior is dangerous because users may rely on unavailable hands-free features during experiments, leading to missing records or unsafe assumptions in an active lab environment.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
87% confidence
Finding

This code sets the default language to "zh-CN", and the interaction strings and command phrases are also Chinese by default. Under the policy, forcing a specific language without user opt-in is a natural-language policy concern, even though a CLI override exists, because the default behavior does not present a runtime choice or explicit opt-in.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The skill advertises voice-command recording and real-time transcription, but the implemented behavior is only a text-input loop. This is a deceptive capability mismatch that can mislead users and downstream systems into trusting the skill for hands-free lab documentation when it cannot perform the claimed function, potentially causing workflow, safety, or recordkeeping failures in a laboratory context.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
96% confidence
Finding

The configuration sets 'language' to 'zh-CN' by default, which imposes a specific locale unless the user discovers and changes it. This is a natural-language policy concern because the skill does not present language choice as an explicit opt-in in the primary description.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
60% confidence
Finding

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

Content

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

text
dataclasses
enum
wave

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
60% confidence
Finding

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

Content

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

text
dataclasses
enum
wave

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
60% confidence
Finding

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

Content

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

text
dataclasses
enum
wave

Static analysis

No suspicious patterns detected.