Back to skill

Security audit

Uydi Voice Design & Clone

Security checks for vulnerabilities and agentic risk

Overview

The skill mostly matches its voice-generation purpose, but it needs review because a configurable service URL can redirect login and uploaded voice/text data without strong safeguards.

Install only through a trusted, versioned ClawHub/source path rather than the unpinned npx command. Do not set UYDI_BASE_URL unless you intentionally trust that deployment, because login, voice recordings, scripts, project data, and account actions will go there. Confirm the target account, credit cost, and exact voice or project ID before running paid or delete commands.

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/uydi.mjs:13
Finding
Unrestricted Service Origin Can Redirect OAuth and Sensitive Voice Data<![CDATA[ ## Vulnerability Details **File Location**: `scripts/uydi.mjs:13`, `scripts/uydi.mjs:25-36`, `scripts/uydi.mjs:55` **Vulnerability Type**: Unvalidated security-sensitive service endpoint **Risk Level**: Medium ### Vulnerable Code ```js const BASE_URL = (process.env.UYDI_BASE_URL || 'https://uydi.com').replace(/\/+$/, ''); ``` ```js function loadToken() { try { const data = JSON.parse(readFileSync(CRED_FILE, 'utf8')); if (data.baseUrl === BASE_URL && data.accessToken) return data.accessToken; } catch {} return null; } function saveToken(accessToken) { mkdirSync(CRED_DIR, { recursive: true, mode: 0o700 }); writeFileSync( CRED_FILE, JSON.stringify({ baseUrl: BASE_URL, accessToken, savedAt: new Date().toISOString() }, null, 2), { mode: 0o600 } ); } ``` ```js const res = await fetch(`${BASE_URL}${path}`, { method, headers, body }); ``` ### Technical Analysis `UYDI_BASE_URL` controls the origin used for OAuth authorization, token exchange, authenticated API operations, voice-sample uploads, synthesis text, and audio downloads. The value is accepted without validating its scheme, hostname, URL credentials, or trust status. This functionality is documented as supporting development and self-hosted deployments, but its implementation does not enforce HTTPS or require explicit confirmation before transmitting sensitive information to a non-default origin. A maliciously modified process environment can therefore redirect the entire workflow to an attacker-controlled server. The credential storage itself follows appropriate local file permissions: the credential directory is created with mode `0700`, and the credential file is written with mode `0600`. The application also binds a stored token to its corresponding `baseUrl`, so changing the environment after a legitimate Uydi login does not directly cause the existing `uydi.com` token to be sent to another host. Nevertheless, a substituted origin can conduct a deceptive O ...[truncated 1777 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Parse the configured endpoint with `new URL()` and reject malformed URLs. 2. Allow `https://uydi.com` by default and maintain an explicit allowlist for approved production origins. 3. Reject non-HTTPS endpoints unless a dedicated development-only option explicitly permits loopback addresses such as `http://127.0.0.1`. 4. Reject URLs containing embedded usernames or passwords. 5. Require interactive confirmation before authenticating with or uploading data to a non-default origin. Display the normalized scheme, hostname, and port. 6. Consider separating production and development modes so an ambient environment variable cannot silently redirect security-sensitive traffic. 7. Update the documentation to clarify that OAuth approval occurs on the configured deployment, not necessarily on `uydi.com`. 8. Preserve the current binding between stored tokens and their normalized service origins. ]]>

T08 · Insecure Dependencies

Warning
Location
README.md:10
Finding
Unpinned npx Installer Introduces Mutable Supply-Chain Execution<![CDATA[ ## Vulnerability Details **File Location**: `README.md:10-16` **Vulnerability Type**: Unpinned third-party package execution **Risk Level**: Medium ### Vulnerable Code ```markdown ### skills.sh Install directly from the public source repository into Codex, Claude Code, Cursor, Qoder, or another supported agent: ```bash npx skills add lvyinchao/uydi-voice-skill --skill uydi-voice ``` ``` ### Technical Analysis The documented installation command invokes `npx skills` without an exact package version or integrity constraint. If the package is not already available locally, `npx` can retrieve the current package version from its configured registry and execute its code with the user's privileges. Because package resolution is mutable, the code executed by future users may differ from the version reviewed when this Skill was audited. Registry compromise, maintainer-account compromise, malicious package updates, dependency compromise, or package-name confusion could therefore turn the installation step into arbitrary local code execution. The audited Skill script itself uses only Node.js built-in modules and does not dynamically retrieve or execute code. This finding is limited to the external installation method recommended by the README. ### Attack Path 1. An attacker compromises the registry package, its maintainer account, or one of its transitive dependencies, or causes package resolution to select an unsafe source. 2. A user follows the README and runs the unpinned `npx skills add ...` command. 3. `npx` downloads the currently resolved package and its dependencies. 4. Package entry points or lifecycle behavior execute with the invoking user's permissions. 5. The compromised installer reads or modifies files accessible to that user, including Agent configuration, installed Skills, source code, and user credentials. ### Impact Assessment Successful exploitation can provide arbitrary code execution with the privileges of the user running the ...[truncated 403 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Pin the installer to a specifically audited version, for example: ```bash npx --yes skills@&lt;exact-version&gt; add lvyinchao/uydi-voice-skill --skill uydi-voice ``` 2. Document the expected package publisher, registry, version, and cryptographic integrity value. 3. Provide a manual installation method that downloads a versioned archive without executing a package installer. 4. Publish SHA-256 checksums or signed release attestations for every archive and explain how to verify them before extraction. 5. Avoid recommending execution from an elevated shell. 6. Periodically audit the pinned installer version and update the documentation only after reviewing the new release and its dependency tree. ]]>
Vulnerability Patterns
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • 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
Findings (33)

Ae1

High
Category
analysis-evasion
Content
- All commands run as: `node scripts/uydi.mjs <command>` (relative to this skill directory).
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- All commands run as: `node scripts/uydi.mjs <command>` (relative to this skill directory).
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- All commands run as: `node scripts/uydi.mjs <command>` (relative to this skill directory).
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- All commands run as: `node scripts/uydi.mjs <command>` (relative to this skill directory).
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- All commands run as: `node scripts/uydi.mjs <command>` (relative to this skill directory).
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- All commands run as: `node scripts/uydi.mjs <command>` (relative to this skill directory).
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- All commands run as: `node scripts/uydi.mjs <command>` (relative to this skill directory).
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- All commands run as: `node scripts/uydi.mjs <command>` (relative to this skill directory).
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- All commands run as: `node scripts/uydi.mjs <command>` (relative to this skill directory).
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- All commands run as: `node scripts/uydi.mjs <command>` (relative to this skill directory).
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- All commands run as: `node scripts/uydi.mjs <command>` (relative to this skill directory).
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- All commands run as: `node scripts/uydi.mjs <command>` (relative to this skill directory).
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- All commands run as: `node scripts/uydi.mjs <command>` (relative to this skill directory).
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- All commands run as: `node scripts/uydi.mjs <command>` (relative to this skill directory).
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- All commands run as: `node scripts/uydi.mjs <command>` (relative to this skill directory).
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- All commands run as: `node scripts/uydi.mjs <command>` (relative to this skill directory).
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- All commands run as: `node scripts/uydi.mjs <command>` (relative to this skill directory).
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- All commands run as: `node scripts/uydi.mjs <command>` (relative to this skill directory).
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- All commands run as: `node scripts/uydi.mjs <command>` (relative to this skill directory).
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- All commands run as: `node scripts/uydi.mjs <command>` (relative to this skill directory).
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- All commands run as: `node scripts/uydi.mjs <command>` (relative to this skill directory).
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- All commands run as: `node scripts/uydi.mjs <command>` (relative to this skill directory).
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- All commands run as: `node scripts/uydi.mjs <command>` (relative to this skill directory).
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- All commands run as: `node scripts/uydi.mjs <command>` (relative to this skill directory).
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Credential Access

High
Category
Privilege Escalation
Content
const BASE_URL = (process.env.UYDI_BASE_URL || 'https://uydi.com').replace(/\/+$/, '');
const CLIENT_ID = 'uydi-skill';
const CRED_DIR = join(homedir(), '.uydi');
const CRED_FILE = join(CRED_DIR, 'credentials.json');
const CALLBACK_TIMEOUT_MS = 120_000;

// ---------- 凭证存取 ----------
Confidence
70% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Static analysis

Detected: suspicious.dangerous_exec

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
scripts/uydi.mjs:107