T03 · Remote Payload Retrieval and Execution
- Location
scripts/install.sh:4- Finding
Mutable Remote Application and Dependencies Are Executed Without Integrity Pinning
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This skill is a firewall companion, but installation fetches and persistently runs unaudited remote code with broad local permissions and optional automatic firewall approvals.
Install only if you are comfortable with a persistent macOS LaunchAgent running code pulled from the publisher's GitHub repository at install time. Review or pin the remote repository first, avoid enabling autoExecute or permanent auto-allow rules, and understand that granting Accessibility to Terminal or osascript and enabling sessions_spawn gives this integration broad local control.
scripts/install.sh:4Mutable Remote Application and Dependencies Are Executed Without Integrity Pinning
scripts/install.sh:44Downloaded Application Is Registered as an Automatically Restarting LaunchAgent
SKILL.md:52Broad Accessibility and Agent-Session Permissions Expand the Persistent Payload's Authority
scripts/configure.sh:25Telegram Identifier Is Written to JSON Without Validation or Escaping
The declared description presents an operational firewall-monitoring and AI/Telegram integration skill, but the provided code does not monitor firewall alerts, analyze connections, send notifications, or handle LuLu callbacks. Instead, it is purely an uninstall utility for removing the LuLu Monitor service and related files. This is a materially different primary purpose and includes filesystem/service-removal capabilities not reflected in the description.
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).
# Remove launchd plist
if [ -f "$LAUNCH_AGENTS/$PLIST_NAME" ]; then
rm "$LAUNCH_AGENTS/$PLIST_NAME"
echo "✅ Removed launchd plist"
fi
The skill clearly instructs use of shell commands (bash, curl, launchctl, openclaw message send) but does not declare an explicit tool scope or allowed-tools policy. That creates an authorization gap where a reviewer or runtime may underestimate the skill's ability to execute local commands, modify services, and interact with system components.
The auto-execute feature introduces autonomous decision-making into a security control plane: firewall approval. In this context, reducing interruptions is outweighed by the risk of automatically authorizing malicious or suspicious connections.
5. Provides 4 action buttons: Always Allow, Allow Once, Always Block, Block Once
6. Executes the action on LuLu when user taps a button
## Auto-Execute Mode (Optional)
For reduced interruptions, enable auto-execute mode. When the AI has high confidence (known safe programs like curl, brew, node, git connecting to normal destinations), it will:
1. Automatically execute the Allow action
The skill offers AI-driven auto-execution of firewall Allow actions, including the option to create permanent allow rules, without prominently emphasizing the security consequences of trusting model confidence for network authorization. A mistaken classification could silently permit unwanted outbound connections and weaken the host firewall's protective role.
The text indicates automatic execution of Allow actions when the AI judges a connection as normal, which delegates a sensitive trust decision to a probabilistic model. This is dangerous because a false positive can directly reduce firewall protection and permit untrusted traffic.
## Auto-Execute Mode (Optional)
For reduced interruptions, enable auto-execute mode. When the AI has high confidence (known safe programs like curl, brew, node, git connecting to normal destinations), it will:
1. Automatically execute the Allow action
2. Still send a Telegram notification explaining what was auto-allowed
This instance explicitly describes the system automatically executing an Allow firewall action based on AI confidence. Autonomous security decisions over network access can produce unsafe authorizations without human verification, especially when model judgments are fallible or inputs are ambiguous.
## Auto-Execute Mode (Optional)
For reduced interruptions, enable auto-execute mode. When the AI has high confidence (known safe programs like curl, brew, node, git connecting to normal destinations), it will:
1. Automatically execute the Allow action
2. Still send a Telegram notification explaining what was auto-allowed
**To enable:**
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.
To enable:
# Create config.json in install directory
cat > ~/.openclaw/lulu-monitor/config.json << 'EOF'
{
"telegramId": "YOUR_TELEGRAM_ID",
The configuration example actively instructs users to enable autoExecute, making autonomous firewall decisions easy to turn on without sufficient risk framing. Configuration-driven enablement of automatic allow behavior increases the likelihood of unsafe deployment.
cat > ~/.openclaw/lulu-monitor/config.json << 'EOF'
{
"telegramId": "YOUR_TELEGRAM_ID",
"autoExecute": true,
"autoExecuteAction": "allow-once"
}
EOF
The autoExecuteAction setting allows automatic enforcement actions, potentially including persistent allow rules. Exposing this as a simple config option lowers the barrier to automating a high-impact security decision with insufficient safeguards.
{ "telegramId": "YOUR_TELEGRAM_ID", "autoExecute": true, "autoExecuteAction": "allow-once" } EOF
Documenting autoExecute as a normal option normalizes autonomous firewall authorization in a user-facing setup path. Even with a default of false, the feature increases risk because it can be enabled casually and may be misunderstood as reliably safe.
**Options:**
- `autoExecute`: `false` (default) - all alerts require manual button press
- `autoExecuteAction`: `"allow-once"` (default, conservative) or `"allow"` (permanent rule)
## Installation
Allowing autoExecuteAction to be set to allow enables creation of permanent firewall allow rules through autonomous decision-making. Persistent automatic approvals are especially dangerous because a single misclassification can create long-lived exposure beyond the current process lifetime.
**Options:**
- `autoExecute`: `false` (default) - all alerts require manual button press
- `autoExecuteAction`: `"allow-once"` (default, conservative) or `"allow"` (permanent rule)
## Installation
Skill injects content designed to persist in agent memory or context across interactions. Persistent injection can alter agent behavior long after the initial interaction.
**Options:**
- `autoExecute`: `false` (default) - all alerts require manual button press
- `autoExecuteAction`: `"allow-once"` (default, conservative) or `"allow"` (permanent rule)
## Installation
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
curl http://127.0.0.1:4441/status
Should return {"running":true,...}
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.
echo ""
echo "🔄 Restarting service..."
launchctl unload "$HOME/Library/LaunchAgents/com.openclaw.lulu-monitor.plist" 2>/dev/null || true
launchctl load "$HOME/Library/LaunchAgents/com.openclaw.lulu-monitor.plist"
echo "✅ Service restarted"
else
echo ""
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.
echo ""
echo "🔄 Restarting service..."
launchctl unload "$HOME/Library/LaunchAgents/com.openclaw.lulu-monitor.plist" 2>/dev/null || true
launchctl load "$HOME/Library/LaunchAgents/com.openclaw.lulu-monitor.plist"
echo "✅ Service restarted"
else
echo ""
The script clones code from a remote GitHub repository and runs npm install --production, which executes remote package lifecycle scripts and installs unpinned dependencies. This is dangerous because it performs network retrieval and code execution without an explicit warning, integrity verification, or version pinning, increasing supply-chain risk.
The installer creates a LaunchAgent plist and immediately loads it with launchctl, establishing a persistent user-level background service. While persistence is expected for a monitoring tool, the script does not present a clear consent prompt or explicit warning that it will install an auto-starting agent, which reduces user awareness of a lasting system change.
This line marks the beginning of LaunchAgent setup, which is a persistence mechanism on macOS. In the context of an installer, persistence may be legitimate, but it still represents an auto-start capability that should be disclosed because it causes code to run beyond the initial install session.
echo "📝 Setting up launchd service..."
mkdir -p "$LAUNCH_AGENTS"
# Create launchd plist
cat > "$LAUNCH_AGENTS/$PLIST_NAME" << EOF
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
The script writes a plist into ~/Library/LaunchAgents, creating a persistent execution mechanism for the current user. Even for legitimate software, silently establishing persistence can be abused if the repository or dependencies are compromised, because the payload will continue running automatically.
mkdir -p "$LAUNCH_AGENTS"
# Create launchd plist
cat > "$LAUNCH_AGENTS/$PLIST_NAME" << EOF
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
This line unloads and then prepares to reload the LaunchAgent, directly managing persistence for the service. In context, this is expected installer behavior, but it is still security-relevant because it modifies auto-start behavior and can keep compromised code resident across sessions.
echo ""
echo "🔄 Starting service..."
mkdir -p "$INSTALL_DIR/logs"
launchctl unload "$LAUNCH_AGENTS/$PLIST_NAME" 2>/dev/null || true
launchctl load "$LAUNCH_AGENTS/$PLIST_NAME"
# Verify service is running
launchctl load activates the newly created LaunchAgent, causing the monitor to run automatically now and on future logins. The skill context makes this somewhat less suspicious because a monitoring companion reasonably needs a background process, but it remains dangerous if combined with unverified remote code retrieval and dependency execution.
echo "🔄 Starting service..."
mkdir -p "$INSTALL_DIR/logs"
launchctl unload "$LAUNCH_AGENTS/$PLIST_NAME" 2>/dev/null || true
launchctl load "$LAUNCH_AGENTS/$PLIST_NAME"
# Verify service is running
sleep 2
launchctl load activates the newly created LaunchAgent, causing the monitor to run automatically now and on future logins. The skill context makes this somewhat less suspicious because a monitoring companion reasonably needs a background process, but it remains dangerous if combined with unverified remote code retrieval and dependency execution.
echo "🔄 Starting service..."
mkdir -p "$INSTALL_DIR/logs"
launchctl unload "$LAUNCH_AGENTS/$PLIST_NAME" 2>/dev/null || true
launchctl load "$LAUNCH_AGENTS/$PLIST_NAME"
# Verify service is running
sleep 2
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.
set -e
INSTALL_DIR="$HOME/.openclaw/lulu-monitor"
PLIST_NAME="com.openclaw.lulu-monitor.plist"
LAUNCH_AGENTS="$HOME/Library/LaunchAgents"
echo "🗑️ Uninstalling LuLu Monitor..."
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.
set -e
INSTALL_DIR="$HOME/.openclaw/lulu-monitor"
PLIST_NAME="com.openclaw.lulu-monitor.plist"
LAUNCH_AGENTS="$HOME/Library/LaunchAgents"
echo "🗑️ Uninstalling LuLu Monitor..."
No suspicious patterns detected.