Back to skill

Security audit

best-practices

Security checks for vulnerabilities and agentic risk

Overview

The skill is mostly Remotion documentation, but it should be reviewed because one transcription example can upload local audio files and filenames to a third-party API without clear consent or limits.

Review before installing if you work with private recordings or regulated media. Prefer the local Whisper options for sensitive audio, and only use the SkillBoss cloud example after confirming the destination, consent, file scope, size limits, and data-handling terms. Use locked dependencies or pinned package versions when copying the install commands.

Vulnerability Patterns
  • 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
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
Findings (1)

other

Warning
Location
rules/transcribe-captions.md:21
Finding
Unrestricted Upload of Local Audio and Filename Metadata to a Third-Party Service<![CDATA[ ## Vulnerability Details **File Location**: `rules/transcribe-captions.md:21-42` **Vulnerability Type**: Sensitive Data Disclosure to a Third-Party Service **Risk Level**: Medium ### Vulnerable Code ```typescript import * as fs from 'fs'; const SKILLBOSS_API_KEY = process.env.SKILLBOSS_API_KEY; const API_BASE = 'https://api.skillbossai.com/v1'; async function transcribeAudio(audioFilePath: string): Promise<string> { const audioData = fs.readFileSync(audioFilePath).toString('base64'); const filename = audioFilePath.split('/').pop() ?? 'audio.mp3'; const r = await fetch(`${API_BASE}/pilot`, { method: 'POST', headers: { 'Authorization': `Bearer ${SKILLBOSS_API_KEY}`, 'Content-Type': 'application/json', }, body: JSON.stringify({ type: 'stt', inputs: { audio_data: audioData, filename }, }), }); const result = await r.json(); return result.result.text; } ``` ### Technical Analysis The documented implementation accepts a local filesystem path, reads the entire referenced file using the privileges of the executing process, Base64-encodes its contents, and transmits both the contents and basename to `https://api.skillbossai.com/v1/pilot`. Base64 is only a transport encoding and does not provide confidentiality. The resulting request discloses the original audio to a third-party cloud service. Audio can contain confidential conversations, personal data, authentication phrases, customer information, or other regulated content. The filename may independently reveal project names, identities, case numbers, or other sensitive metadata. The example does not include: - Explicit, per-file consent before uploading data. - Validation that the path belongs to an approved media directory. - Protection against paths or symbolic links resolving to unintended files. - Audio MIME type or extension validation. - File-size or upload-volume limits. - A privacy, retention, or data-processing notice for the exter ...[truncated 2499 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. **Use local transcription by default** - Prefer `@remotion/install-whisper-cpp` or `@remotion/whisper-web`. - Treat cloud transcription as an explicit opt-in rather than the default recommendation. 2. **Obtain informed consent** - Before uploading, clearly identify the destination service and the data that will be sent. - Require explicit confirmation for each file or approved batch. - Document applicable retention, privacy, and data-processing terms. 3. **Restrict filesystem access** - Resolve the supplied path with `fs.realpath()`. - Require the resolved path to remain inside a configured media directory. - Reject directory traversal and symbolic links that escape the approved directory. - Do not accept arbitrary filesystem paths directly from untrusted users. 4. **Validate the selected file** - Permit only expected audio extensions and verified media types. - Enforce conservative file-size and duration limits before reading or uploading. - Prefer streaming or bounded reads for large files. 5. **Minimize disclosed metadata** - Do not send the original basename unless the service requires it. - If a name is required, replace it with a generated neutral identifier and a validated extension. - Avoid including local directory information in errors or telemetry. 6. **Harden network behavior** - Keep the destination on a strict HTTPS hostname allowlist. - Add an `AbortController` timeout. - Check `response.ok` before parsing the response. - Validate the response against an expected schema. - Do not automatically follow redirects to unapproved hosts. 7. **Handle credentials safely** - Fail closed when `SKILLBOSS_API_KEY` is missing. - Keep the key in a secret manager or protected environment variable. - Never expose the bearer token in client-side bundles, logs, or error messages. - Use a narrowly scoped credential where the provider supports one. 8. ** ...[truncated 249 chars]
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
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (22)

Rp1

Medium
Category
MCP Rug Pull
Confidence
93% confidence
Finding
The documentation instructs users to run `npx remotion add @remotion/three` without pinning an explicit package version. `npx` may fetch the latest CLI or a compromised newly-published version at execution time, which creates a supply-chain risk if the package or dependency chain is tampered with. In this context, the skill is directly telling users to execute the command, so the risk is more actionable than a passive mention.

External Transmission

Medium
Category
Data Exfiltration
Content
props,
  abortSignal,
}) => {
  const data = await fetch(`https://api.example.com/video/${props.videoId}`, {
    signal: abortSignal,
  }).then((res) => res.json());
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Unbounded Resource Access

Medium
Category
Excessive Agency
Content
Control what happens when the animation finishes:

```tsx
// Loop indefinitely (default)
<AnimatedImage src={staticFile("animation.gif")} width={500} height={500} loopBehavior="loop" />

// Play once, show final frame
Confidence
75% confidence
Finding
Skill allows unbounded resource consumption (API calls, storage, compute). Without rate limits or quotas, a compromised or misbehaving agent can cause denial-of-service or cost overruns.

Rp1

Medium
Category
MCP Rug Pull
Confidence
91% confidence
Finding
The documentation instructs users to run `npx remotion add @remotion/lottie` without pinning the package version. Because `npx` resolves and executes the current package from the registry, users may get different code over time or a compromised upstream release, creating a supply-chain execution risk. In a developer skill, this is more dangerous because it is framed as a copy-paste installation command that may be followed directly.

Rp1

Medium
Category
MCP Rug Pull
Confidence
70% confidence
Finding
npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.

Rp1

Medium
Category
MCP Rug Pull
Confidence
70% confidence
Finding
npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.

Rp1

Medium
Category
MCP Rug Pull
Confidence
70% confidence
Finding
npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.

Rp1

Medium
Category
MCP Rug Pull
Confidence
70% confidence
Finding
npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.

Rp1

Medium
Category
MCP Rug Pull
Confidence
70% confidence
Finding
npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.

Rp1

Medium
Category
MCP Rug Pull
Confidence
70% confidence
Finding
npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.

Rp1

Medium
Category
MCP Rug Pull
Confidence
70% confidence
Finding
npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.

Rp1

Medium
Category
MCP Rug Pull
Confidence
70% confidence
Finding
npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.

Rp1

Medium
Category
MCP Rug Pull
Confidence
70% confidence
Finding
npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.

Missing User Warnings

Medium
Confidence
93% confidence
Finding
The example reads a local audio file, base64-encodes it, and sends the full contents to a third-party cloud API for transcription without any explicit privacy warning, consent guidance, or data-handling notice. In a captions/transcription skill, this is contextually plausible and likely well-intentioned, but it can still cause users to transmit sensitive voice recordings or embedded personal data off-device without realizing the privacy implications.

External Transmission

Medium
Category
Data Exfiltration
Content
import * as fs from 'fs';

  const SKILLBOSS_API_KEY = process.env.SKILLBOSS_API_KEY;
  const API_BASE = 'https://api.skillbossai.com/v1';

  async function transcribeAudio(audioFilePath: string): Promise<string> {
    const audioData = fs.readFileSync(audioFilePath).toString('base64');
Confidence
86% confidence
Finding
The code hardcodes a remote API base URL and sends user-provided audio data to that external endpoint, creating an external data transmission path. While this is expected for a cloud STT example, the skill does not pair it with any warning, trust-boundary explanation, or safeguards around what data should or should not be uploaded.

Rp1

Medium
Category
MCP Rug Pull
Confidence
88% confidence
Finding
The documentation instructs users to run `npx remotion add @remotion/transitions` without pinning the package version. `npx` resolves and executes the package version available at runtime, which can lead to unintended execution of newer or compromised releases or dependency-chain attacks if the package or its distribution path is tampered with. In a documentation skill, this is more dangerous because readers may copy-paste the command directly into a shell.

Vague Triggers

Low
Confidence
89% confidence
Finding
The phrase "Use this skills whenever you are dealing with Remotion code" is a broad activation condition for a markdown skill description. It does not define narrower trigger scope, exclusions, or negative examples, which could cause the skill to be invoked in loosely related contexts.

Missing User Warnings

Low
Confidence
88% confidence
Finding
This markdown file includes an example that fetches data from `props.dataUrl` before rendering, which can transmit user- or system-supplied information to an external endpoint. The surrounding description explains the mechanism and abort behavior but does not warn users about privacy or network effects.

Missing User Warnings

Low
Confidence
88% confidence
Finding
The guidance recommends `@remotion/google-fonts` without noting that using Google Fonts may trigger network access to an external service and pull third-party resources at render/setup time. In privacy-sensitive, offline, or tightly controlled build environments, this omission can lead to unexpected data egress, policy violations, or non-reproducible builds.

Missing User Warnings

Low
Confidence
88% confidence
Finding
The documentation explicitly recommends loading remote images directly but does not mention that doing so causes outbound network requests during rendering and may expose IP address, request metadata, or create reliability/privacy issues if third-party assets change or disappear. In a developer skill, this is a real but low-severity issue because users may copy the pattern without understanding the privacy and supply-chain implications of external dependencies.

Vague Triggers

Low
Confidence
88% confidence
Finding
The file description and tags describe a general topic area ('Sequencing patterns for Remotion' and tags like 'sequence', 'series', 'timing') but do not specify concrete invocation phrases, scope boundaries, or exclusion conditions. In a manifest-like header, this can make it unclear when this skill should activate versus when a more general Remotion or animation skill should apply.

Missing User Warnings

Low
Confidence
85% confidence
Finding
This markdown file includes an example of embedding a remote video via an HTTPS URL, which implies network access and fetching external content. The surrounding description does not warn that using remote sources may contact third-party servers or have privacy/network implications.

Static analysis

No suspicious patterns detected.