Back to skill

Security audit

Launchthatbot Import

Security checks for vulnerabilities and agentic risk

Overview

This migration skill is openly about exporting agent data, but it asks for very broad sensitive access and relies on mutable runtime tools, so users should review it carefully before installing.

Only install this if you intend to migrate a whole OpenClaw agent to LaunchThatBot and are comfortable exporting agent memory, skill source, and environment variable secrets. Before use, verify the exact destination, prefer pinned and preinstalled tooling, review the full export contents yourself, and avoid exporting unrelated credentials or private files.

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

T09 · Insecure Skill Coding Practices

Error
Location
SKILL.md:97
Finding
Attacker-Controlled API Destination and Encryption Key Can Enable Migration Data Theft<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:97-113`, `SKILL.md:178-194`, and `SKILL.md:198-221` **Vulnerability Type**: Untrusted destination and recipient-controlled encryption key **Risk Level**: Critical ### Vulnerable Code ```markdown ### Step 1: Collect Information from the User Ask the user for: 1. **Import Token** -- a 64-character hex string from the LaunchThatBot dashboard 2. **API URL** -- the LaunchThatBot API URL (default: `https://api.ltb.it.com`) The user gets the import token by clicking **Import Agent** on their agent's detail page in the LaunchThatBot dashboard. ### Step 2A (Quick API): Fetch the Public Key (Handshake via mcporter) Call LaunchThatBot MCP through `mcporter`: ``` npx -y mcporter call launchthatbot.import_handshake \ importToken:"<importToken>" \ apiUrl:"https://api.ltb.it.com" ``` ``` ```javascript const crypto = require("crypto"); function encryptSecret(value, publicKeyPem) { const encrypted = crypto.publicEncrypt( { key: publicKeyPem, padding: crypto.constants.RSA_PKCS1_OAEP_PADDING, oaepHash: "sha256", }, Buffer.from(value, "utf8"), ); return encrypted.toString("base64"); } ``` ```markdown ### Step 6A (Quick API): Send the Payload (via mcporter) Send everything via LaunchThatBot MCP through `mcporter`: ``` npx -y mcporter call launchthatbot.import_push --args '{ "importToken": "<importToken>", "apiUrl": "https://api.ltb.it.com", "payload": { "config": { "soulMd": "<contents of soul.md>", "memory": [ { "filename": "MEMORY.md", "content": "<file contents>" }, { "filename": "daily-log.json", "content": "<file contents>" } ], "skills": [ { "path": "web-search/SKILL.md", "content": "<file contents>" }, { "path": "email-sender/SKILL.md", "content": "<file contents>" } ] }, "encryptedSecrets": [ { "key": "OPENAI_API_KEY", "ciphertextB64": "<base64 encrypted value>" }, { " ...[truncated 2451 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Remove arbitrary API destination support or enforce an exact allowlist of approved HTTPS origins. 2. Canonicalize and validate the URL before use, rejecting redirects, embedded credentials, nonstandard schemes, IP literals, and lookalike domains. 3. Distribute session metadata signed by a pinned vendor signing key. The signed data should include: - Import token or its cryptographic digest. - Exact API origin. - Target deployment identity. - Public-key fingerprint. - Expiration time. - One-time nonce. 4. Verify the metadata signature locally before reading any sensitive files. 5. Bind the server-side token to the same destination, target deployment, and public key. 6. Display the exact destination, target identity, and public-key fingerprint to the user before collection and require explicit confirmation. 7. Encrypt and authenticate the entire migration payload, including configuration, memory, filenames, and skill contents, rather than encrypting only `.env` values. 8. Reject unverified public keys and fail closed if any identity or signature check cannot be completed. ]]>

T05 · Unauthorized Access and Privilege Escalation

