T03 · Remote Payload Retrieval and Execution
- Location
README.md:18- Finding
Unverified Rust Installer Is Downloaded and Executed Directly
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This is a real Lightning wallet skill with disclosed behavior, but it needs Review because it handles funds while storing the wallet seed plainly and sending payment events to arbitrary webhooks without strong safeguards.
Review before installing or using with real funds. Use only small test balances, protect and back up the seed file, set restrictive permissions on the storage directory, avoid HTTP webhooks, send webhook events only to trusted endpoints, and prefer safer Rust/protoc installation methods over piping remote scripts into a shell.
README.md:18Unverified Rust Installer Is Downloaded and Executed Directly
SKILL.md:17Skill Setup Instructions Execute an Unverified Remote Installer
src/config.rs:138Wallet Recovery Mnemonic Is Written Without Enforced Owner-Only Permissions
src/main.rs:342Webhook Configuration Allows Bearer Tokens and Payment Metadata over Plaintext HTTP
src/main.rs:379Wallet Events Are Acknowledged Before Detached Webhook Deliveries Succeed
Piping network-fetched content directly into a shell removes any opportunity for inspection and makes compromise of the source or delivery path immediately result in code execution. In the context of a wallet skill handling money, compromise of the install path is especially dangerous because it can lead to seed theft, credential theft, or malicious wallet behavior on the host.
# Install Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# Install protoc (Ubuntu/Debian — see SKILL.md for other platforms)
sudo apt install -y protobuf-compiler
The | sh construct is a classic command-chaining pattern that turns remote content retrieval directly into code execution. In the context of a wallet tool handling money and secrets, compromise of this step could expose seed material, alter transaction behavior, or implant persistent malware.
Rust — Install via rustup:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
protoc (Protocol Buffers compiler) — Required by the Spark SDK dependency:
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
sudo apt install -y protobuf-compiler
```sh
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
sudo apt install -y protobuf-compiler
```sh
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
sudo apt install -y protobuf-compiler
```sh
The README states that a wallet seed is automatically generated and stored on disk, but does not prominently warn that the seed is the root secret controlling funds and must be backed up and protected. Users may leave the seed unencrypted, include it in backups or shared storage, or fail to back it up at all, leading to theft or irreversible fund loss.
The README encourages sending wallet event data to arbitrary external webhook endpoints but does not clearly warn that those events may contain sensitive financial metadata or that bearer tokens and transport security must be protected. In a wallet-for-agents context, this omission can lead operators to expose payment details, wallet activity, or automation triggers to third-party services without understanding the privacy and security consequences.
The documentation encourages posting wallet event data to arbitrary webhook endpoints and optionally attaching bearer tokens, but it does not prominently warn that payment metadata, identifiers, and operational details are disclosed to third parties. It also states events are marked handled even after repeated delivery failures, which can cause silent event loss and operational integrity issues if a webhook is misconfigured or hostile.
The code generates a wallet mnemonic and writes it directly to a predictable file on disk using default filesystem permissions, with only a generic stderr message. A plaintext seed is highly sensitive secret material; if local users, backups, malware, container volume mounts, or misconfigured permissions expose that file, an attacker can take full control of wallet funds.
The send command parses a user-supplied payment target and immediately initiates payment without an interactive confirmation step, preview, or irreversible-action warning. In a wallet CLI, this increases the risk of accidental or socially engineered payments, especially when combined with pasted invoices, BIP21 URIs, or scripts invoking the command non-interactively.
The daemon accepts arbitrary webhook URLs and posts wallet event data to them, including payment identifiers, hashes, txids, channel metadata, and timing information. In a wallet CLI context this can disclose sensitive financial activity to unintended third parties, and the code only logs configured webhooks rather than presenting a clear opt-in warning or restricting destinations.
The README instructs users to fetch and immediately execute a remote script with curl piped to sh. If the remote host, connection, or delivered script is compromised, users could execute attacker-controlled code on their machine during installation.
# Install Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# Install protoc (Ubuntu/Debian — see SKILL.md for other platforms)
sudo apt install -y protobuf-compiler
The documentation instructs users to fetch and immediately execute a remote script with curl piped into sh. If the remote host, CDN, DNS, TLS trust chain, or the script itself is compromised, arbitrary code executes on the user's machine without review.
Rust — Install via rustup:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
protoc (Protocol Buffers compiler) — Required by the Spark SDK dependency:
No suspicious patterns detected.