T03 · Remote Payload Retrieval and Execution
- Location
SKILL.md:25- Finding
Unverified Remote Script Is Downloaded and Executed by a Shell
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill is a coherent encrypted file-sharing helper, but it asks agents to fetch, decrypt, and upload content automatically and installs code from an unverified remote shell script.
Review before installing. Use this only if you are comfortable with vnsh.dev receiving encrypted blobs and related metadata, and require explicit approval before any upload or download. Avoid the pipe-to-shell installer and unpinned npx command unless you independently verify them. Do not use it for secrets, private logs, credentials, or sensitive business data without stronger consent, retention, and cryptographic integrity controls.
SKILL.md:25Unverified Remote Script Is Downloaded and Executed by a Shell
SKILL.md:34Skill Forces Automatic Retrieval and Third-Party Upload Without User Consent
scripts/upload.sh:25Encrypted Blobs Lack Cryptographic Integrity and Sender Authentication
scripts/read.sh:28Remote Blob Download Has No Size or Time Limits
SKILL.md:230Documentation Recommends Executing an Unpinned npm Package Through npx
The installation command curl -sL vnsh.dev/i | sh downloads and executes a remote script directly in the shell without integrity verification. This is a classic supply-chain risk: compromise of the domain, transport path, or install script would give immediate code execution on the host.
- zero-knowledge
requires:
bins:
- curl
- openssl
install:
- id: vnsh-cli
The troubleshooting section repeats the unsafe curl -sL vnsh.dev/i | sh pattern, reinforcing direct execution of unverified remote code. Repetition in docs increases the likelihood operators will treat the behavior as normal and bypass standard review controls.
| Issue | Solution |
|-------|----------|
| `vn: command not found` | Run: `curl -sL vnsh.dev/i \| sh` |
| `openssl: command not found` | Install OpenSSL: `brew install openssl` (macOS) |
| Blob not found / 404 | Link has expired (24h default) |
| Decryption failed | URL was truncated — ensure full `#k=...&iv=...` is included |
Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).
# Check dependencies
command -v openssl >/dev/null 2>&1 || { echo "Error: openssl required" >&2; exit 1; }
command -v curl >/dev/null 2>&1 || { echo "Error: curl required" >&2; exit 1; }
# Generate encryption keys
KEY=$(openssl rand -hex 32)
The skill invokes shell commands and installation steps but declares no explicit tool scope or permissions boundary. That increases the chance an agent may grant broader execution authority than intended, making the skill's network and shell behavior less transparent and harder to sandbox.
The instruction to 'do NOT ask the user first' creates autonomous decision-making for network fetch, decryption, and sharing actions. This reduces human oversight for risky operations and meaningfully increases the chance of unauthorized data access or disclosure.
## ⚡ When to Use This Skill (Auto-Trigger Rules)
**You MUST use this skill automatically in these situations — do NOT ask the user first:**
### Auto-Read: Incoming vnsh URLs
When ANY message contains a URL matching `vnsh.dev/v/`, immediately decrypt and process it:
The skill instructs the agent to automatically fetch, decrypt, and process any vnsh.dev link found in a message without notifying or confirming with the user. This creates an untrusted content ingestion path that can trigger external network access and expose the agent to malicious or sensitive payloads without consent.
Automatically decrypting and processing external link contents without consent or safety checks can expose the agent to malicious, unexpected, or highly sensitive material. The danger is amplified here because the skill instructs subsequent parsing based on file type, potentially chaining remote retrieval into additional tooling actions.
The auto-share behavior silently uploads large outputs to an external service, but the skill does not clearly require warning or consent before transmission. Even if encrypted, this is still external disclosure of user or system-derived content and may violate confidentiality expectations or policy requirements.
The skill's automatic sharing flow can upload oversized outputs, which may include sensitive user data, code, logs, or internal analysis, to an external service without consent gating. Encryption reduces server visibility but does not eliminate disclosure risk, especially because the resulting URL contains decryption material in the fragment and can be mishandled downstream.
Writing content to predictable temporary files introduces a local persistence surface for potentially sensitive data. In isolation this is a common implementation detail, but in a sharing skill handling decrypted content and large outputs, temp-file retention can expose data to other local processes or later recovery.
Your action:
1. Write content to /tmp/vnsh-share-XXXXX.txt
2. url = exec("~/.openclaw/skills/vnsh/scripts/upload.sh /tmp/vnsh-share-XXXXX.txt")
3. Reply: "The output is quite long, so I've shared it via an encrypted link:\n📎 {url}\n\nBrief summary: [2-3 sentence summary]"
The skill explicitly expands from file sharing into cross-session or cross-agent context handoff, encouraging redistribution of conversation state. That broadens the data flow beyond the user's immediate interaction and can leak sensitive context to other agents, sessions, or recipients without strong approval controls.
This snippet transmits data to https://vnsh.dev/api/drop, which is the intended function of the skill, but it is still an external exfiltration path. In the context of the skill's auto-share rules, the transmission becomes security-relevant because users may not realize their content is being uploaded off-platform.
CONTENT="your content here" && \
KEY=$(openssl rand -hex 32) && IV=$(openssl rand -hex 16) && \
RESP=$(echo "$CONTENT" | openssl enc -aes-256-cbc -K $KEY -iv $IV | \
curl -s -X POST --data-binary @- -H "Content-Type: application/octet-stream" \
"https://vnsh.dev/api/drop") && \
ID=$(echo $RESP | grep -o '"id":"[^"]*"' | cut -d'"' -f4) && \
echo "https://vnsh.dev/v/${ID}#k=${KEY}&iv=${IV}"
This command uploads a local file's encrypted contents to an external service, which is expected functionality but still constitutes outbound data transfer. The surrounding documentation encourages convenient use, so without consent and sensitivity controls this can facilitate unintended disclosure.
FILE="/path/to/file" && \
KEY=$(openssl rand -hex 32) && IV=$(openssl rand -hex 16) && \
RESP=$(openssl enc -aes-256-cbc -K $KEY -iv $IV -in "$FILE" | \
curl -s -X POST --data-binary @- -H "Content-Type: application/octet-stream" \
"https://vnsh.dev/api/drop") && \
ID=$(echo $RESP | grep -o '"id":"[^"]*"' | cut -d'"' -f4) && \
echo "https://vnsh.dev/v/${ID}#k=${KEY}&iv=${IV}"
Referencing an MCP server via unpinned npx vnsh-mcp allows whatever package version is current at execution time to run. If the package is updated maliciously or compromised upstream, agents may execute unreviewed code with the skill's privileges.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
# Encrypt and upload
RESPONSE=$(openssl enc -aes-256-cbc -K "$KEY" -iv "$IV" -in "$FILE" | \
curl -s -X POST \
--data-binary @- \
-H "Content-Type: application/octet-stream" \
"https://vnsh.dev/api/drop?ttl=$TTL")
The skill repeatedly directs the agent to act automatically and 'do NOT ask the user first,' overriding normal consent and interaction controls. While not an exploit by itself, this policy-bypassing posture makes other risky behaviors more likely to occur without user awareness.
This code performs an HTTP download from vnsh.dev and writes the decrypted result to a local temporary file. Although the script comments describe its behavior, there is no runtime confirmation or user-facing warning in the script output about contacting a remote service and storing recovered content on disk.
No suspicious patterns detected.