Back to skill

Security audit

Gipformer ASR

Security checks for vulnerabilities and agentic risk

Overview

This is a coherent local Vietnamese transcription skill, but its unauthenticated, unbounded server and mutable dependency/model downloads deserve review before installation.

Install only if you trust the Python packages and remote model sources, and run the service bound to 127.0.0.1 unless you add authentication, request-size limits, duration limits, and rate/concurrency controls. Avoid submitting sensitive audio unless you understand that the audio is sent to the local server process for decoding and transcription.

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

Error
Location
scripts/serve.py:301
Finding

Unauthenticated and Unbounded Transcription Endpoint Enables Resource Exhaustion

Content
View full analysis
tuple[np.ndarray, int]: """Decode base64-encoded audio to float32 mono 16kHz numpy array. Supports WAV, FLAC, OGG, MP3 (via soundfile) and M4A (via ffmpeg). """ raw = base64.b64decode(audio_b64) if len(raw) == 0: raise ValueError("Empty audio data") ``` ```python @app.post("/transcribe", response_model=TranscribeResponse) async def transcribe(req: TranscribeRequest): """Transcribe audio of any length. The server automatically chunks long audio using VAD, infers each chunk via the batching engine, and merges the results into a single transcript. """ engine: BatchingEngine = _state["engine"] t0 = time.time() try: samples, sr = decode_audio_b64(req.audio_b64) except Exception as e: raise HTTPException(status_code=400, detail=f"Invalid audio: {e}") duration = len(samples) / sr # Chunk with VAD (short audio returns a single chunk) chunks = chunk_audio_samples(samples, sr) # Infer chunks in batches of MAX_BATCH_CHUNKS all_texts = [] for i in range(0, len(chunks), MAX_BATCH_CHUNKS): batch = chunks[i : i + MAX_BATCH_CHUNKS] tasks = [engine.submit(c.samples, c.sample_rate) for c in batch] texts = await asyncio.gather(*tasks) all_texts.extend(texts) ``` ```python parser.add_argument("--host", default="127.0.0.1", help="Bind host (default ...[truncated 2718 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
requirements.txt:4
Finding

Unpinned Dependencies and Model Revisions Create Supply-Chain Risk

