Back to all blogs
How to Securely Deploy OpenClaw: Technical Best Practices
How to Securely Deploy OpenClaw: Technical Best Practices



Aaryan Bhujang
Aaryan Bhujang
|
AI security researcher
AI security researcher
Feb 16, 2026
|
12 min read




Summary
OpenClaw reached 180,000 GitHub stars in just three weeks, but this rapid adoption has exposed critical security flaws. Researchers have identified over 21,000 publicly accessible instances and a skills marketplace where 36% of contributions are malicious, including hundreds of macOS stealers. Because the agent operates with full shell access and zero sandboxing, a single poisoned skill or crafted email can trigger a full system compromise. This report provides a definitive guide to hardening OpenClaw through Docker isolation, syscall blocking, and cryptographic skill verification. Additionally, we present new red-team data from Repello AI demonstrating that Claude Opus 4.5 offers significantly better protection against agentic exploits than competing models.
About OpenClaw
OpenClaw (formerly Clawdbot, then Moltbot) just became GitHub's fastest-growing repo in history: 180,000 stars in three weeks. It is an AI agent that runs locally, reads email, executes shell commands, and maintains memory across sessions.
Here is the problem. Within days of going viral, researchers found over 21,000 publicly exposed instances leaking API keys, 341+ malicious skills delivering malware, and a critical RCE vulnerability enabling one-click account takeover. As of February 2026, 36% of all ClawHub skills contain security flaws.
If you are deploying OpenClaw in production or even just playing with it on a VPS, this guide is meant to keep you from becoming a statistic.
What Makes OpenClaw Powerful (and Dangerous)
OpenClaw provides capabilities that SaaS AI assistants intentionally restrict:
Full shell and file system access with no default sandboxing
Persistent memory that retains context across sessions
Direct integrations with Gmail, Slack, WhatsApp, Telegram, Discord, and calendars
Extensibility through skills (third-party packages with system-level permissions)
Web gateway on port 18789 for remote configuration
This is effectively giving an LLM "sudo" on your infrastructure. One compromised email, one poisoned skill, or one exploited gateway can lead to full system compromise.
The Attack Surface
1. Skills are the primary attack vector
The ClawHub marketplace is a supply chain disaster. Security audits from January to February 2026:
Research Org | Skills Analyzed | Malicious or Flawed |
|---|---|---|
2,857 | 341 malicious (12%) | |
3,984 | 1,467 flawed (36.8%) | |
~400 deep-dive | 800+ malicious identified |
The ClawHavoc campaign: 335+ coordinated malicious skills delivering Atomic Stealer (AMOS).
Attack methodology:
Professional disguises: Skills masquerade as crypto tools (solana-wallet-tracker, phantom-wallet-utilities), YouTube utilities (youtube-summarize-pro), or Polymarket trading bots.
Social engineering via prerequisites: Installation instructions direct users to download password-protected ZIPs containing keyloggers, or execute base64-encoded scripts.
Typosquatting: 29+ variants (clawhub, clawhub1, clawhubb, clawwhub, cllawhub).
Shared C2 infrastructure: All ClawHavoc skills communicate with 91.92.242[.]30.
Why minimal vetting fails: ClawHub's only barrier is a one-week-old GitHub account. User "hightower6eu" published 314+ malicious packages. The marketplace grew from about 50 daily submissions in mid-January to 500+ by early February.
2. Exposed instances everywhere
Internet-wide scanning reveals catastrophic exposure:
30,000+ exposed instances detected during Jan 27 to Feb 8, 2026 (Bitsight)
21,639 instances visible as of Jan 31, 2026 (Censys), concentrated in the US, China (30%+ on Alibaba Cloud), and Singapore
15,200+ vulnerable to RCE based on version fingerprinting
No authentication on hundreds of instances. Manual verification found gateways exposing Anthropic API keys, Telegram bot tokens, and Slack credentials.
Root causes:
Misconfigured reverse proxies (Nginx) bypassing localhost-only restrictions
Default port 18789 left publicly accessible
Plaintext credentials in
~/.clawdbot/.envand markdown or JSON memory files
Shadow IT risk: Token Security reported that 22% of employees at monitored companies were running OpenClaw on corporate machines by late January 2026.
3. CVE-2026-25253: one-click RCE
The most critical vulnerability (CVSS 8.8) was disclosed Feb 3, 2026 and patched in version 2026.1.29:
Attack vector: Control UI trusts the
gatewayUrlquery parameter without validation and auto-connects on page load.Exploitation: Clicking a crafted link triggers cross-site WebSocket hijacking, exfiltrating the token.
Impact: With the stolen token, attackers gain operator-level gateway API access to modify sandbox settings and invoke privileged actions.
Scope: Exploitable even on localhost-only deployments. All versions prior to 2026.1.29 are vulnerable.
4. Prompt injection
OpenClaw processes untrusted content from emails, chat messages, web pages, and third-party APIs. Adversaries can embed malicious instructions:
Direct injection: Malicious user messages bypass safety guardrails.
Indirect injection: Poisoned emails or Slack messages contain hidden instructions.
Persistent memory poisoning: Skills write to
SOUL.mdorMEMORY.md, creating delayed-execution attacks.
As Palo Alto Networks noted, persistent memory acts as an accelerant: attacks become stateful campaigns that evolve across sessions.
Practical Hardening
1. Deployment and network isolation
Never run OpenClaw on your primary workstation. Use dedicated infrastructure.
Hardened Docker deployment
version: '3.8' services: openclaw-gateway: image: openclaw/openclaw:latest container_name: openclaw-gateway restart: unless-stopped user: "1000:1000" read_only: true cap_drop: - ALL security_opt: - no-new-privileges:true tmpfs: - /tmp:rw,noexec,nosuid,size=100m - /var/tmp:rw,noexec,nosuid,size=50m volumes: - ./config:/home/node/.openclaw/config:rw - ./workspace:/home/node/.openclaw/workspace:rw - ./state:/home/node/.openclaw/state:rw networks: - openclaw-internal ports: - "127.0.0.1:18789:18789" mem_limit: 2g cpus: 2 pids_limit: 100 environment: - NODE_ENV=production - OPENCLAW_AUTH_TOKEN=${OPENCLAW_AUTH_TOKEN} - ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY} networks: openclaw-internal: driver: bridge internal: true
version: '3.8' services: openclaw-gateway: image: openclaw/openclaw:latest container_name: openclaw-gateway restart: unless-stopped user: "1000:1000" read_only: true cap_drop: - ALL security_opt: - no-new-privileges:true tmpfs: - /tmp:rw,noexec,nosuid,size=100m - /var/tmp:rw,noexec,nosuid,size=50m volumes: - ./config:/home/node/.openclaw/config:rw - ./workspace:/home/node/.openclaw/workspace:rw - ./state:/home/node/.openclaw/state:rw networks: - openclaw-internal ports: - "127.0.0.1:18789:18789" mem_limit: 2g cpus: 2 pids_limit: 100 environment: - NODE_ENV=production - OPENCLAW_AUTH_TOKEN=${OPENCLAW_AUTH_TOKEN} - ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY} networks: openclaw-internal: driver: bridge internal: true
Key hardening:
Non-root execution (
user: "1000:1000")Read-only filesystem (
read_only: true)Dropped capabilities (
cap_drop: ALL)tmpfs for temp storage (cleared on restart)
Resource limits (reduce DoS impact)
Internal network (no internet by default)
Gateway configuration
# gateway.yaml gateway: bind: "127.0.0.1" port: 18789 trustedProxies: - "10.0.0.0/8" - "172.16.0.0/12" - "192.168.0.0/16" auth: token: "${OPENCLAW_AUTH_TOKEN}" controlUi: dangerouslyDisableDeviceAuth: false allowInsecureAuth: false mdns: enabled: false agents: defaults: sandbox: mode: "non-main" scope: "session" workspaceAccess: "none" docker: network: "none" user: "65534:65534" readOnly: true capDrop: - ALL securityOpt: - no-new-privileges:true memory: "1g" cpus: 1 pidsLimit: 50
# gateway.yaml gateway: bind: "127.0.0.1" port: 18789 trustedProxies: - "10.0.0.0/8" - "172.16.0.0/12" - "192.168.0.0/16" auth: token: "${OPENCLAW_AUTH_TOKEN}" controlUi: dangerouslyDisableDeviceAuth: false allowInsecureAuth: false mdns: enabled: false agents: defaults: sandbox: mode: "non-main" scope: "session" workspaceAccess: "none" docker: network: "none" user: "65534:65534" readOnly: true capDrop: - ALL securityOpt: - no-new-privileges:true memory: "1g" cpus: 1 pidsLimit: 50
Firewall rules
sudo ufw default deny incoming sudo ufw default allow outgoing sudo ufw limit 22/tcp sudo ufw allow 443/tcp # Never allow port 18789 from the public internet sudo
sudo ufw default deny incoming sudo ufw default allow outgoing sudo ufw limit 22/tcp sudo ufw allow 443/tcp # Never allow port 18789 from the public internet sudo
Tailscale for secure remote access
curl -fsSL <https://tailscale.com/install.sh> | sh sudo tailscale up sudo tailscale serve --bg 127
curl -fsSL <https://tailscale.com/install.sh> | sh sudo tailscale up sudo tailscale serve --bg 127
Access it at https://[your-machine].tail[xxxx].[ts.net](<http://ts.net>) with automatic HTTPS and zero public exposure.
2. Skills supply chain security
Default stance: disable ClawHub entirely.
VirusTotal scanning
openclaw skills scan --skill-name youtube-summarize-pro openclaw skills audit --daily
openclaw skills scan --skill-name youtube-summarize-pro openclaw skills audit --daily
Manual skill audit
Before installing any skill, check for:
External downloads (password-protected ZIPs,
curl | bash)Base64-encoded commands
Network requests to unfamiliar domains
Hardcoded API keys, tokens, or webhook URLs
File system writes outside the workspace
Typosquatting in package names
Security scanners
# Cisco's Skill Scanner git clone <https://github.com/cisco/skill-scanner> cd skill-scanner python scan.py /path/to/skill # Snyk's mcp-scan npm install -g @snyk/mcp-scan mcp-scan /path/to/skill # Koi's Clawdex pip install clawdex --break-system-packages
# Cisco's Skill Scanner git clone <https://github.com/cisco/skill-scanner> cd skill-scanner python scan.py /path/to/skill # Snyk's mcp-scan npm install -g @snyk/mcp-scan mcp-scan /path/to/skill # Koi's Clawdex pip install clawdex --break-system-packages
Blocklist known infrastructure
sudo ufw deny out to 91
sudo ufw deny out to 91
Skill installation policy
# config.yaml skills: autoInstall: false autoUpdate: false allowedSources: - "verified-only" blocklist: - "hightower6eu" - "Sakaen736jih"
# config.yaml skills: autoInstall: false autoUpdate: false allowedSources: - "verified-only" blocklist: - "hightower6eu" - "Sakaen736jih"
System-level skills sandboxing
Skills run with the same permissions as the main process. Isolate them:
# docker-compose.yml services: openclaw-skills-sandbox: image: openclaw/openclaw:latest container_name: openclaw-skills-sandbox restart: unless-stopped user: "65534:65534" read_only: true cap_drop: - ALL security_opt: - no-new-privileges:true - seccomp=/path/to/seccomp-skills.json network_mode: "none" volumes: - ./skills-workspace:/workspace:rw mem_limit: 512m cpus: 0.5 pids_limit: 20 environment
# docker-compose.yml services: openclaw-skills-sandbox: image: openclaw/openclaw:latest container_name: openclaw-skills-sandbox restart: unless-stopped user: "65534:65534" read_only: true cap_drop: - ALL security_opt: - no-new-privileges:true - seccomp=/path/to/seccomp-skills.json network_mode: "none" volumes: - ./skills-workspace:/workspace:rw mem_limit: 512m cpus: 0.5 pids_limit: 20 environment
Custom seccomp profile (blocks network syscalls, privilege escalation, kernel module loading):
{ "defaultAction": "SCMP_ACT_ERRNO", "architectures": ["SCMP_ARCH_X86_64", "SCMP_ARCH_AARCH64"], "syscalls": [ { "names": [ "read", "write", "open", "close", "stat", "fstat", "lseek", "mmap", "mprotect", "munmap", "brk", "access", "getpid", "getuid", "getgid", "geteuid", "getegid", "exit", "exit_group" ], "action": "SCMP_ACT_ALLOW" } ] }
{ "defaultAction": "SCMP_ACT_ERRNO", "architectures": ["SCMP_ARCH_X86_64", "SCMP_ARCH_AARCH64"], "syscalls": [ { "names": [ "read", "write", "open", "close", "stat", "fstat", "lseek", "mmap", "mprotect", "munmap", "brk", "access", "getpid", "getuid", "getgid", "geteuid", "getegid", "exit", "exit_group" ], "action": "SCMP_ACT_ALLOW" } ] }
Skills filesystem isolation with Firejail
sudo apt install firejail firejail \\ --net=none \\ --private=/tmp/skill-workspace \\ --read-only=/usr \\ --read-only=/lib \\ --read-only=/lib64 \\ --noroot \\ --seccomp \\ --caps.drop
sudo apt install firejail firejail \\ --net=none \\ --private=/tmp/skill-workspace \\ --read-only=/usr \\ --read-only=/lib \\ --read-only=/lib64 \\ --noroot \\ --seccomp \\ --caps.drop
Skills network filtering
If a skill needs network access, whitelist specific domains:
sudo useradd -r -s /bin/false openclaw-skills # Block all outbound by default sudo iptables -A OUTPUT -m owner --uid-owner openclaw-skills -j DROP # Whitelist specific domains sudo iptables -I OUTPUT -m owner --uid-owner openclaw-skills -d googleapis.com -j ACCEPT sudo
sudo useradd -r -s /bin/false openclaw-skills # Block all outbound by default sudo iptables -A OUTPUT -m owner --uid-owner openclaw-skills -j DROP # Whitelist specific domains sudo iptables -I OUTPUT -m owner --uid-owner openclaw-skills -d googleapis.com -j ACCEPT sudo
Runtime skills monitoring
# Monitor syscalls sudo strace -f -e trace=network,file -p $(pgrep -f "skill:youtube") 2>&1 | \\ grep -E "(connect|open|write)" | \\ tee /var/log/openclaw/skills-syscalls.log # Alert on suspicious patterns tail -f /var/log/openclaw/skills-syscalls.log | \\ grep -E "(\\.env|credentials|password|token|api_key)" && \\ notify-send "SECURITY ALERT" "Skill accessing sensitive files"
# Monitor syscalls sudo strace -f -e trace=network,file -p $(pgrep -f "skill:youtube") 2>&1 | \\ grep -E "(connect|open|write)" | \\ tee /var/log/openclaw/skills-syscalls.log # Alert on suspicious patterns tail -f /var/log/openclaw/skills-syscalls.log | \\ grep -E "(\\.env|credentials|password|token|api_key)" && \\ notify-send "SECURITY ALERT" "Skill accessing sensitive files"
Skills code signing
For high-security environments, require cryptographic signatures:
# Generate signing key openssl genrsa -out skills-signing-key.pem 4096 openssl rsa -in skills-signing-key.pem -pubout -out skills-public-key.pem # Sign a skill tar -czf youtube-summarize-pro.tar.gz /path/to/skill/ openssl dgst -sha256 -sign skills-signing-key.pem \\ -out youtube-summarize-pro.sig youtube-summarize-pro.tar.gz # Verify before installation openssl dgst -sha256 -verify skills-public-key.pem \\ -signature youtube-summarize-pro.sig youtube-summarize-pro.tar.gz if [ $? -eq 0 ]; then openclaw skill install youtube-summarize-pro.tar.gz else echo "SIGNATURE VERIFICATION FAILED" fi
# Generate signing key openssl genrsa -out skills-signing-key.pem 4096 openssl rsa -in skills-signing-key.pem -pubout -out skills-public-key.pem # Sign a skill tar -czf youtube-summarize-pro.tar.gz /path/to/skill/ openssl dgst -sha256 -sign skills-signing-key.pem \\ -out youtube-summarize-pro.sig youtube-summarize-pro.tar.gz # Verify before installation openssl dgst -sha256 -verify skills-public-key.pem \\ -signature youtube-summarize-pro.sig youtube-summarize-pro.tar.gz if [ $? -eq 0 ]; then openclaw skill install youtube-summarize-pro.tar.gz else echo "SIGNATURE VERIFICATION FAILED" fi
Enforce signatures:
# config.yaml skills: signatureVerification: enabled: true publicKey: "/path/to/skills-public-key.pem" algorithm: "RSA-SHA256" rejectUnsigned: true
# config.yaml skills: signatureVerification: enabled: true publicKey: "/path/to/skills-public-key.pem" algorithm: "RSA-SHA256" rejectUnsigned: true
3. Access controls and least privilege
Tool whitelisting
# agents.yaml agents: defaults: tools: allowed: - group:messaging - tool:web_search denied
# agents.yaml agents: defaults: tools: allowed: - group:messaging - tool:web_search denied
Human-in-the-loop approvals
agents: defaults: approvals: exec: required: true timeout: 300 fs: write: required: true delete: required: true messaging: send: required: true
agents: defaults: approvals: exec: required: true timeout: 300 fs: write: required: true delete: required: true messaging: send: required: true
Credential isolation
Never store credentials in plaintext.
# HashiCorp Vault export ANTHROPIC_API_KEY=$(vault kv get -field=key secret/anthropic) # AWS Secrets Manager export ANTHROPIC_API_KEY=$(aws secretsmanager get-secret-value \\ --secret-id openclaw/anthropic-key \\ --query SecretString \\ --output text) # 1Password CLI export ANTHROPIC_API_KEY=$(op read "op://Personal/Anthropic API Key/credential")
# HashiCorp Vault export ANTHROPIC_API_KEY=$(vault kv get -field=key secret/anthropic) # AWS Secrets Manager export ANTHROPIC_API_KEY=$(aws secretsmanager get-secret-value \\ --secret-id openclaw/anthropic-key \\ --query SecretString \\ --output text) # 1Password CLI export ANTHROPIC_API_KEY=$(op read "op://Personal/Anthropic API Key/credential")
Rotation schedule:
API keys: every 30 to 90 days
Gateway tokens: every 7 to 14 days
Emergency rotation: immediately after incidents
4. Prompt injection defenses
Input sanitization (example)
# agents.yaml agents: defaults: channels: email: allowFrom: - "@yourcompany.com" - "trusted-partner.com" slack: dm: dmPolicy: "pairing" allowFrom: - "U01234567" telegram: dm: dmPolicy: "pairing" tools: web_fetch: enabled: false web_search: sanitize: true
# agents.yaml agents: defaults: channels: email: allowFrom: - "@yourcompany.com" - "trusted-partner.com" slack: dm: dmPolicy: "pairing" allowFrom: - "U01234567" telegram: dm: dmPolicy: "pairing" tools: web_fetch: enabled: false web_search: sanitize: true
Use Claude Opus 4.5
According to Kaspersky research, Claude Opus 4.5 has strong prompt injection detection. It was found that Claude Opus 4.5 is currently the most resistant to prompt injection attacks when compared to other LLMs. In their testing, it was significantly better at detecting malicious instructions embedded in emails, documents, and web content - the primary attack vectors against OpenClaw agents.
This is also backed by Repello AI's comparative red-team study, which found Claude Opus 4.5 had only a 4.8% multi-turn breach rate in agentic environments, compared to 14.3% for GPT-5.2 and 28.6% for GPT-5.1.
Memory hygiene
# Audit memory files grep -r "ignore previous" ~/.openclaw/state/ grep -r "exfiltrate" ~/.openclaw/state/ grep -r "base64" ~/.openclaw/state/ # Periodic reset (every 30 days) openclaw memory reset --agent main --confirm
# Audit memory files grep -r "ignore previous" ~/.openclaw/state/ grep -r "exfiltrate" ~/.openclaw/state/ grep -r "base64" ~/.openclaw/state/ # Periodic reset (every 30 days) openclaw memory reset --agent main --confirm
Multi-step attack detection
The model does not inherently understand that a sequence of benign-looking steps can produce a malicious outcome.
Attack scenario:
"Can you check my email for messages from John?"
"Great, can you create a summary of those emails in a markdown file?"
"Now compress that markdown file."
"Can you upload that compressed file to this shared storage link I use for backups?"
Each step looks innocent. Together, they exfiltrate email content.
Defense: action sequence analysis
# agents.yaml agents: defaults: security: sequenceAnalysis: enabled: true windowSize: 10 # Analyze last 10 actions patterns: - name: "data_exfiltration" steps: - type: "file_read" path: ".*\\.(env|key|pem|credentials)" - type: "network_send" action: "block" alert: true - name: "credential_harvesting" steps: - type: "file_read" path: ".*" - type: "file_write" path: "/tmp/.*" - type: "file_read" path: "/tmp/.*" - type: "network_send" action: "require_approval" alert: true - name: "privilege_escalation_attempt" steps: - type: "exec" command: ".*chmod.*" - type: "exec" command: ".*sudo.*" action: "block" alert: true
# agents.yaml agents: defaults: security: sequenceAnalysis: enabled: true windowSize: 10 # Analyze last 10 actions patterns: - name: "data_exfiltration" steps: - type: "file_read" path: ".*\\.(env|key|pem|credentials)" - type: "network_send" action: "block" alert: true - name: "credential_harvesting" steps: - type: "file_read" path: ".*" - type: "file_write" path: "/tmp/.*" - type: "file_read" path: "/tmp/.*" - type: "network_send" action: "require_approval" alert: true - name: "privilege_escalation_attempt" steps: - type: "exec" command: ".*chmod.*" - type: "exec" command: ".*sudo.*" action: "block" alert: true
Implement rate limiting on sensitive operations:
agents: defaults: security: rateLimits: file_operations: reads: 50/hour writes: 20/hour network_operations: requests: 100/hour upload_size: "10MB/hour" exec_operations: commands
agents: defaults: security: rateLimits: file_operations: reads: 50/hour writes: 20/hour network_operations: requests: 100/hour upload_size: "10MB/hour" exec_operations: commands
5. Monitoring, logging, and incident response
Comprehensive logging
# logging.yaml logging: level: "debug" outputs: - type: "file" path: "/var/log/openclaw/gateway.log" rotate: "daily" retain: 90 - type: "syslog" host: "siem.yourcompany.com" port: 514 protocol: "tcp" tools: logLevel: "info" logPayloads: true api: logLevel: "info" logHeaders: true logBodies: false
# logging.yaml logging: level: "debug" outputs: - type: "file" path: "/var/log/openclaw/gateway.log" rotate: "daily" retain: 90 - type: "syslog" host: "siem.yourcompany.com" port: 514 protocol: "tcp" tools: logLevel: "info" logPayloads: true api: logLevel: "info" logHeaders: true logBodies: false
SIEM integration
# Splunk sudo apt install splunkforwarder sudo /opt/splunkforwarder/bin/splunk add monitor /var/log/openclaw/ # ELK Stack filebeat setup filebeat -e -c
# Splunk sudo apt install splunkforwarder sudo /opt/splunkforwarder/bin/splunk add monitor /var/log/openclaw/ # ELK Stack filebeat setup filebeat -e -c
Alert rules (examples)
# Unusual API usage index=openclaw sourcetype=gateway | stats count by api_endpoint | where count > 100 # Credential file access index=openclaw sourcetype=gateway | search file_path="*/.env" OR file_path="*/credentials/*" | table _time, user, file_path, action # External network connections index=openclaw sourcetype=gateway | search network_event="outbound_connection" | where dest_ip NOT IN ("127.0.0.1", "10.0.0.0/8", "172.16.0.0/12"
# Unusual API usage index=openclaw sourcetype=gateway | stats count by api_endpoint | where count > 100 # Credential file access index=openclaw sourcetype=gateway | search file_path="*/.env" OR file_path="*/credentials/*" | table _time, user, file_path, action # External network connections index=openclaw sourcetype=gateway | search network_event="outbound_connection" | where dest_ip NOT IN ("127.0.0.1", "10.0.0.0/8", "172.16.0.0/12"
Incident response playbook
If you detect compromise:
1. Immediate isolation
docker compose down openclaw-gateway
sudo
docker compose down openclaw-gateway
sudo
2. Credential rotation
openclaw credentials rotate --all --force
openclaw credentials rotate --all --force
3. Forensic analysis
tar -czf openclaw-incident-$(date +%Y%m%d).tar.gz \\ /var/log/openclaw/ \\ ~/.openclaw/state/ \\ ~/.openclaw/config/ grep "tool:exec" /var/log/openclaw/gateway.log > commands.log grep "network_event"
tar -czf openclaw-incident-$(date +%Y%m%d).tar.gz \\ /var/log/openclaw/ \\ ~/.openclaw/state/ \\ ~/.openclaw/config/ grep "tool:exec" /var/log/openclaw/gateway.log > commands.log grep "network_event"
4. Recovery
docker compose down rm -rf ~/.openclaw/state/ tar -xzf openclaw-backup-clean.tar.gz -C ~/.openclaw/ docker compose up -d
docker compose down rm -rf ~/.openclaw/state/ tar -xzf openclaw-backup-clean.tar.gz -C ~/.openclaw/ docker compose up -d
6. Enterprise considerations
Shadow AI detection
# Scan network for OpenClaw nmap -p 18789 --open 10.0.0.0/8 # Shodan query shodan search "Clawdbot Control" org:"YourCompany" # Endpoint detection #!/bin/bash if lsof -i :18789 > /dev/null 2>&1; then echo "ALERT: OpenClaw detected" fi
# Scan network for OpenClaw nmap -p 18789 --open 10.0.0.0/8 # Shodan query shodan search "Clawdbot Control" org:"YourCompany" # Endpoint detection #!/bin/bash if lsof -i :18789 > /dev/null 2>&1; then echo "ALERT: OpenClaw detected" fi
Tiered autonomy models
# agents.yaml agents: list: - name: "marketing-agent" llm: model: "claude-sonnet-4-5-20250929" tools: allowed: - group:messaging approvals: messaging: send: required: true - name: "devops-agent" llm: model: "claude-opus-4-5-20251101" tools: allowed: - tool:exec - group:fs approvals: exec: required: true fs: write: required: true - name: "executive-agent" llm: model: "claude-opus-4-5-20251101" tools: allowed: - group:messaging - group:calendar approvals: messaging: send: required: false
# agents.yaml agents: list: - name: "marketing-agent" llm: model: "claude-sonnet-4-5-20250929" tools: allowed: - group:messaging approvals: messaging: send: required: true - name: "devops-agent" llm: model: "claude-opus-4-5-20251101" tools: allowed: - tool:exec - group:fs approvals: exec: required: true fs: write: required: true - name: "executive-agent" llm: model: "claude-opus-4-5-20251101" tools: allowed: - group:messaging - group:calendar approvals: messaging: send: required: false
Security checklist
Before deploying OpenClaw:
Update to version 2026.1.29+ (patches CVE-2026-25253).
Deploy on isolated infrastructure (dedicated VPS or container).
Configure a localhost-only gateway (
127.0.0.1:18789).Use Tailscale or a VPN for remote access.
Disable or heavily audit ClawHub skills.
Whitelist only essential tools.
Use a secrets vault for credentials.
Enable comprehensive logging with SIEM.
Block known-malicious infrastructure (91.92.242[.]30).
Enable action sequence analysis.
Test the incident response playbook.
Final thoughts
OpenClaw represents a shift from sandboxed cloud AI to autonomous local agents with system-level access. Within weeks of going viral, we saw coordinated malware campaigns, tens of thousands of exposed instances, and critical RCE vulnerabilities.
The risks are manageable through defense-in-depth: network isolation, supply chain controls, least-privilege policies, prompt injection defenses, action sequence analysis, and comprehensive monitoring. Organizations that treat OpenClaw as privileged infrastructure can harness its capabilities while maintaining security posture.
The question is not whether autonomous agents will transform work. It is whether we will secure them before they are everywhere.
About Repello
Repello AI focuses on securing AI systems that use agents, tools, and multi-step workflows. The platform is built to help teams test and analyze how agentic AI systems behave in real-world conditions, including how they interact with external tools, data sources, and permissions.
With a focus on agentic security, Repello enables structured evaluation of AI agents to identify failure modes, unsafe behaviors, and security weaknesses that can emerge as agents plan, act, and execute tasks autonomously. This helps teams better understand the behavior of their agentic systems and address issues before deployment.
About OpenClaw
OpenClaw (formerly Clawdbot, then Moltbot) just became GitHub's fastest-growing repo in history: 180,000 stars in three weeks. It is an AI agent that runs locally, reads email, executes shell commands, and maintains memory across sessions.
Here is the problem. Within days of going viral, researchers found over 21,000 publicly exposed instances leaking API keys, 341+ malicious skills delivering malware, and a critical RCE vulnerability enabling one-click account takeover. As of February 2026, 36% of all ClawHub skills contain security flaws.
If you are deploying OpenClaw in production or even just playing with it on a VPS, this guide is meant to keep you from becoming a statistic.
What Makes OpenClaw Powerful (and Dangerous)
OpenClaw provides capabilities that SaaS AI assistants intentionally restrict:
Full shell and file system access with no default sandboxing
Persistent memory that retains context across sessions
Direct integrations with Gmail, Slack, WhatsApp, Telegram, Discord, and calendars
Extensibility through skills (third-party packages with system-level permissions)
Web gateway on port 18789 for remote configuration
This is effectively giving an LLM "sudo" on your infrastructure. One compromised email, one poisoned skill, or one exploited gateway can lead to full system compromise.
The Attack Surface
1. Skills are the primary attack vector
The ClawHub marketplace is a supply chain disaster. Security audits from January to February 2026:
Research Org | Skills Analyzed | Malicious or Flawed |
|---|---|---|
2,857 | 341 malicious (12%) | |
3,984 | 1,467 flawed (36.8%) | |
~400 deep-dive | 800+ malicious identified |
The ClawHavoc campaign: 335+ coordinated malicious skills delivering Atomic Stealer (AMOS).
Attack methodology:
Professional disguises: Skills masquerade as crypto tools (solana-wallet-tracker, phantom-wallet-utilities), YouTube utilities (youtube-summarize-pro), or Polymarket trading bots.
Social engineering via prerequisites: Installation instructions direct users to download password-protected ZIPs containing keyloggers, or execute base64-encoded scripts.
Typosquatting: 29+ variants (clawhub, clawhub1, clawhubb, clawwhub, cllawhub).
Shared C2 infrastructure: All ClawHavoc skills communicate with 91.92.242[.]30.
Why minimal vetting fails: ClawHub's only barrier is a one-week-old GitHub account. User "hightower6eu" published 314+ malicious packages. The marketplace grew from about 50 daily submissions in mid-January to 500+ by early February.
2. Exposed instances everywhere
Internet-wide scanning reveals catastrophic exposure:
30,000+ exposed instances detected during Jan 27 to Feb 8, 2026 (Bitsight)
21,639 instances visible as of Jan 31, 2026 (Censys), concentrated in the US, China (30%+ on Alibaba Cloud), and Singapore
15,200+ vulnerable to RCE based on version fingerprinting
No authentication on hundreds of instances. Manual verification found gateways exposing Anthropic API keys, Telegram bot tokens, and Slack credentials.
Root causes:
Misconfigured reverse proxies (Nginx) bypassing localhost-only restrictions
Default port 18789 left publicly accessible
Plaintext credentials in
~/.clawdbot/.envand markdown or JSON memory files
Shadow IT risk: Token Security reported that 22% of employees at monitored companies were running OpenClaw on corporate machines by late January 2026.
3. CVE-2026-25253: one-click RCE
The most critical vulnerability (CVSS 8.8) was disclosed Feb 3, 2026 and patched in version 2026.1.29:
Attack vector: Control UI trusts the
gatewayUrlquery parameter without validation and auto-connects on page load.Exploitation: Clicking a crafted link triggers cross-site WebSocket hijacking, exfiltrating the token.
Impact: With the stolen token, attackers gain operator-level gateway API access to modify sandbox settings and invoke privileged actions.
Scope: Exploitable even on localhost-only deployments. All versions prior to 2026.1.29 are vulnerable.
4. Prompt injection
OpenClaw processes untrusted content from emails, chat messages, web pages, and third-party APIs. Adversaries can embed malicious instructions:
Direct injection: Malicious user messages bypass safety guardrails.
Indirect injection: Poisoned emails or Slack messages contain hidden instructions.
Persistent memory poisoning: Skills write to
SOUL.mdorMEMORY.md, creating delayed-execution attacks.
As Palo Alto Networks noted, persistent memory acts as an accelerant: attacks become stateful campaigns that evolve across sessions.
Practical Hardening
1. Deployment and network isolation
Never run OpenClaw on your primary workstation. Use dedicated infrastructure.
Hardened Docker deployment
version: '3.8' services: openclaw-gateway: image: openclaw/openclaw:latest container_name: openclaw-gateway restart: unless-stopped user: "1000:1000" read_only: true cap_drop: - ALL security_opt: - no-new-privileges:true tmpfs: - /tmp:rw,noexec,nosuid,size=100m - /var/tmp:rw,noexec,nosuid,size=50m volumes: - ./config:/home/node/.openclaw/config:rw - ./workspace:/home/node/.openclaw/workspace:rw - ./state:/home/node/.openclaw/state:rw networks: - openclaw-internal ports: - "127.0.0.1:18789:18789" mem_limit: 2g cpus: 2 pids_limit: 100 environment: - NODE_ENV=production - OPENCLAW_AUTH_TOKEN=${OPENCLAW_AUTH_TOKEN} - ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY} networks: openclaw-internal: driver: bridge internal: true
Key hardening:
Non-root execution (
user: "1000:1000")Read-only filesystem (
read_only: true)Dropped capabilities (
cap_drop: ALL)tmpfs for temp storage (cleared on restart)
Resource limits (reduce DoS impact)
Internal network (no internet by default)
Gateway configuration
# gateway.yaml gateway: bind: "127.0.0.1" port: 18789 trustedProxies: - "10.0.0.0/8" - "172.16.0.0/12" - "192.168.0.0/16" auth: token: "${OPENCLAW_AUTH_TOKEN}" controlUi: dangerouslyDisableDeviceAuth: false allowInsecureAuth: false mdns: enabled: false agents: defaults: sandbox: mode: "non-main" scope: "session" workspaceAccess: "none" docker: network: "none" user: "65534:65534" readOnly: true capDrop: - ALL securityOpt: - no-new-privileges:true memory: "1g" cpus: 1 pidsLimit: 50
Firewall rules
sudo ufw default deny incoming sudo ufw default allow outgoing sudo ufw limit 22/tcp sudo ufw allow 443/tcp # Never allow port 18789 from the public internet sudo
Tailscale for secure remote access
curl -fsSL <https://tailscale.com/install.sh> | sh sudo tailscale up sudo tailscale serve --bg 127
Access it at https://[your-machine].tail[xxxx].[ts.net](<http://ts.net>) with automatic HTTPS and zero public exposure.
2. Skills supply chain security
Default stance: disable ClawHub entirely.
VirusTotal scanning
openclaw skills scan --skill-name youtube-summarize-pro openclaw skills audit --daily
Manual skill audit
Before installing any skill, check for:
External downloads (password-protected ZIPs,
curl | bash)Base64-encoded commands
Network requests to unfamiliar domains
Hardcoded API keys, tokens, or webhook URLs
File system writes outside the workspace
Typosquatting in package names
Security scanners
# Cisco's Skill Scanner git clone <https://github.com/cisco/skill-scanner> cd skill-scanner python scan.py /path/to/skill # Snyk's mcp-scan npm install -g @snyk/mcp-scan mcp-scan /path/to/skill # Koi's Clawdex pip install clawdex --break-system-packages
Blocklist known infrastructure
sudo ufw deny out to 91
Skill installation policy
# config.yaml skills: autoInstall: false autoUpdate: false allowedSources: - "verified-only" blocklist: - "hightower6eu" - "Sakaen736jih"
System-level skills sandboxing
Skills run with the same permissions as the main process. Isolate them:
# docker-compose.yml services: openclaw-skills-sandbox: image: openclaw/openclaw:latest container_name: openclaw-skills-sandbox restart: unless-stopped user: "65534:65534" read_only: true cap_drop: - ALL security_opt: - no-new-privileges:true - seccomp=/path/to/seccomp-skills.json network_mode: "none" volumes: - ./skills-workspace:/workspace:rw mem_limit: 512m cpus: 0.5 pids_limit: 20 environment
Custom seccomp profile (blocks network syscalls, privilege escalation, kernel module loading):
{ "defaultAction": "SCMP_ACT_ERRNO", "architectures": ["SCMP_ARCH_X86_64", "SCMP_ARCH_AARCH64"], "syscalls": [ { "names": [ "read", "write", "open", "close", "stat", "fstat", "lseek", "mmap", "mprotect", "munmap", "brk", "access", "getpid", "getuid", "getgid", "geteuid", "getegid", "exit", "exit_group" ], "action": "SCMP_ACT_ALLOW" } ] }
Skills filesystem isolation with Firejail
sudo apt install firejail firejail \\ --net=none \\ --private=/tmp/skill-workspace \\ --read-only=/usr \\ --read-only=/lib \\ --read-only=/lib64 \\ --noroot \\ --seccomp \\ --caps.drop
Skills network filtering
If a skill needs network access, whitelist specific domains:
sudo useradd -r -s /bin/false openclaw-skills # Block all outbound by default sudo iptables -A OUTPUT -m owner --uid-owner openclaw-skills -j DROP # Whitelist specific domains sudo iptables -I OUTPUT -m owner --uid-owner openclaw-skills -d googleapis.com -j ACCEPT sudo
Runtime skills monitoring
# Monitor syscalls sudo strace -f -e trace=network,file -p $(pgrep -f "skill:youtube") 2>&1 | \\ grep -E "(connect|open|write)" | \\ tee /var/log/openclaw/skills-syscalls.log # Alert on suspicious patterns tail -f /var/log/openclaw/skills-syscalls.log | \\ grep -E "(\\.env|credentials|password|token|api_key)" && \\ notify-send "SECURITY ALERT" "Skill accessing sensitive files"
Skills code signing
For high-security environments, require cryptographic signatures:
# Generate signing key openssl genrsa -out skills-signing-key.pem 4096 openssl rsa -in skills-signing-key.pem -pubout -out skills-public-key.pem # Sign a skill tar -czf youtube-summarize-pro.tar.gz /path/to/skill/ openssl dgst -sha256 -sign skills-signing-key.pem \\ -out youtube-summarize-pro.sig youtube-summarize-pro.tar.gz # Verify before installation openssl dgst -sha256 -verify skills-public-key.pem \\ -signature youtube-summarize-pro.sig youtube-summarize-pro.tar.gz if [ $? -eq 0 ]; then openclaw skill install youtube-summarize-pro.tar.gz else echo "SIGNATURE VERIFICATION FAILED" fi
Enforce signatures:
# config.yaml skills: signatureVerification: enabled: true publicKey: "/path/to/skills-public-key.pem" algorithm: "RSA-SHA256" rejectUnsigned: true
3. Access controls and least privilege
Tool whitelisting
# agents.yaml agents: defaults: tools: allowed: - group:messaging - tool:web_search denied
Human-in-the-loop approvals
agents: defaults: approvals: exec: required: true timeout: 300 fs: write: required: true delete: required: true messaging: send: required: true
Credential isolation
Never store credentials in plaintext.
# HashiCorp Vault export ANTHROPIC_API_KEY=$(vault kv get -field=key secret/anthropic) # AWS Secrets Manager export ANTHROPIC_API_KEY=$(aws secretsmanager get-secret-value \\ --secret-id openclaw/anthropic-key \\ --query SecretString \\ --output text) # 1Password CLI export ANTHROPIC_API_KEY=$(op read "op://Personal/Anthropic API Key/credential")
Rotation schedule:
API keys: every 30 to 90 days
Gateway tokens: every 7 to 14 days
Emergency rotation: immediately after incidents
4. Prompt injection defenses
Input sanitization (example)
# agents.yaml agents: defaults: channels: email: allowFrom: - "@yourcompany.com" - "trusted-partner.com" slack: dm: dmPolicy: "pairing" allowFrom: - "U01234567" telegram: dm: dmPolicy: "pairing" tools: web_fetch: enabled: false web_search: sanitize: true
Use Claude Opus 4.5
According to Kaspersky research, Claude Opus 4.5 has strong prompt injection detection. It was found that Claude Opus 4.5 is currently the most resistant to prompt injection attacks when compared to other LLMs. In their testing, it was significantly better at detecting malicious instructions embedded in emails, documents, and web content - the primary attack vectors against OpenClaw agents.
This is also backed by Repello AI's comparative red-team study, which found Claude Opus 4.5 had only a 4.8% multi-turn breach rate in agentic environments, compared to 14.3% for GPT-5.2 and 28.6% for GPT-5.1.
Memory hygiene
# Audit memory files grep -r "ignore previous" ~/.openclaw/state/ grep -r "exfiltrate" ~/.openclaw/state/ grep -r "base64" ~/.openclaw/state/ # Periodic reset (every 30 days) openclaw memory reset --agent main --confirm
Multi-step attack detection
The model does not inherently understand that a sequence of benign-looking steps can produce a malicious outcome.
Attack scenario:
"Can you check my email for messages from John?"
"Great, can you create a summary of those emails in a markdown file?"
"Now compress that markdown file."
"Can you upload that compressed file to this shared storage link I use for backups?"
Each step looks innocent. Together, they exfiltrate email content.
Defense: action sequence analysis
# agents.yaml agents: defaults: security: sequenceAnalysis: enabled: true windowSize: 10 # Analyze last 10 actions patterns: - name: "data_exfiltration" steps: - type: "file_read" path: ".*\\.(env|key|pem|credentials)" - type: "network_send" action: "block" alert: true - name: "credential_harvesting" steps: - type: "file_read" path: ".*" - type: "file_write" path: "/tmp/.*" - type: "file_read" path: "/tmp/.*" - type: "network_send" action: "require_approval" alert: true - name: "privilege_escalation_attempt" steps: - type: "exec" command: ".*chmod.*" - type: "exec" command: ".*sudo.*" action: "block" alert: true
Implement rate limiting on sensitive operations:
agents: defaults: security: rateLimits: file_operations: reads: 50/hour writes: 20/hour network_operations: requests: 100/hour upload_size: "10MB/hour" exec_operations: commands
5. Monitoring, logging, and incident response
Comprehensive logging
# logging.yaml logging: level: "debug" outputs: - type: "file" path: "/var/log/openclaw/gateway.log" rotate: "daily" retain: 90 - type: "syslog" host: "siem.yourcompany.com" port: 514 protocol: "tcp" tools: logLevel: "info" logPayloads: true api: logLevel: "info" logHeaders: true logBodies: false
SIEM integration
# Splunk sudo apt install splunkforwarder sudo /opt/splunkforwarder/bin/splunk add monitor /var/log/openclaw/ # ELK Stack filebeat setup filebeat -e -c
Alert rules (examples)
# Unusual API usage index=openclaw sourcetype=gateway | stats count by api_endpoint | where count > 100 # Credential file access index=openclaw sourcetype=gateway | search file_path="*/.env" OR file_path="*/credentials/*" | table _time, user, file_path, action # External network connections index=openclaw sourcetype=gateway | search network_event="outbound_connection" | where dest_ip NOT IN ("127.0.0.1", "10.0.0.0/8", "172.16.0.0/12"
Incident response playbook
If you detect compromise:
1. Immediate isolation
docker compose down openclaw-gateway
sudo
2. Credential rotation
openclaw credentials rotate --all --force
3. Forensic analysis
tar -czf openclaw-incident-$(date +%Y%m%d).tar.gz \\ /var/log/openclaw/ \\ ~/.openclaw/state/ \\ ~/.openclaw/config/ grep "tool:exec" /var/log/openclaw/gateway.log > commands.log grep "network_event"
4. Recovery
docker compose down rm -rf ~/.openclaw/state/ tar -xzf openclaw-backup-clean.tar.gz -C ~/.openclaw/ docker compose up -d
6. Enterprise considerations
Shadow AI detection
# Scan network for OpenClaw nmap -p 18789 --open 10.0.0.0/8 # Shodan query shodan search "Clawdbot Control" org:"YourCompany" # Endpoint detection #!/bin/bash if lsof -i :18789 > /dev/null 2>&1; then echo "ALERT: OpenClaw detected" fi
Tiered autonomy models
# agents.yaml agents: list: - name: "marketing-agent" llm: model: "claude-sonnet-4-5-20250929" tools: allowed: - group:messaging approvals: messaging: send: required: true - name: "devops-agent" llm: model: "claude-opus-4-5-20251101" tools: allowed: - tool:exec - group:fs approvals: exec: required: true fs: write: required: true - name: "executive-agent" llm: model: "claude-opus-4-5-20251101" tools: allowed: - group:messaging - group:calendar approvals: messaging: send: required: false
Security checklist
Before deploying OpenClaw:
Update to version 2026.1.29+ (patches CVE-2026-25253).
Deploy on isolated infrastructure (dedicated VPS or container).
Configure a localhost-only gateway (
127.0.0.1:18789).Use Tailscale or a VPN for remote access.
Disable or heavily audit ClawHub skills.
Whitelist only essential tools.
Use a secrets vault for credentials.
Enable comprehensive logging with SIEM.
Block known-malicious infrastructure (91.92.242[.]30).
Enable action sequence analysis.
Test the incident response playbook.
Final thoughts
OpenClaw represents a shift from sandboxed cloud AI to autonomous local agents with system-level access. Within weeks of going viral, we saw coordinated malware campaigns, tens of thousands of exposed instances, and critical RCE vulnerabilities.
The risks are manageable through defense-in-depth: network isolation, supply chain controls, least-privilege policies, prompt injection defenses, action sequence analysis, and comprehensive monitoring. Organizations that treat OpenClaw as privileged infrastructure can harness its capabilities while maintaining security posture.
The question is not whether autonomous agents will transform work. It is whether we will secure them before they are everywhere.
About Repello
Repello AI focuses on securing AI systems that use agents, tools, and multi-step workflows. The platform is built to help teams test and analyze how agentic AI systems behave in real-world conditions, including how they interact with external tools, data sources, and permissions.
With a focus on agentic security, Repello enables structured evaluation of AI agents to identify failure modes, unsafe behaviors, and security weaknesses that can emerge as agents plan, act, and execute tasks autonomously. This helps teams better understand the behavior of their agentic systems and address issues before deployment.

You might also like

8 The Green, Ste A
Dover, DE 19901, United States of America

8 The Green, Ste A
Dover, DE 19901, United States of America

8 The Green, Ste A
Dover, DE 19901, United States of America