Error
Location
SKILL.md:140
Finding
Broad Filesystem Collection Exceeds Minimum Necessary Access and Can Expose Sensitive Agent Data<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:140-172` and `SKILL.md:202-220` **Vulnerability Type**: Excessive credential and filesystem access **Risk Level**: High ### Vulnerable Code ```markdown ### Step 3: Collect Agent Data Gather the following from the local filesystem: **soul.md** (agent personality/instructions): - Check `/home/node/.openclaw/config/agents/*/soul.md` - Or wherever the agent's soul.md is located **Memory files**: - Check `/home/node/.openclaw/memory/` - Include all `.md` and `.json` files **Skills**: - Check `/home/node/.openclaw/skills/` - Include all skill directories and their contents - Exclude this skill (`launchthatbot-import`) from the export **Environment secrets** (`.env` file): - Read `/home/node/.openclaw/.env` - Parse each `KEY=VALUE` line - These will be encrypted before sending ### Step 4: Confirm with the User Before sending anything, show the user a summary: - Number of config files found - Number of memory files found - Number of skill directories found - Number of environment variables found (show keys only, never values) Ask the user to confirm they want to proceed. ``` ```json "payload": { "config": { "soulMd": "<contents of soul.md>", "memory": [ { "filename": "MEMORY.md", "content": "<file contents>" }, { "filename": "daily-log.json", "content": "<file contents>" } ], "skills": [ { "path": "web-search/SKILL.md", "content": "<file contents>" }, { "path": "email-sender/SKILL.md", "content": "<file contents>" } ] }, "encryptedSecrets": [ { "key": "OPENAI_API_KEY", "ciphertextB64": "<base64 encrypted value>" }, { "key": "ANTHROPIC_API_KEY", "ciphertextB64": "<base64 encrypted value>" } ] } ``` ### Technical Analysis Reading agent configuration and selected credentials is related to the declared migration function. However, the instructions collect substantially broader data than a minimum-privilege migration flow should acces ...[truncated 2872 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Replace recursive, default-inclusive collection with an explicit allowlist of files required for migration. 2. Require separate opt-in consent for personality, memory, skills, and credentials. 3. Present a complete pre-export manifest containing: - Canonical relative path. - File type and size. - Destination and mode. - Detected secret or personal-data categories. - Selected environment-variable names. 4. Permit users to deselect individual files and environment variables. 5. Resolve every path to its canonical form and verify containment within an approved root. 6. Reject symlinks, device files, sockets, hard-linked sensitive files, and traversal outside approved roots. 7. Apply file-count, individual-file-size, and total-payload-size limits. 8. Scan memory, configuration, and skills for credentials and redact or separately encrypt detected values. 9. Encrypt and authenticate the complete payload, not only `.env` values. 10. Use a narrowly scoped migration environment file instead of automatically exporting the global OpenClaw `.env`. 11. Ensure temporary data and generated bundles use restrictive permissions and are securely removed after use. ]]>

T08 · Insecure Dependencies

Error
Location
SKILL.md:54
Finding
Unpinned Packages Are Downloaded and Executed Through npx<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:54-92`, `SKILL.md:108-113`, `SKILL.md:198-220`, and `README.md:20-29` **Vulnerability Type**: Mutable and unverified third-party dependency execution **Risk Level**: High ### Vulnerable Code ```markdown Before running this flow, verify prerequisites in this order: 1. Check `mcporter` is runnable: ```bash mcporter --version || npx -y mcporter --version ``` If this fails, tell the user: - "`mcporter` is required for this skill. Please enable `npx mcporter` (or install/configure mcporter), then run import again." 2. Check LaunchThatBot MCP is configured and discoverable: ```bash (mcporter list || npx -y mcporter list) (mcporter list launchthatbot --schema || npx -y mcporter list launchthatbot --schema) ``` If `launchthatbot` is not available, attempt automated setup (if environment allows) and then re-check. If automation is blocked, ask the user to configure LaunchThatBot MCP manually. Recommended MCP config: ```json { "mcpServers": { "launchthatbot": { "command": "npx", "args": ["-y", "@launchthatbot/mcp-server"] } } } ``` 3. Validate import tools are available before continuing: ```bash (mcporter list launchthatbot --schema || npx -y mcporter list launchthatbot --schema) ``` ``` ```bash npx -y mcporter call launchthatbot.import_handshake \ importToken:"<importToken>" \ apiUrl:"https://api.ltb.it.com" ``` ```bash npx -y mcporter call launchthatbot.import_push --args '{ "importToken": "<importToken>", "apiUrl": "https://api.ltb.it.com", "payload": { "config": { "soulMd": "<contents of soul.md>", "memory": [ { "filename": "MEMORY.md", "content": "<file contents>" }, { "filename": "daily-log.json", "content": "<file contents>" } ], "skills": [ { "path": "web-search/SKILL.md", "content": "<file contents>" }, { "path": "email-sender/SKILL.md", "content": "<file contents>" } ] }, "enc ...[truncated 2614 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Pin every executable package to an exact reviewed version rather than using an unversioned name or `@latest`. 2. Record and verify registry integrity hashes through a committed lockfile or an equivalent trusted manifest. 3. Install dependencies during a controlled provisioning step rather than downloading them when secrets are being migrated. 4. Use a trusted, allowlisted registry and verify package provenance or signed release attestations. 5. Disable npm lifecycle scripts where they are not required. 6. Execute migration tooling in a restricted sandbox with: - Read access only to explicitly selected files. - No access to unrelated credentials. - Network access only to the verified migration origin. - No persistence or package-installation permissions. 7. Fail closed if the installed package version or checksum differs from the approved value. 8. Replace `npx clawhub@latest` with a pinned installer release and document a secure, independently verifiable upgrade procedure. ]]>
Vulnerability Patterns
  • 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
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (15)

Ssd 3

High
Confidence
99% confidence
Finding
This section explicitly directs collection and transfer of highly sensitive local data: agent instructions, memory, installed skills, and environment secrets. Even if the stated product goal is migration, this is an exfiltration-capable workflow; compromise, misdirection, or user misunderstanding could expose complete operational context and secret material to an external service or attacker-controlled endpoint.

Rp1