Content
View full analysis
=1.10.0 # ONNX runtime for Zipformer-RNNT model huggingface_hub>=0.20.0 # Download model from HuggingFace Hub numpy>=1.20.0 # Numerical computing soundfile>=0.12.0 # Audio I/O (WAV, FLAC, OGG, MP3) # System dependency: ffmpeg (required for M4A/AAC support) # Serving fastapi>=0.100.0 # HTTP API framework uvicorn>=0.20.0 # ASGI server pydantic>=1.10.0 # Request/response validation # Audio chunking (VAD) silero-vad>=5.0 # Voice Activity Detection (lightweight ONNX) onnxruntime>=1.16.1 # ONNX runtime backend for Silero VAD # Client requests>=2.28.0 # HTTP client for transcribe.py ``` ```python # Download ASR model print(f"Downloading {args.quantize} model from {REPO_ID}...") files = ONNX_FILES[args.quantize] paths = {} for key, filename in files.items(): paths[key] = hf_hub_download(repo_id=REPO_ID, filename=filename) paths["tokens"] = hf_hub_download(repo_id=REPO_ID, filename="tokens.txt") print("Model downloaded.") ``` ```python from silero_vad import load_silero_vad, get_speech_timestamps model = load_silero_vad(onnx=True) _silero_cache = (model, get_speech_timestamps) return _silero_cache ``` ### Technical Analysis All Python dependencies use open-ended minimum-version constraints. A future installation can therefore resolve to package versions that were not present or reviewed when the Skill was audited. No dependency hashes are provided to verify downloaded distributions. The ASR artifacts are fetched from Hugging Face without a pinned `revision`. Consequently, the files associated with the repository's default revision can c ...[truncated 2198 chars]
Remediation
View remediation
=` constraints with reviewed exact versions. - Generate a lock file appropriate to the supported Python versions and platforms. 2. **Require package hashes** - Use a hash-locked requirements file and install with: ```bash pip install --require-hashes -r requirements.lock ``` - Obtain packages only from explicitly configured trusted indexes. 3. **Pin Hugging Face revisions** - Supply an immutable reviewed commit hash: ```python hf_hub_download( repo_id=REPO_ID, filename=filename, revision="", ) ``` 4. **Verify model integrity** - Maintain expected SHA-256 hashes for every ONNX and token file. - Verify each downloaded file before passing it to the inference runtime. - Fail closed if any artifact does not match its expected digest. 5. **Control VAD artifacts** - Pin the exact `silero-vad` version. - Determine which model artifact that version loads and pin or package that artifact explicitly. - Verify the VAD model using a project-controlled digest. 6. **Use reviewed artifact promotion** - Download dependencies and models in a controlled build environment. - Scan and review them before promotion to an internal package or artifact repository. - Deploy only promoted immutable artifacts rather than downloading mutable content during production startup. 7. **Reduce execution privileges** - Install and run the service as a dedicated non-privileged account. - Avoid installing dependencies as root. - Restrict filesystem and network access available to the inference process. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Behavioral ASTexec() Call, eval() Call, Dynamic Import
Findings (18)

Possible Typosquatting: 'uvicorn' resembles popular package 'gunicorn'

High
Category
Supply Chain
Confidence
70% confidence
Finding

Package name closely resembles a popular package, suggesting possible typosquatting. Attackers publish malicious packages with similar names to trick developers into installing them.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
96% confidence
Finding

The skill documents capabilities that involve shell execution, local server startup, network access, and writing output files, but it does not declare any explicit tool scope or permission boundaries. This increases the chance that an agent could invoke the skill with broader access than users expect, reducing transparency and weakening least-privilege controls.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The activation criteria include generic phrases like 'transcribe this audio,' which are common user requests and may cause the skill to trigger too broadly. Over-broad activation can lead to unintended routing of user content into this skill, including private audio, without sufficiently clear user intent for this specific server-backed workflow.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The skill does not clearly warn users that their audio will be transmitted to a locally running transcription server over HTTP. Even though the endpoint is localhost, sensitive voice content is still being sent to another service boundary, and users should be informed before private data is processed this way.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · SKILL.md (reported line 67)May include surrounding context.

bash
# Transcribe (any length, any format)
curl -X POST http://127.0.0.1:8910/transcribe \
  -H "Content-Type: application/json" \
  -d "{\"audio_b64\": \"$(base64 -i audio.wav)\"}"

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

This markdown file describes a /transcribe endpoint that requires uploading audio content, which can contain sensitive personal or conversational data. Under the markdown-file criteria for missing user warnings, the description should disclose privacy or data-handling implications, but no such warning is present in the endpoint description or request-body section.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
86% confidence
Finding

The server feeds attacker-supplied audio into an external ffmpeg decoder process. While this is not command injection, media parsers like ffmpeg have a long history of memory-safety and parsing bugs, so exposing them directly to untrusted inputs increases the attack surface and can lead to crashes or, in worst cases, code execution in the service context.

Content

No source excerpt is available for this finding.

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
70% confidence
Finding

subprocess module calls execute external commands. Without careful input validation, this enables command injection.

Content

Scanner excerpt · scripts/serve.py (reported line 204)May include surrounding context.

python
tmp.write(raw)
        tmp_path = tmp.name
    try:
        result = subprocess.run(
            [
                "ffmpeg", "-y", "-i", tmp_path,
                "-f", "wav", "-ar", str(SAMPLE_RATE), "-ac", "1",

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
86% confidence
Finding

This code exposes an HTTP /transcribe endpoint that receives base64-encoded audio and processes it server-side, which necessarily transmits user-provided audio data over the network. While the endpoint is documented functionally, there is no user-facing warning in the code comments, docstring, or visible response/logging that audio content is being sent to and handled by the server.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
80% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · scripts/transcribe.py (reported line 45)May include surrounding context.

python
with open(file_path, "rb") as f:
        audio_b64 = base64.b64encode(f.read()).decode("ascii")

    resp = requests.post(
        f"{server_url}/transcribe",
        json={"audio_b64": audio_b64},
        timeout=600,

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
72% confidence
Finding

The natural-language description repeatedly states that the skill performs Vietnamese speech recognition only, without offering a language choice or explaining the locale restriction as a policy-justified regional tool. This can be interpreted as a language/locale constraint that is imposed without user opt-in.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
70% confidence
Finding

The only transcription example returns Vietnamese text, which could imply the skill is fixed to a specific language or locale. Because there is no accompanying note that the API supports multiple languages or is intentionally Vietnamese-specific, this may conflict with language/locale policy expectations requiring choice or clear justification.

Content

No source excerpt is available for this finding.

Unverifiable Dependency: numpy has 16 known advisory(ies) (CVE-2014-1859 (Numpy arbitrary file write via symlink attack); CVE-2021-41495 (NumPy NULL Pointer Dereference); CVE-2021-33430 (NumPy Buffer Overflow (Disputed)) +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.

Unverifiable Dependency: fastapi has 3 known advisory(ies) (CVE-2021-32677 (Cross-Site Request Forgery (CSRF) in FastAPI); CVE-2021-32677 (FastAPI is a web framework for building APIs with Python 3.6+ based on standard ); CVE-2024-24762 (FastAPI is a web framework for building APIs with Python 3.8+ based on standard )), 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: uvicorn has 4 known advisory(ies) (CVE-2020-7694 (Log injection in uvicorn); CVE-2020-7695 (HTTP response splitting in uvicorn); CVE-2020-7694 (This affects all versions of package uvicorn. The request logger provided by the) +1 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: pydantic has 4 known advisory(ies) (CVE-2021-29510 (Use of "infinity" as an input to datetime and date fields causes infinite loop i); CVE-2024-3772 (Pydantic regular expression denial of service); CVE-2021-29510 (Pydantic is a data validation and settings management using Python type hinting.) +1 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: requests has 16 known advisory(ies) (CVE-2014-1830 (Exposure of Sensitive Information to an Unauthorized Actor in Requests); CVE-2024-47081 (Requests vulnerable to .netrc credentials leak via malicious URLs); CVE-2024-35195 (Requests `Session` object does not verify requests after making first request wi) +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.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
84% confidence
Finding

The FastAPI application description states 'Vietnamese speech recognition,' which establishes a fixed language/locale behavior. In this file, the language constraint is not presented as an opt-in choice or documented as a justified region-specific limitation, so it can conflict with language/locale policy expectations.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.