T03 · Remote Payload Retrieval and Execution
- Location
SKILL.md:58- Finding
Unverified Remote Installer Is Piped Directly into a Shell
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill appears intended to generate music through Google Vertex AI, but it handles Google access tokens and setup in ways that deserve review before installation.
Review this skill before installing. Use safer official gcloud installation instructions, avoid storing live Google access tokens in plaintext workspace files when possible, restrict any credential file permissions, and confirm the configured region and project before generating music because prompts and billable requests go to Google Vertex AI.
SKILL.md:58Unverified Remote Installer Is Piped Directly into a Shell
scripts/music-gen.py:44Unvalidated Region Value Controls the Destination Receiving a Bearer Token
The instruction to install software via curl https://sdk.cloud.google.com | bash executes a remote script directly in the shell without giving the user an opportunity to verify its contents or integrity. If the download source, connection, or delivery path is compromised, this becomes arbitrary code execution on the user's machine.
Linux:
curl https://sdk.cloud.google.com | bash
exec -l $SHELL
The explicit use of | bash creates a high-risk command chain where untrusted network content is immediately executed. In a skill context, this is especially dangerous because an agent or user may copy-paste the command reflexively during setup, turning documentation into a code-execution vector.
Linux:
curl https://sdk.cloud.google.com | bash
exec -l $SHELL
The skill clearly directs reading local files such as ~/.openclaw/workspace/lyria/config.json and making outbound network requests to Google Vertex AI, yet it declares no permissions or allowed-tools scope. That mismatch weakens least-privilege controls and makes it harder for a host system or reviewer to understand what the skill can access before use.
The skill is built around sending user prompts to Google Lyria via Vertex AI, but it does not clearly warn that prompt contents are transmitted to a third-party cloud service. Users may provide sensitive creative plans or proprietary content without realizing it leaves the local environment.
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.
When using this skill for the first time on a machine, follow these steps:
# Create the lyria folder structure in workspace
This persistence finding is substantiated because the skill stores active credentials in ~/.openclaw/workspace/lyria/config.json, causing secret material to survive across sessions and potentially be exposed to other local tools or accidental sharing. The danger is higher than ordinary persistence because the persisted data is an authentication token, not just non-sensitive settings.
⚠️ **Note:** This token expires in approximately 1 hour. You'll need to refresh it periodically.
### Step 5: Create Config File
Create `~/.openclaw/workspace/lyria/config.json` with your values:
The skill instructs users to place a live bearer token into a local JSON file, creating a recoverable credential on disk that other tools, processes, or future sessions may read. Although the token is short-lived, it still grants API access during its lifetime and the text does not emphasize its sensitivity or recommend safer storage mechanisms.
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.
1. **Use specific prompts** — "jazz piano in F minor" works better than "jazz music"
2. **Specify what to exclude** — "no drums" or "no vocals" helps steer output
3. **Generate variations** — Create 2-3 versions and let user pick favorite
4. **Monitor costs** — At $0.06 per 30s, 10 generations = $0.60
5. **Refresh token proactively** — If session >45 min, get fresh token before generating
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
print(f"Sample count: {sample_count}")
try:
response = requests.post(url, headers=headers, json=data)
response.raise_for_status()
except requests.exceptions.RequestException as e:
print(f"Error calling API: {e}", file=sys.stderr)
This code reads a bearer token from configuration and uses it to authenticate a network request to the Google Lyria API. While the script prints the prompt and request status, it does not clearly disclose to the user that their prompt and authentication token will be sent to an external service, and the operation is not fully explained in a safety-oriented warning or confirmation.
The line 'English prompts recommended' imposes a language preference in natural language guidance, but does not explain whether other languages are supported or let the user opt in to that constraint. This can conflict with language/locale policy expectations that skills should not force a specific language without user choice or justification.
The script creates the output directory and writes WAV files to disk, which is a safety-relevant file write operation. Although output paths are printed after writing, there is no prior warning in the usage/help text or function documentation that running the script will create files in the configured output directory.
No suspicious patterns detected.