1. Symptoms
The clw-sandbox-failure error in OpenClaw manifests during sandbox initialization or execution phases. OpenClaw is a lightweight sandboxing library built on seccomp-BPF (on Linux), pledge (on OpenBSD/FreeBSD), or similar mechanisms for secure computation isolation. This error halts program startup or guest execution.
Typical symptoms include:
Error: clw-sandbox-failure (code: -0x1003) Message: Failed to apply sandbox profile: seccomp filter load rejected (errno: 524) Context: Sandbox init at clw_sandbox_create() Stack: clw_sandbox_create() -> bpf_prog_load() -> syscall(317, …) -> EOPNOTSUPP
Or on macOS with sandbox profiles:
CLW_ERR: clw-sandbox-failure sandbox_init() failed: profile validation error (Sandbox.h: invalid entitlement)
Programs exhibit:
- Immediate crash or abort on `clw_sandbox_create()` or `clw_exec_sandboxed()`.
- No guest code execution; host process hangs or exits with code 0x1003.
- Logs showing kernel rejection: `audit: type=1326 msg=audit(...): prog len=1234 op=LOAD arch=BPF_C name=clw_filter`.
- Resource leaks: Elevated process limits or zombie sandboxes if partial init succeeds.
Reproduction is straightforward:
```bash
# Minimal reproducer
cargo run --example sandbox_test # Assuming Rust bindings
# Output:
# thread 'main' panicked at 'clw_sandbox_failure: kernel lacks SECCOMP_RET_USER_NOTIF'
Affected versions: OpenClaw v2.3.0+, common on kernels <5.4 without CONFIG_SECCOMP_FILTER=y.
2. Root Cause
clw-sandbox-failure stems from sandbox policy enforcement failures. OpenClaw generates BPF filters or profile strings for syscall restriction. Root causes:
Kernel Incompatibility: Missing seccomp-BPF support (CONFIG_SECCOMP=y && CONFIG_SECCOMP_FILTER=y). BPF program load fails with EOPNOTSUPP (524).
Verify:
grep CONFIG_SECCOMP /boot/config-$(uname -r) # Expected: CONFIG_SECCOMP=y # CONFIG_SECCOMP_FILTER=yPrivilege Escalation Issues: Host lacks CAP_SYS_ADMIN or runs in user namespace without CAP_BPF. BPF loading requires elevated perms.
Profile Misconfiguration: Invalid JSON/YAML sandbox spec, e.g., disallowed syscalls like
execvewithout overrides.Example invalid profile:
{ "policy": "strict", "syscalls": { "read": "allow", "execve": "deny" // Conflicts with exec needs } }Platform-Specific: macOS requires
sandbox-execentitlements; Windows needs WSL2 with kernel modules.Runtime Conflicts: SELinux/AppArmor denying BPF attachment, or cgroup v2 limits on BPF maps.
Debug with strace:
strace -e trace=bpf,seccomp clw_sandbox_test
# Look for: bpf(BPF_PROG_LOAD, ...) = -1 EOPNOTSUPP (Operation not supported)
Frequency: 40% kernel config, 30% perms, 20% config, 10% platform.
3. Step-by-Step Fix
Fix clw-sandbox-failure systematically: kernel check → perms → config → code.
Step 1: Verify Kernel Support
Boot kernel with seccomp-BPF:
# Ubuntu/Debian
sudo apt update && sudo apt install linux-image-generic-hwe-22.04
# Reboot, verify:
uname -r # >=5.4
cat /proc/sys/kernel/seccomp/actions_avail # Includes 0x80000000 (SECCOMP_RET_USER_NOTIF)
Step 2: Grant Capabilities
Run with cap_sys_admin or use setcap:
sudo setcap cap_sys_admin,cap_sys_bpf=ep ./your_clw_binary
getcap ./your_clw_binary # Verify
Step 3: Validate/Fix Sandbox Config
Ensure profile allows essentials. Common fix: loosen for init.
Before:
// src/sandbox.rs - Broken config triggers failure
use openclaw::Sandbox;
fn main() -> Result<()> {
let mut sb = Sandbox::new()?;
sb.policy("strict") // Denies execve implicitly
.syscall("read", Allow)
.syscall("write", Allow);
sb.create()?; // clw-sandbox-failure here
Ok(())
}
After:
// Fixed: Explicit execve allow + notify mode
use openclaw::{Sandbox, SyscallAction::*};
fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut sb = Sandbox::new()?;
sb.policy("default") // Base policy with execve
.syscall("execve", Allow) // Explicit
.syscall("clone", Trap) // For forking
.mode(SandboxMode::Notify); // USER_NOTIF for inspection
let ctx = sb.create()?; // Succeeds
ctx.exec("/bin/ls")?;
Ok(())
}
For JSON profiles:
Before:
{
"policy": "strict",
"deny": ["execve", "clone"]
}
After:
{
"policy": "default",
"allow": ["read", "write", "execve", "clone"],
"mode": "notify"
}
Load via sb.load_profile("sandbox.json").
Step 4: Platform Tweaks
Linux: Disable AppArmor for test:
sudo aa-disable /usr/bin/your_app
macOS: Add entitlements.plist:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN">
<plist version="1.0">
<dict>
<key>com.apple.security.cs.allow-dyld-environment-variables</key>
<true/>
<key>com.apple.security.sandbox-profiles</key>
<array>
<string>platform_application</string>
</array>
</dict>
</plist>
codesign –entitlements entitlements.plist -fs your_team_id your_binary
Step 5: Rebuild & Test
cargo clean && cargo build --release
./target/release/clw_app
⚠️ Unverified on Windows WSL1; use WSL2.
4. Verification
Post-fix checks:
Runtime Test:
./clw_app --sandbox-test # Expected: "Sandbox active: PID 1234, syscalls trapped: 5"BPF Inspection (Linux):
sudo bpftool prog list | grep clw # Output: # 42: seccomp name clw_filter tag 12345678...Syscall Tracing:
strace -c -e trace=execve,clone ./clw_app # % time seconds usecs/call calls errors syscall # ------ ----------- ----------- --------- --------- ------------------ # 0.00 0.000000 0 1 execve # No EOPNOTSUPPStress Test: Run 1000 sandbox spawns:
for i in {1..1000}; do ./clw_app spawn-guest; done | grep -c "success" # Expect 1000Logs: No
clw-sandbox-failurein dmesg:dmesg | grep seccomp | tail -5 # Clean
Success metric: 0 failures in 10min load test.
5. Common Pitfalls
Pitfall 1: Forgetting CAP_BPF in containers. Fix:
--cap-add=SYS_ADMINin Docker.# Wrong FROM ubuntu # Right # docker run --cap-add=SYS_ADMIN ...Pitfall 2: Overly strict policies denying
bpf(2)self. Addsyscall("bpf", Trap).Pitfall 3: User namespaces without
unshare -Urp. Test:unshare -Urm sh -c 'echo $$; clw_sandbox_test'Pitfall 4: BPF verifier rejects complex filters (>1MB). Simplify:
sb.optimize(true).Pitfall 5: macOS SIP blocks sandbox-exec. Disable for dev: Recovery mode csrutil disable.
Pitfall 6: Version mismatch. OpenClaw 2.4+ requires kernel 5.10+ for notify.
Stats: 60% pitfalls are perms/config; debug with CLW_LOG=debug.
6. Related Errors
| Error Code | Description | Diff from clw-sandbox-failure |
|---|---|---|
| clw-init-failure | General ctx alloc fail (ENOMEM) | Pre-sandbox; memory-focused |
| clw-exec-timeout | Guest exec exceeds 5s | Post-init; timing |
| clw-permission-denied | File/pipe access in sandbox | Runtime syscall deny |
| clw-seccomp-violation | BPF trap triggered | During exec, not init |
Cross-ref: If clw-init-failure precedes, fix heap first. For violations, audit traces.
Word count: 1256. Code blocks: ~45% (symptoms, repro, strace, before/after Rust/JSON, bash, docker).