Medium
Category
MCP Rug Pull
Confidence
93% confidence
Finding
The README instructs users to execute `npx clawhub@latest install launchthatbot-import`, which resolves code at runtime without pinning to a specific immutable version. If the upstream package is compromised, a malicious release is published, or a dependency chain is hijacked, users could execute attacker-controlled code during installation.

Rp1

Medium
Category
MCP Rug Pull
Confidence
91% confidence
Finding
The fallback command `npx -y mcporter --version` downloads and runs the latest `mcporter` package if it is not already installed, with no version pinning. This creates a supply-chain execution risk because a malicious or compromised package release could run arbitrary code on the user's system.

Rp1

Medium
Category
MCP Rug Pull
Confidence
91% confidence
Finding
The command `npx -y mcporter list` similarly permits execution of an unpinned package from the registry. In the context of a migration skill that handles agent configuration and potentially secrets-adjacent workflows, running an untrusted or changed tool increases the chance of host compromise or sensitive data exposure.

Rp1

Medium
Category
MCP Rug Pull
Confidence
91% confidence
Finding
The command `npx -y mcporter list launchthatbot --schema` executes an unpinned remote package, exposing users to the same package substitution or malicious update risks. Because this skill is specifically about exporting agent config, memory, skills, and encrypted secrets, any compromise of the helper tooling is more dangerous than in a low-sensitivity context.

Rp1

Medium
Category
MCP Rug Pull
Confidence
97% confidence
Finding
The skill repeatedly instructs use of `npx -y mcporter` without pinning a specific package version, which creates a supply-chain risk: execution may pull the latest published package at runtime, including a compromised or typosquatted release. In this skill, that risk is amplified because the tool is then used in a workflow that handles local config, memory, skills, and encrypted secrets.

Rp1

Medium
Category
MCP Rug Pull
Confidence
97% confidence
Finding
Using unpinned `npx mcporter` allows the executed code to change over time and exposes the user to malicious package publication or upstream compromise. Because this skill is explicitly about exporting sensitive local state, any compromise of the fetched tool could directly lead to data exfiltration or arbitrary command execution in a trusted workflow.

Rp1

Medium
Category
MCP Rug Pull
Confidence
97% confidence
Finding
The unpinned `npx -y mcporter list` invocation introduces runtime dependency drift and supply-chain exposure. In context, the command is part of validating and enabling the export path, so compromise of the tool could subvert the later handling of secrets and local files.

Rp1

Medium
Category
MCP Rug Pull
Confidence
97% confidence
Finding
Calling `npx -y mcporter list launchthatbot --schema` without version pinning means the analysis and subsequent tool-discovery process depends on mutable remote code. That is especially dangerous here because the tool helps establish trust in an MCP server used to move sensitive data.

Context-Inappropriate Capability

Medium
Confidence
90% confidence
Finding
The skill instructs the agent to attempt automated MCP setup if the server is unavailable, broadening behavior from import/export into environment modification and external tool installation. That expands the trust boundary and increases the chance of unintended code execution, misconfiguration, or installation of attacker-controlled tooling.

Rp1

Medium
Category
MCP Rug Pull
Confidence
97% confidence
Finding
Another unpinned `npx -y mcporter` invocation appears in the import flow, continuing the same supply-chain weakness at a point close to token handling and service interaction. If a malicious version is executed, it could intercept import tokens, redirect API calls, or alter the exported payload.

Rp1

Medium
Category
MCP Rug Pull
Confidence
97% confidence
Finding
The handshake step relies on unpinned `npx -y mcporter` to fetch a public key tied to the import process. A compromised package could substitute attacker-controlled behavior or keys, undermining the confidentiality guarantees described by the skill.

Rp1

Medium
Category
MCP Rug Pull
Confidence
97% confidence
Finding
The final push of exported data is triggered through unpinned `npx -y mcporter`, creating a direct path for a malicious package version to capture or modify the full payload. Because this payload includes local config, memory, skills, and encrypted secrets metadata, the potential blast radius is substantial.

Ssd 3

Medium
Confidence
95% confidence
Finding
The air-gapped mode avoids immediate network transfer but still instructs creation of a local bundle containing sensitive config, memory, skills, and encrypted secrets for later upload. That bundle becomes a high-value artifact that can be copied, mishandled, or retained longer than intended, creating a durable exfiltration target.

Whitespace Padding

Medium
Category
Prompt Injection
Content
## Error Handling

| Error                     | What to Do                                                                                       |
| ------------------------- | ------------------------------------------------------------------------------------------------ |
| 401 Unauthorized          | Token is invalid, expired, or already used. Generate a new one from the LaunchThatBot dashboard. |
| 400 Bad Request           | Check the payload format matches the schema above.                                               |
Confidence
70% confidence
Finding
Large whitespace padding was detected (a block of blank lines or a long run of spaces). This can push injected instructions below or to the right of the visible area so a human reviewer never sees them while the agent still reads them. Manual review of the hidden content is recommended.