| Version | Supported |
|---|---|
| 0.1.x | ✅ |
Please do NOT open a public GitHub issue for security vulnerabilities.
Instead, please report them responsibly:
- Email: Send details to the maintainers via GitHub private vulnerability reporting
- GitHub: Use GitHub Security Advisories
- Description of the vulnerability
- Steps to reproduce
- Impact assessment
- Suggested fix (if any)
- Acknowledgment: Within 48 hours
- Assessment: Within 1 week
- Fix: Within 2 weeks for critical issues
ZeroClaw implements defense-in-depth security:
- ReadOnly — Agent can only read, no shell or write access
- Supervised — Agent can act within allowlists (default)
- Full — Agent has full access within workspace sandbox
- Workspace isolation — All file operations confined to workspace directory
- Path traversal blocking —
..sequences and absolute paths rejected - Command allowlisting — Only explicitly approved commands can execute
- Forbidden path list — Critical system paths (
/etc,/root,~/.ssh) always blocked - Rate limiting — Max actions per hour and cost per day caps
- Path traversal attacks (
../../../etc/passwd) - Command injection (
rm -rf /,curl | sh) - Workspace escape via symlinks or absolute paths
- Runaway cost from LLM API calls
- Unauthorized shell command execution
All security mechanisms are covered by automated tests (129 tests):
cargo test -- security
cargo test -- tools::shell
cargo test -- tools::file_read
cargo test -- tools::file_writeZeroClaw Docker images follow CIS Docker Benchmark best practices:
| Control | Implementation |
|---|---|
| 4.1 Non-root user | Container runs as UID 65534 (distroless nonroot) |
| 4.2 Minimal base image | gcr.io/distroless/cc-debian12:nonroot — no shell, no package manager |
| 4.6 HEALTHCHECK | Not applicable (stateless CLI/gateway) |
| 5.25 Read-only filesystem | Supported via docker run --read-only with /workspace volume |
# Build and verify non-root user
docker build -t zeroclaw .
docker inspect --format='{{.Config.User}}' zeroclaw
# Expected: 65534:65534
# Run with read-only filesystem (production hardening)
docker run --read-only -v /path/to/workspace:/workspace zeroclaw gatewayThe docker job in .github/workflows/ci.yml automatically verifies:
- Container does not run as root (UID 0)
- Runtime stage uses
:nonrootvariant - Explicit
USERdirective with numeric UID exists
This workspace-only fork disables external messaging channels and hard-locks file access policy to the workspace. However, scheduled shell/script execution is still process execution, so strict confinement depends on the host setup.
The app enforces workspace boundaries in application policy (command/path checks,
workspace-script validation, working directory control), but that is not the
same as a kernel-enforced sandbox for arbitrary scripts.
If a scheduled script itself executes unsafe commands, OS-level isolation is the real boundary.
- Use a dedicated OS user account for this app (no personal home data, no SSH keys).
- Use a dedicated workspace directory (for example
/srv/zeroclaw-workspace) and do not symlink it to sensitive locations. - Prefer running inside a container/VM for strongest isolation (recommended).
- If running on Linux host directly, install at least one sandbox backend:
bubblewrap(bwrap)firejail- Landlock-capable kernel/userspace (where supported)
- Restrict outbound network egress at the OS/firewall layer unless explicitly needed.
- Install PocketBase from an official release and verify checksums/signatures before placing the binary in
pocketbase/pocketbaseorPATH. - Bind PocketBase to localhost only (default
127.0.0.1:8090) unless you intentionally reverse-proxy it. - Set file permissions on workspace scripts to least privilege and review them before scheduling.
- Keep secrets out of the workspace unless absolutely required; prefer environment variables or OS keychain storage.
- Back up
memory/andpb_data/separately (they serve different purposes).
- Prefer
workspace-script <relative/path>over complex shell strings. - Keep scripts small, reviewed, and checked into the workspace.
- Avoid command chaining in scheduled commands (
&&,;, pipes) unless necessary. - Run scripts against files under the workspace only.
- Use
best_effort = truedelivery when testing PocketBase writes so failed DB writes do not block job execution.
- The gateway attempts to start a local PocketBase sidecar automatically if a
pocketbasebinary is found inpocketbase/pocketbase,pocketbase/pocketbase.exe, orPATH. - Disable auto-start with
ZEROCLAW_POCKETBASE_DISABLE=1. - Override binary path with
ZEROCLAW_POCKETBASE_BIN=/absolute/path/to/pocketbase. - Override bind host/port with
ZEROCLAW_POCKETBASE_HOSTandZEROCLAW_POCKETBASE_PORT.