T09 · Insecure Skill Coding Practices
- Location
bin/file-asset.js:12- Finding
Arbitrary Local Files Can Be Uploaded as Image Assets
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This looks like a real VibeSKU CLI skill, but it needs review because it can upload local files, persist credentials, send them to a configurable server, and recommends unpinned auto-updates.
Install only if you trust VibeSKU and need this CLI. Before use, confirm every image/logo path is a non-sensitive product asset, avoid letting an agent choose paths automatically, keep VIBESKU_BASE_URL unset unless using a trusted HTTPS or localhost development server, protect ~/.vibesku/config.json, and review any skill update instead of allowing an automatic update from the upstream main branch.
bin/file-asset.js:12Arbitrary Local Files Can Be Uploaded as Image Assets
bin/config-store.js:33Credentials and Uploaded Files Can Be Sent to an Unrestricted or Plaintext Custom Base URL
references/versioning.md:40Automatic Update Guidance Trusts Mutable Upstream Content Without Integrity Pinning
Referenced artifact was not completely inspected
The CLI is bundled at `bin/vibesku.js` — self-contained Node.js script, zero dependencies (requires Node >= 18).
The skill recommends comparing with an upstream source and auto-updating itself before continuing a user task. Self-modification is dangerous because it changes the trusted execution surface at runtime, potentially introducing unreviewed code or prompt content from a remote source and bypassing prior validation of the installed skill.
- **Full UUID required for refine**: Use `vibesku status <job-id> --json` to get complete output UUIDs (table view truncates them).
- **Agent-friendly output**: Prefer `--json` flag for all commands when used by AI agents.
- **Version drift check (recommended triggers)**: Compare local `VERSION` with upstream when any of these happen: unknown template/option error, template mismatch with `vibesku templates --json`, user asks for newly added capability, or local check is older than 7 days (recommended cadence). If issues occur during execution, prioritize this check before retrying generation/refine commands. Follow [versioning.md](references/versioning.md).
- **Auto-update when outdated (recommended)**: If upstream version is newer, update skill first, then continue the user task with the updated skill.
- **Watch mode**: `--watch` polls every 5s until all runs complete.
- **Credit tracking**: Generation and refine show remaining balance on success.
Skill manipulates agent memory, state, or stored context. Memory corruption can alter personality, override safety rules, or cause unpredictable behavior.
* Parse options from `argv` removing known options,
* and return argv split into operands and unknown arguments.
*
* Side effects: modifies command by storing options. Does not reset state if called again.
*
* Examples:
*
The skill explicitly describes networked behaviors such as browser-based authentication, API-key use, uploading product images, checking credits, and exporting remote generation results, yet it declares no tool scope or allowed-tools boundary. This creates an authorization/expectation gap where an agent may invoke network-capable behavior without an explicit permission model, increasing the chance of unintended external requests or data transfer.
The trigger phrases are broad enough to match generic product-design or image-generation requests that may not specifically call for this CLI. Over-broad activation can cause the skill to engage unexpectedly, leading to unnecessary network use, file uploads, or credentialed actions in contexts where the user did not intend to use VibeSKU.
The workflow instructs users to upload product images and later export results, but it does not clearly warn that local files will be transmitted to an external service and that output files will be written locally. This weakens informed consent and can result in accidental disclosure of proprietary images, branding assets, or confidential product information.
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.
*/
subcommandTerm(cmd) {
const args = cmd.registeredArguments.map((arg) => humanReadableArgName(arg)).join(" ");
return cmd._name + (cmd._aliases[0] ? "|" + cmd._aliases[0] : "") + (cmd.options.length ? " [options]" : "") + // simplistic check for non-help option
(args ? " " + args : "");
}
/**
Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.
```bash
vibesku refine beb47f34-fdf8-49c4-9b9f-96bd367ed145 -p "make the background brighter"
vibesku refine beb47f34-fdf8-49c4-9b9f-96bd367ed145 -p "change to landscape" --aspect-ratio 16:9 --image-size 4K
vibesku refine beb47f34-fdf8-49c4-9b9f-96bd367ed145 -p "remove watermark" --yes # Skip confirmation
vibesku refine beb47f34-fdf8-49c4-9b9f-96bd367ed145 -p "increase contrast" --json
```
Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.
vibesku refine beb47f34-fdf8-49c4-9b9f-96bd367ed145 -p "make the background brighter"
vibesku refine beb47f34-fdf8-49c4-9b9f-96bd367ed145 -p "change to landscape" --aspect-ratio 16:9 --image-size 4K
vibesku refine beb47f34-fdf8-49c4-9b9f-96bd367ed145 -p "remove watermark" --yes # Skip confirmation
vibesku refine beb47f34-fdf8-49c4-9b9f-96bd367ed145 -p "increase contrast" --json
The parameter table sets primaryLang to zh by default and secondaryLang to en, which imposes a specific language/locale choice on users unless they override it. The document later justifies this as being designed for Chinese e-commerce pages, but the default still forces a locale behavior rather than presenting it as an explicit opt-in choice.
The invocation description says the template is for e-commerce listings "or general product descriptions," which broadens activation beyond a clear marketplace-listing use case. That phrasing overlaps with common writing requests and does not define boundaries or exclusions, making unintended invocation more likely.
The authentication section states that tokens and API keys are stored in configuration files or supplied through environment variables, but it does not provide any caution about local credential storage, file permissions, shell history exposure, or sharing risks. This can lead users to handle secrets unsafely, especially when using commands like init with inline keys.
The formatter forces credit amounts to use the "en-US" locale via toLocaleString("en-US"). For a general-purpose CLI, this imposes a specific locale without user opt-in and may conflict with organizational language/locale policy expectations.
The high-level description says the tool turns product photos into e-commerce visuals and copy, while the code also creates checkout sessions and can open a browser for purchasing credits/subscriptions. Although credits are mentioned later in the use-cases, this monetization flow is not reflected in the core description, creating a mild manifest-to-behavior mismatch.
The manifest focuses on generating, refining, exporting, batch runs, credits, authentication, templates, and configuration, but does not mention a standalone capability to browse historical jobs. The code adds jobs and status functionality that enumerates and inspects previous jobs and their outputs, which is broader than the manifest's described workflows.
The embedded CLI description states VibeSKU CLI - AI-powered product image generation, which narrows the apparent intent to images only. Elsewhere in the code, templates and outputs clearly include text outputs and listing copy workflows, so the description understates and contradicts the broader implemented functionality.
The parameter table sets primaryLang to en by default, which imposes a specific language choice in the skill's natural-language behavior. The file does not state that users will be asked to confirm or choose their preferred language before English is used by default.
No suspicious patterns detected.