Created
April 7, 2026 11:32
-
-
Save initcron/11fcb451d6b2971cabd9cf0024d160a4 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Security & Enterprise-Readiness Report: Claw Code | |
| Subject: claw-code (ultraworkers/claw-code, Rust, v0.1.0) | |
| Comparators: IronClaw, OpenClaw, ZeroClaw | |
| Hermes: Not present in this experiments/ workspace â excluded from comparison. | |
| Date: 2026-04-07 | |
| --- | |
| TL;DR â Is Claw Code safe? | |
| Short answer: Not for enterprise use, and not for handling sensitive data on macOS or Windows. | |
| Claw Code is a young (v0.1.0), well-architected Rust agent harness with a strong permission-mode design and memory-safe foundations, but it has three critical security gaps that the other | |
| three projects in this family have already addressed: | |
| 1. Plaintext credential storage â OAuth tokens and API keys are saved as plaintext JSON in ~/.claw/settings.json. No OS keychain, no encryption at rest. | |
| 2. Sandboxing only works on Linux â On macOS and Windows there is zero process isolation. The LLM-driven shell runs with full user privileges. | |
| 3. No audit log â Tool executions, bash invocations, and permission decisions are not recorded to any persistent audit trail. | |
| Of the four projects, the security ranking is unambiguous: | |
| ââââââââŹââââââââââââŹâââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ | |
| â Rank â Project â Safety Verdict â | |
| ââââââââźââââââââââââźââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ⤠| |
| â 1 â IronClaw â Production-ready single-user, defense-in-depth, encrypted secrets, sandboxed tools â | |
| ââââââââźââââââââââââźââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ⤠| |
| â 2 â ZeroClaw â Strong cryptographic foundations, secure-by-default, but pre-1.0 â | |
| ââââââââźââââââââââââźââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ⤠| |
| â 3 â OpenClaw â Mature ops tooling, strong approval system, but host-execution by default â | |
| ââââââââźââââââââââââźââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ⤠| |
| â 4 â Claw Code â Strong permission model, but plaintext secrets, Linux-only sandbox, no audit log â | |
| ââââââââ´ââââââââââââ´âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ | |
| --- | |
| 1. Sandboxing & Process Isolation | |
| ââââââââââââŹâââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââŹâââââââââââââââââââââââââââŹââââââââââââââââââââââââââââââââââŹââââââââââââââââââââââââŹââââââââââââââââââââââââââ | |
| â Project â Mechanism â Default â Cross-Platform â Network Isolation â Verdict â | |
| ââââââââââââźâââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââźâââââââââââââââââââââââââââźââââââââââââââââââââââââââââââââââźââââââââââââââââââââââââźâââââââââââââââââââââââââ⤠| |
| â Claw â Linux namespaces (unshare --user/mount/ipc/pid/uts) â WorkspaceOnly â Linux only â silent no-op on â Opt-in â Weak â | |
| â Code â â â macOS/Windows â â â | |
| ââââââââââââźâââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââźâââââââââââââââââââââââââââźââââââââââââââââââââââââââââââââââźââââââââââââââââââââââââźâââââââââââââââââââââââââ⤠| |
| â IronClaw â WASM (Wasmtime) + Docker (defense-in-depth) + HTTP proxy â ReadOnly â All platforms (Docker) â Per-container, â Strong â | |
| â â with domain allowlist â â â allowlisted â â | |
| ââââââââââââźâââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââźâââââââââââââââââââââââââââźââââââââââââââââââââââââââââââââââźââââââââââââââââââââââââźâââââââââââââââââââââââââ⤠| |
| â ZeroClaw â Docker, Firejail, Bubblewrap, Linux Landlock LSM, optional â Multiple backends â Linux primary, Docker for â Yes (--network none) â AdequateâStrong â | |
| â â WASM â auto-detected â portability â â â | |
| ââââââââââââźâââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââźâââââââââââââââââââââââââââźââââââââââââââââââââââââââââââââââźââââââââââââââââââââââââźâââââââââââââââââââââââââ⤠| |
| â OpenClaw â Docker / SSH remote sandbox â mode = "off" (host â Docker on all platforms â Docker network mode â Adequate â | |
| â â â execution) â â â (config-dependent) â | |
| ââââââââââââ´âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ´âââââââââââââââââââââââââââ´ââââââââââââââââââââââââââââââââââ´ââââââââââââââââââââââââ´ââââââââââââââââââââââââââ | |
| Key finding for Claw Code: | |
| The sandbox at rust/crates/runtime/src/sandbox.rs (385 LOC) is well-coded for Linux but has explicit fallback documented at lines 216-217: macOS and Windows operators get no isolation at | |
| all. The Containerfile is a 14-line dev container with no hardening (no CAP_DROP, no read-only rootfs, no user restriction). | |
| Compare with IronClaw's src/tools/wasm/ which puts every tool inside Wasmtime with fuel limits, memory caps, and credential injection at the host boundary â the WASM module never sees | |
| plaintext secrets. | |
| --- | |
| 2. Secrets Management â The Biggest Gap | |
| ââââââââââââŹâââââââââââââââââââââââââââââââââââââââââââŹâââââââââââââŹâââââââââââââââââââââââââââââââââââââââââââââââŹâââââââââââââââââââââââââââââââââââââŹââââââââââââââââââââââââââââââââ | |
| â Project â Storage at Rest â Encryption â OS Keychain â Secret Redaction â Leak Detection â | |
| ââââââââââââźâââââââââââââââââââââââââââââââââââââââââââźâââââââââââââźâââââââââââââââââââââââââââââââââââââââââââââââźâââââââââââââââââââââââââââââââââââââźâââââââââââââââââââââââââââââââ⤠| |
| â Claw â Plaintext JSON at ~/.claw/settings.json â None â None â Bearer headers redacted in logs â None in LLM context â | |
| â Code â â â â only â â | |
| ââââââââââââźâââââââââââââââââââââââââââââââââââââââââââźâââââââââââââźâââââââââââââââââââââââââââââââââââââââââââââââźâââââââââââââââââââââââââââââââââââââźâââââââââââââââââââââââââââââââ⤠| |
| â IronClaw â AES-256-GCM with HKDF-SHA256, per-secret â Yes â macOS Keychain, Linux Secret Service â Aho-Corasick + regex two-point â Yes â â | |
| â â salts â â (security-framework, secret-service) â scanning (request + response) â src/safety/leak_detector.rs â | |
| ââââââââââââźâââââââââââââââââââââââââââââââââââââââââââźâââââââââââââźâââââââââââââââââââââââââââââââââââââââââââââââźâââââââââââââââââââââââââââââââââââââźâââââââââââââââââââââââââââââââ⤠| |
| â ZeroClaw â ChaCha20-Poly1305 AEAD, key at â Yes â No (file-based with strict perms) â Yes, with first-4-char preview â Pattern-based â | |
| â â ~/.zeroclaw/.secret_key (0600) â â â â â | |
| ââââââââââââźâââââââââââââââââââââââââââââââââââââââââââźâââââââââââââźâââââââââââââââââââââââââââââââââââââââââââââââźâââââââââââââââââââââââââââââââââââââźâââââââââââââââââââââââââââââââ⤠| |
| â OpenClaw â Plaintext JSON at â None â None â 18+ patterns, constant-time secret â detect-secrets baseline in CI â | |
| â â ~/.openclaw/credentials/ â â â comparison â â | |
| ââââââââââââ´âââââââââââââââââââââââââââââââââââââââââââ´âââââââââââââ´âââââââââââââââââââââââââââââââââââââââââââââââ´âââââââââââââââââââââââââââââââââââââ´ââââââââââââââââââââââââââââââââ | |
| This is where Claw Code is weakest. The OAuth flow at runtime/src/oauth.rs writes access_token, refresh_token, expires_at, and scopes to disk in plaintext. Anyone with file access (another | |
| user, a malicious npm/cargo postinstall, malware, a stolen laptop without FDE) gets your Anthropic credentials. | |
| IronClaw is the gold standard here: secrets are encrypted with AES-256-GCM, the master key lives in the macOS Keychain or Linux Secret Service, and the WASM credential injector decrypts on | |
| demand and injects directly into HTTP headers â the tool code itself never sees the plaintext. ZeroClaw uses ChaCha20-Poly1305 with backward-compatible migration from a legacy XOR scheme | |
| (enc: â enc2: prefixes). | |
| --- | |
| 3. PII & Privacy | |
| ââââââââââââŹâââââââââââââââââââââââââââââââââââââââââââââŹâââââââââââââââââââââââââââŹâââââââââââââââââââââââââââââââââââââââââââââââââââŹâââââââââââââââââââââââââââââââââââââââââââââââââ | |
| â Project â Session Storage â PII Detection â Telemetry â Local-Only Mode â | |
| ââââââââââââźâââââââââââââââââââââââââââââââââââââââââââââźâââââââââââââââââââââââââââźâââââââââââââââââââââââââââââââââââââââââââââââââââźââââââââââââââââââââââââââââââââââââââââââââââââ⤠| |
| â Claw â .claw/sessions/*.jsonl plaintext, no TTL â None â Telemetry crate exists but undocumented; status â Possible via ANTHROPIC_BASE_URL (Ollama, â | |
| â Code â â â unclear â OpenRouter) â | |
| ââââââââââââźâââââââââââââââââââââââââââââââââââââââââââââźâââââââââââââââââââââââââââźâââââââââââââââââââââââââââââââââââââââââââââââââââźââââââââââââââââââââââââââââââââââââââââââââââââ⤠| |
| â IronClaw â Local PostgreSQL or libSQL/Turso, â None (user â No telemetry â Yes â by design â | |
| â â configurable â responsibility) â â â | |
| ââââââââââââźâââââââââââââââââââââââââââââââââââââââââââââźâââââââââââââââââââââââââââźâââââââââââââââââââââââââââââââââââââââââââââââââââźââââââââââââââââââââââââââââââââââââââââââââââââ⤠| |
| â ZeroClaw â Local audit logs â None â Opt-in only (NoopObserver default) â Yes â | |
| ââââââââââââźâââââââââââââââââââââââââââââââââââââââââââââźâââââââââââââââââââââââââââźâââââââââââââââââââââââââââââââââââââââââââââââââââźââââââââââââââââââââââââââââââââââââââââââââââââ⤠| |
| â OpenClaw â Local sessions in ~/.openclaw/ â Redaction in logging â No built-in telemetry â Yes â loopback by default â | |
| â â â only â â â | |
| ââââââââââââ´âââââââââââââââââââââââââââââââââââââââââââââ´âââââââââââââââââââââââââââ´âââââââââââââââââââââââââââââââââââââââââââââââââââ´âââââââââââââââââââââââââââââââââââââââââââââââââ | |
| Claw Code implication: Your full conversation history â including any code, secrets, or sensitive prompts you've entered â is sitting in unencrypted JSONL files under .claw/sessions/. No | |
| expiration, no encryption, no purge command. | |
| --- | |
| 4. Tool Permissions & Approval | |
| This is the area where Claw Code is strongest, and is genuinely competitive with the other projects. | |
| ââââââââââââŹâââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââŹâââââââââââââââââââââââââââââââââââââââââŹâââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ | |
| â Project â Permission Model â Approval Flow â Bash Safety â | |
| ââââââââââââźâââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââźâââââââââââââââââââââââââââââââââââââââââźââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ⤠| |
| â Claw â 5 modes: ReadOnly, WorkspaceWrite, DangerFullAccess, Prompt, Allow â Interactive prompt mode â 48-command read-only whitelist heuristic â incomplete (perl â | |
| â Code â + per-tool rules â â -e 'system(...)' bypasses it) â | |
| ââââââââââââźâââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââźâââââââââââââââââââââââââââââââââââââââââźââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ⤠| |
| â IronClaw â ApprovalRequirement::{Required,Optional,Never} per tool, â Required for shell/HTTP â NEVER_AUTO_APPROVE_PATTERNS: rm -rf, shutdown, git push â | |
| â â never-auto-approve patterns â â --force, etc. â | |
| ââââââââââââźâââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââźâââââââââââââââââââââââââââââââââââââââââźââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ⤠| |
| â ZeroClaw â AutonomyLevel: ReadOnly/Supervised/Full + per-action approval flag â Quote-aware command parser, â Detects pipes, separators, env assignments, escapes â | |
| â â â risk-graded (Low/Medium/High) â â | |
| ââââââââââââźâââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââźâââââââââââââââââââââââââââââââââââââââââźââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ⤠| |
| â OpenClaw â 5 modes: deny/allowlist/full Ă off/on-miss/always + safe-bin â SHA256-bound approvals with file â shell: false hardcoded (src/process/exec.ts:86-97) â refuses â | |
| â â profiles â integrity check â to spawn via shell â | |
| ââââââââââââ´âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ´âââââââââââââââââââââââââââââââââââââââââ´âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ | |
| Claw Code's permission intent is good (runtime/src/permissions.rs, 684 LOC, 270+ tests) but the enforcement has two real flaws: | |
| - Workspace boundary uses string starts_with() (permission_enforcer.rs:143-156) â /workspace would match /workspacex, and symlinks aren't canonicalized. | |
| - Read-only bash heuristic is a whitelist â anything not in the 48-command list, or anything using a shell metacharacter the regex doesn't catch, falls through. | |
| OpenClaw's hardcoded shell: false (refusing to use cmd.exe//bin/sh interpolation entirely) and IronClaw's Command::new("sh").args(["-c", cmd]) with environment scrubbing are both safer | |
| execution patterns. | |
| --- | |
| 5. Audit Logging â The Second Biggest Gap | |
| ââââââââââââŹââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââŹââââââââââââââââââââŹââââââââââââââââââââââââââââââââŹââââââââââââââââââââââââââââââââââââââââââââââââââââââ | |
| â Project â Audit Log â Integrity â SIEM/Syslog â What's Recorded â | |
| â â â Protection â â â | |
| ââââââââââââźââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââźââââââââââââââââââââźââââââââââââââââââââââââââââââââźâââââââââââââââââââââââââââââââââââââââââââââââââââââ⤠| |
| â Claw â None â N/A â N/A â Conversation JSONL only â no structured â | |
| â Code â â â â tool/permission events â | |
| ââââââââââââźââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââźââââââââââââââââââââźââââââââââââââââââââââââââââââââźâââââââââââââââââââââââââââââââââââââââââââââââââââââ⤠| |
| â IronClaw â DB-backed (src/history/store.rs, 71 KB) â None on logs â Tracing JSON formatter â Tool calls, LLM completions, jobs, costs â | |
| ââââââââââââźââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââźââââââââââââââââââââźââââââââââââââââââââââââââââââââźâââââââââââââââââââââââââââââââââââââââââââââââââââââ⤠| |
| â ZeroClaw â Structured AuditEvent (UUID, timestamp, actor, action, result, â None â Prometheus + OpenTelemetry â CommandExecution, FileAccess, ConfigChange, Auth, â | |
| â â security context) â â exporters â PolicyViolation â | |
| ââââââââââââźââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââźââââââââââââââââââââźââââââââââââââââââââââââââââââââźâââââââââââââââââââââââââââââââââââââââââââââââââââââ⤠| |
| â OpenClaw â Control-plane audit + general logs (500MB rotation, 24h â None â Local file only â Config changes with actor (clientIp, deviceId, â | |
| â â retention) â â â connId) â | |
| ââââââââââââ´ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ´ââââââââââââââââââââ´ââââââââââââââââââââââââââââââââ´ââââââââââââââââââââââââââââââââââââââââââââââââââââââ | |
| Claw Code has no audit log at all. Search across all 63K LOC turns up nothing recording tool invocations, permission decisions, or failed commands. For any compliance scenario (SOC2, | |
| ISO27001, HIPAA, internal incident response) this is disqualifying. | |
| --- | |
| 6. Authentication & Multi-User | |
| All four projects are single-user by design â none of them are multi-tenant safe. But the auth mechanisms differ: | |
| ââââââââââââŹââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââŹââââââââââââââââââââââââââââââââââââŹâââââââââââââââââââââââââââââââââââââââââââââ | |
| â Project â Auth â Multi-Tenancy â Notes â | |
| ââââââââââââźââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââźââââââââââââââââââââââââââââââââââââźââââââââââââââââââââââââââââââââââââââââââââ⤠| |
| â Claw â OAuth PKCE + API key, per-worktree sessions â No â Reasonable PKCE flow at â | |
| â Code â â â runtime/src/oauth.rs â | |
| ââââââââââââźââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââźââââââââââââââââââââââââââââââââââââźââââââââââââââââââââââââââââââââââââââââââââ⤠| |
| â IronClaw â Bearer token (subtle::ConstantTimeEq), per-job ephemeral 32-byte tokens â No â Tailscale-compatible â | |
| ââââââââââââźââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââźââââââââââââââââââââââââââââââââââââźââââââââââââââââââââââââââââââââââââââââââââ⤠| |
| â ZeroClaw â One-time pairing code â SHA-256-hashed bearer token, brute-force protection (5 attempts / â No â Best brute-force defenses of the four â | |
| â â 5 min lockout) â â â | |
| ââââââââââââźââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââźââââââââââââââââââââââââââââââââââââźââââââââââââââââââââââââââââââââââââââââââââ⤠| |
| â OpenClaw â none/token/password/trusted-proxy + 2-role RBAC (operator/node), per-IP rate limit â Explicitly non-goal â Tailscale trusted-proxy mode for â | |
| â â â (SECURITY.md:120) â per-device auth â | |
| ââââââââââââ´ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ´ââââââââââââââââââââââââââââââââââââ´âââââââââââââââââââââââââââââââââââââââââââââ | |
| --- | |
| 7. Supply Chain & Code Provenance | |
| ââââââââââââŹââââââââââââââââŹâââââââââââââââŹâââââââââââââââââââââââââââââââââââââââââââââââŹâââââââââââââââââââââââââââââââââââââââââââââââââââââââŹâââââââââââââââââââââââââââââââââââââââ | |
| â Project â Lockfile â SBOM â Signed Releases â Dep Audit â unsafe Policy â | |
| ââââââââââââźââââââââââââââââźâââââââââââââââźâââââââââââââââââââââââââââââââââââââââââââââââźâââââââââââââââââââââââââââââââââââââââââââââââââââââââźââââââââââââââââââââââââââââââââââââââ⤠| |
| â Claw â Cargo.lock â No â No â None configured â forbid(unsafe_code) workspace-wide â | |
| â Code â â â â â â | |
| ââââââââââââźââââââââââââââââźâââââââââââââââźâââââââââââââââââââââââââââââââââââââââââââââââźâââââââââââââââââââââââââââââââââââââââââââââââââââââââźââââââââââââââââââââââââââââââââââââââ⤠| |
| â IronClaw â Cargo.lock â No â SHA256 checksums in release manifests, WASM â Compile checks only â Confined unsafe in OS/FFI paths â | |
| â â â â artifacts pre-signed â â â | |
| ââââââââââââźââââââââââââââââźâââââââââââââââźâââââââââââââââââââââââââââââââââââââââââââââââźâââââââââââââââââââââââââââââââââââââââââââââââââââââââźââââââââââââââââââââââââââââââââââââââ⤠| |
| â ZeroClaw â Cargo.lock â Yes (Syft, â Reproducible build CI workflow â cargo-deny + RUSTSEC + Gitleaks + CodeQL weekly â forbid(unsafe_code) + tracked â | |
| â â (v4) â in CI) â â â exception policy â | |
| ââââââââââââźââââââââââââââââźâââââââââââââââźâââââââââââââââââââââââââââââââââââââââââââââââźâââââââââââââââââââââââââââââââââââââââââââââââââââââââźââââââââââââââââââââââââââââââââââââââ⤠| |
| â OpenClaw â pnpm-lock â No â No â detect-secrets, 120-day min release age, Node 22.16+ â TypeScript, no eval, shell: false â | |
| â â â â â enforced (CVE pinned) â â | |
| ââââââââââââ´ââââââââââââââââ´âââââââââââââââ´âââââââââââââââââââââââââââââââââââââââââââââââ´âââââââââââââââââââââââââââââââââââââââââââââââââââââââ´âââââââââââââââââââââââââââââââââââââââ | |
| ZeroClaw has by far the best supply chain hygiene â deny.toml enumerates accepted advisories with rationale, sec-audit.yml runs RUSTSEC + cargo-deny + Gitleaks + a custom unsafe-debt audit, | |
| and there's a reproducible-build CI workflow. | |
| Claw Code's only supply chain wins are forbid(unsafe_code) and using rustls instead of OpenSSL â both good defaults, but no scanning, no SBOM, no signed releases, no auto-update | |
| verification. | |
| --- | |
| 8. Threat Model Honesty | |
| âââââââââââââŹâââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ | |
| â Project â Documented Threat Model â | |
| âââââââââââââźââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ⤠| |
| â Claw Code â Implicit only â ROADMAP mentions "trust prompt resolver" and "MCP lifecycle hardening" as future phases. Acknowledges security gaps obliquely. â | |
| âââââââââââââźââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ⤠| |
| â IronClaw â Explicit src/NETWORK_SECURITY.md with named open findings (F-2âŚF-8), severities, and mitigations â | |
| âââââââââââââźââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ⤠| |
| â ZeroClaw â Explicit SECURITY.md lines 165-190: enumerates path traversal, command injection, workspace escape, runaway usage â | |
| âââââââââââââźââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ⤠| |
| â OpenClaw â Explicit SECURITY.md with in-scope and out-of-scope threats, trust boundaries, deployment assumptions â | |
| âââââââââââââ´âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ | |
| This matters: of the four, Claw Code is the only one whose docs don't honestly describe what it does and doesn't defend against. The other three all explicitly state "we are single-user, | |
| here is our trust boundary, here are the known gaps." Claw Code leaves you to infer that. | |
| --- | |
| 9. Enterprise Readiness Scorecard | |
| ââââââââââââââââââââââââââââââŹâââââââââââââââââââââŹâââââââââââââââââââŹâââââââââââââââââââââââŹâââââââââââââââââââââ | |
| â Capability â Claw Code â IronClaw â ZeroClaw â OpenClaw â | |
| ââââââââââââââââââââââââââââââźâââââââââââââââââââââźâââââââââââââââââââźâââââââââââââââââââââââźââââââââââââââââââââ⤠| |
| â Maturity (version) â v0.1.0, alpha â v0.18.0, beta/RC â v0.1.7, pre-1.0 â 2026.3.24, early â | |
| ââââââââââââââââââââââââââââââźâââââââââââââââââââââźâââââââââââââââââââźâââââââââââââââââââââââźââââââââââââââââââââ⤠| |
| â Documented threat model â â â â â â â â â | |
| ââââââââââââââââââââââââââââââźâââââââââââââââââââââźâââââââââââââââââââźâââââââââââââââââââââââźââââââââââââââââââââ⤠| |
| â Encrypted secrets at rest â â â â AES-256-GCM â â ChaCha20-Poly1305 â â â | |
| ââââââââââââââââââââââââââââââźâââââââââââââââââââââźâââââââââââââââââââźâââââââââââââââââââââââźââââââââââââââââââââ⤠| |
| â OS keychain integration â â â â â â â â â | |
| ââââââââââââââââââââââââââââââźâââââââââââââââââââââźâââââââââââââââââââźâââââââââââââââââââââââźââââââââââââââââââââ⤠| |
| â Cross-platform sandbox â â Linux only â â Docker+WASM â â ď¸ Docker â â ď¸ Docker (opt-in) â | |
| ââââââââââââââââââââââââââââââźâââââââââââââââââââââźâââââââââââââââââââźâââââââââââââââââââââââźââââââââââââââââââââ⤠| |
| â Audit log â â â â â â â â ď¸ Logs only â | |
| ââââââââââââââââââââââââââââââźâââââââââââââââââââââźâââââââââââââââââââźâââââââââââââââââââââââźââââââââââââââââââââ⤠| |
| â Permission/approval system â â Strong design â â â â â â Best-in-class â | |
| ââââââââââââââââââââââââââââââźâââââââââââââââââââââźâââââââââââââââââââźâââââââââââââââââââââââźââââââââââââââââââââ⤠| |
| â Memory-safe language â â Rust, no unsafe â â Rust â â Rust, no unsafe â â TypeScript â | |
| ââââââââââââââââââââââââââââââźâââââââââââââââââââââźâââââââââââââââââââźâââââââââââââââââââââââźââââââââââââââââââââ⤠| |
| â Supply chain scanning â â â â ď¸ â â â â ď¸ â | |
| ââââââââââââââââââââââââââââââźâââââââââââââââââââââźâââââââââââââââââââźâââââââââââââââââââââââźââââââââââââââââââââ⤠| |
| â SBOM â â â â â â â â â | |
| ââââââââââââââââââââââââââââââźâââââââââââââââââââââźâââââââââââââââââââźâââââââââââââââââââââââźââââââââââââââââââââ⤠| |
| â Signed releases â â â â ď¸ SHA256 only â â ď¸ â â â | |
| ââââââââââââââââââââââââââââââźâââââââââââââââââââââźâââââââââââââââââââźâââââââââââââââââââââââźââââââââââââââââââââ⤠| |
| â Multi-tenant / SSO / RBAC â â â â â â â â â | |
| ââââââââââââââââââââââââââââââźâââââââââââââââââââââźâââââââââââââââââââźâââââââââââââââââââââââźââââââââââââââââââââ⤠| |
| â On-prem / air-gap story â â ď¸ Manual â â Self-host DB â â Single binary â â Local-first â | |
| ââââââââââââââââââââââââââââââ´âââââââââââââââââââââ´âââââââââââââââââââ´âââââââââââââââââââââââ´âââââââââââââââââââââ | |
| --- | |
| 10. Concrete Recommendations | |
| If you must use Claw Code today | |
| 1. Run it only on Linux â the sandbox is meaningless on macOS/Windows. | |
| 2. Set permission mode to Prompt â never Allow or DangerFullAccess. | |
| 3. Use a dedicated low-privilege OS user with no access to other secrets/credentials on the machine. | |
| 4. Use chmod 600 ~/.claw/settings.json and put it on an encrypted filesystem (FileVault/LUKS). | |
| 5. Use a dedicated Anthropic API key with the lowest possible quota â assume it will be leaked. | |
| 6. Don't feed it production secrets, customer data, or PII â sessions are stored in plaintext indefinitely. | |
| 7. Run inside a Docker container as your real isolation layer, since the built-in Containerfile is unhardened. | |
| If you have the choice â pick something else | |
| - Want production-ready security with the best defense-in-depth? â IronClaw. Encrypted secrets in OS keychain, WASM+Docker dual sandbox, leak detection, declared threat model, signed WASM | |
| artifacts. | |
| - Want the cleanest security-by-default Rust core? â ZeroClaw. ChaCha20-Poly1305 secrets, Landlock + WASM + Docker, cargo-deny + CodeQL + SBOM + reproducible builds, forbid(unsafe_code). | |
| - Want the most mature operator tooling and approval UX? â OpenClaw. The 5-mode exec approval system with SHA256 file binding, shell: false hardcoded refusal, and openclaw security audit | |
| --deep are best-in-class â but you must explicitly enable sandboxing because host execution is the default. | |
| --- | |
| Final Verdict on Claw Code | |
| Claw Code is an early-stage developer tool, not a secure agent platform. The architectural foundations (Rust, forbid(unsafe_code), modular crates, well-tested permission enforcer) are sound | |
| and the project is clearly capable of getting where it needs to go â its own ROADMAP acknowledges that hardening is planned. But as it ships today (v0.1.0): | |
| - It does not safely sandbox tool execution outside Linux. | |
| - It does not secure your API credentials or OAuth tokens at rest. | |
| - It does not protect personal information in conversation history. | |
| - It does not produce an audit trail you could show a compliance team. | |
| For an enterprise environment, or any context where the host machine handles sensitive data, Claw Code is not safe. Use IronClaw if you need a single-user agent with real security, or | |
| ZeroClaw if you want the leanest Rust runtime with strong cryptographic foundations. |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment