T03 · Remote Payload Retrieval and Execution
- Location
scripts/joule.sh:327- Finding
Unverified Remote Installer Piped Directly into a Shell
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill is mostly a DAO command-line helper, but its setup script embeds a shared API token and automatically performs remote Moltbook actions, which needs review before installation.
Do not run setup.sh unattended. Review and remove the embedded Moltbook token, require explicit consent before any remote create or post action, use your own least-privilege API key, avoid confidential content in discuss or vote messages, and do not use a production wallet private key with this CLI.
scripts/joule.sh:327Unverified Remote Installer Piped Directly into a Shell
scripts/setup.sh:14Hardcoded Shared Moltbook API Credential
scripts/joule.sh:389Predictable Shared Temporary Files Allow Symlink Attacks and Response Disclosure
scripts/joule.sh:318Wallet Private Key Passed Through Process Command-Line Arguments
Skill contains instructions that could directly expose system prompts, internal rules, or hidden instructions to users or external parties.
joinDisplay instructions for joining JOULE DAO as a founding member. Includes early-access benefits and how to get your first JOULE.
./joule.sh join
Remote code is downloaded and executed. This bypasses code review and could introduce malicious code.
warn "foundry/cast not installed — cannot sign transaction"
echo ""
echo " Install foundry for on-chain voting:"
echo " curl -L https://foundry.paradigm.xyz | bash"
echo " foundryup"
echo ""
echo " Or use a web wallet at: https://www.moltbook.com/m/joule-dao"
Remote code is downloaded and executed. This bypasses code review and could introduce malicious code.
exit 1
fi
check_dep curl "apt-get install curl"
load_config
require_moltbook_key
The script presents itself as a first-time local setup utility, but it also performs authenticated remote actions against a third-party service using a hardcoded credential. This is dangerous because users may run it expecting only local configuration while it silently creates or modifies external resources under the publisher's account, expanding trust and abuse scope far beyond normal setup behavior.
The script embeds a live API credential and transmits it to a remote service without a clear warning before use. Hardcoded secrets are dangerous because anyone with access to the repository or artifact can recover and abuse the credential, and users are not given informed consent that the script will immediately authenticate outbound requests.
The README tells users to run setup and interaction commands immediately, but does not clearly warn that setup creates local configuration files containing sensitive values and that discussion/join flows may transmit data or post content to an external service. In an agent-facing context, this is risky because automated agents may execute these commands non-interactively, causing unintended disclosure of wallet identifiers, API usage, or public posting without informed consent.
The skill instructs users to provide a live private key through environment variables for transaction signing, but gives only a vague 'keep safe!' note and no concrete guidance on secure secret handling. In an agent-skill context, encouraging inline private-key configuration can lead to accidental logging, shell history exposure, process-environment leakage, or unsafe reuse of real wallet credentials.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
curl -X POST https://mainnet.base.org \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
bold "DAO Status"
echo ""
check_dep curl "apt-get install curl"
log "Querying Base chain..."
The vote command can post wallet-linked voting intent off-chain to Moltbook, associating a wallet address with a governance action without a strong warning that this data will be externally published. This can expose user identity, strategy, or participation metadata, which is especially risky for autonomous agents operating with private context.
This POST request transmits content and an Authorization bearer token to Moltbook, creating a real external transmission surface. While intentional, it is still security-relevant because agents may unknowingly send sensitive data or use privileged tokens without sufficient operator awareness or guardrails.
EOF
)
local response
response=$(curl -sf -X POST "${MOLTBOOK_BASE}/posts" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${MOLTBOOK_API_KEY}" \
-d "$post_data" \
The discuss command sends arbitrary user-supplied message content plus a bearer API token to a third-party service, but the CLI does not present a clear, explicit warning that the content will leave the local environment and be published remotely. In an agent setting, this creates a real risk of unintended disclosure of sensitive prompts, internal data, or operator information through normal command use.
This POST sends user content and a bearer token to a remote service and stores the response body in a predictable temporary file under /tmp. The external transmission is intentional, but without strong disclosure and safer local handling it can leak sensitive content or service responses in multi-user environments.
)
local response http_code
http_code=$(curl -s -o /tmp/joule_post_response.json -w "%{http_code}" \
-X POST "${MOLTBOOK_BASE}/posts" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${MOLTBOOK_API_KEY}" \
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
local call_data="0x70a08231${padded_addr}"
local response
response=$(curl -sf -X POST "$BASE_RPC" \
-H "Content-Type: application/json" \
-d "{\"jsonrpc\":\"2.0\",\"method\":\"eth_call\",\"params\":[{\"to\":\"${CONTRACT_ADDRESS}\",\"data\":\"${call_data}\"},\"latest\"],\"id\":1}" \
2>/dev/null || echo '{"error":"RPC call failed"}')
The comment claims the embedded credential is only for creating the sub-community, but the same credential is later used for posting content as well. This mismatch conceals the real privilege scope of the token and misleads reviewers and users about what remote actions the script can perform.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
fi
}
check_dep curl "required for all network operations"
check_dep jq "recommended for JSON parsing (apt-get install jq)"
check_dep python3 "recommended for number formatting (apt-get install python3)"
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
ok "Config directory exists: $CONFIG_DIR"
else
mkdir -p "$CONFIG_DIR"
chmod 700 "$CONFIG_DIR"
ok "Created config directory: $CONFIG_DIR"
fi
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
"_comment": "Fill in moltbook_api_key and wallet_address to get started"
}
EOF
chmod 600 "$CONFIG_FILE"
ok "Created config template: $CONFIG_FILE"
fi
The script includes authenticated creation of a remote community and publication of content, but the provided context does not justify why a setup helper needs these capabilities. In an agent skill, hidden or weakly disclosed authenticated external mutations are especially risky because they can be repurposed for unauthorized actions or surprise users with third-party changes.
This POST request creates a remote resource using a hardcoded bearer token. Authenticated outbound creation of third-party resources is dangerous because it mutates external state, can be abused if the token is exposed, and is unexpected in a generic setup script.
)
create_response=""
http_code=$(curl -s -o /tmp/joule_setup_response.json -w "%{http_code}" \
-X POST "${MOLTBOOK_BASE}/submolts" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${SETUP_API_KEY}" \
The script automatically posts a welcome message to a remote community during setup without asking the user to confirm. Unprompted external posting can create unauthorized content, clutter or spam a service, and violate user expectations about what a local setup command should do.
This POST request publishes content to an external service using the same embedded bearer token. Automatic content publication is dangerous because it creates externally visible actions without user approval and further demonstrates that the exposed credential can perform more than one privileged operation.
EOF
)
welcome_http=$(curl -s -o /tmp/joule_welcome_response.json -w "%{http_code}" \
-X POST "${MOLTBOOK_BASE}/posts" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${SETUP_API_KEY}" \
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.
JOULE_DIR="$(cd "${SCRIPT_DIR}" && pwd)"
echo -e " Add to your shell profile for global access:"
echo ""
echo -e " ${DIM}# Add to ~/.bashrc or ~/.zshrc:${RESET}"
echo -e " ${CYAN}export PATH=\"\$PATH:${JOULE_DIR}\"${RESET}"
echo ""
echo -e " Then use: ${BOLD}joule.sh status${RESET} from anywhere"
The skill encourages posting arbitrary discussion content to an external Moltbook API without clearly warning that message contents and associated metadata will be transmitted off-system to a third party. In agent workflows, this can cause unintentional disclosure of sensitive prompts, internal reasoning, proprietary data, or user information if operators assume the command is local-only.
No suspicious patterns detected.