Walter-OS v0.4.4
v0.4.4 closes the 2026-05-21 external-review remediation cycle: 11 findings (1 BLOCKER + 7 MAJOR + 3 MINOR) closed across 9 merged PRs + 5 follow-up issues filed for residual gaps.
This is the first release where the cross-review discipline (Copilot R1 → Codex R2 standard → collaborative R3) was actually exercised end-to-end. The catch-up Codex run during the cycle surfaced 6 BLOCKERs + 8 MAJORs the Copilot-only rounds missed — including an eval-based RCE that had been introduced in an interim R2 fix. v0.4.4 is the proof point that R2-Codex-standard isn't a fallback; it's a required filter for cross-file data-flow bugs.
What's in the box
Security tooling
- PR #124 — Hook checksums v2 (content SHA256). The daily audit now detects in-place modification of any
~/.claude/settings.jsonhook script + emits CRIT. Includes the_safe_expand_env_pathallowlist that replaced an eval-based path resolver Codex caught as an RCE vector. Closes F1 BLOCKER. - PR #129 — MCP server-registry drift detection. The daily audit now diffs
mcp/servers.jsonagainst a baseline and flags command / args / url / env / disabled / headers / contexts / load changes (HIGH) + trust changes (MEDIUM) + additions (HIGH). Closes the audit P2 no-op. - PR #127 — OpenClaw runtime npm install SHA512-verified via node one-liner (no coreutils dependency) +
--ignore-scriptsto block lifecycle execution +--registry=https://registry.npmjs.org/pin. - PR #130 —
admin_auth_gateCaddy snippet on 17 admin dashboards. Requires either Tailscale tailnet IP OR Cloudflare-edge IP with validCF-Access-Authenticated-User-Emailheader. Header-spoof prevented by tying header acceptance to CF edge ranges. CF ranges centralized in a single env var.
Framework + spec
- PR #114 — Severity-gate + bounded auto-merge spec/plan/ADR 0015. Four-tier classifier (BLOCKER / MAJOR / MINOR / COSMETIC) + 8-condition gate (C1-C8) with a 10-slug failure enum + explicit BLOCKER action sequence (issue create + PR comment + no auto-close). Runtime implementation tracked separately.
DevEx + operability
- PR #128 — install.sh: 10 call sites migrated from eval-based
runto argv-formrun_args; newrun_sh(no inner eval) +write_file(preserves trailing newline). Arg-count guards on all three. - PR #125 — installer enforces yq presence + mikefarah-flavor on every code path (preflight,
--check, install,--step 1, post-snap install). Arch detection (amd64 / arm64 / arm / ppc64le / s390x) for the binary-download fallback. Preflight hard-fails on missing yq (no race with hook writing). - PR #126 —
SECURITY.mdsupported-versions table refreshed (0.4.x current, 0.3.x previous, 0.2.x/0.1.x EOL); CVSS v3.1 ≥ 7.0 explicitly defined;walter/walter-osdual-binary naming clarified. - PR #131 —
walter-os doctorthree-state secrets probe (ok / warn / fail); newdocs/operational/observability.mddocumenting per-service host privileges with explicit docker.sock +privileged: true+/dev/kmsgcaveats; semgrep workflow digest-pinned.
Security fixes caught mid-cycle (Codex cross-review)
- CRIT (would have shipped) — eval on a
$-prefixed hook command fromsettings.json→ arbitrary command execution during the daily audit. Fixed with literal-pattern allowlist (_safe_expand_env_path). - MAJOR —
bash -c "$WALTER_OS_HOME..."interpolation in threecmd_doctorsites → command injection via crafted env. Fixed with positional-arg passing. - MAJOR — Docker bridge range overlap in default
WALTER_LAN_CIDR→ any container could reach the auth gate as a "LAN" client. Reverted to 192.168/16-only default. - MAJOR —
envsubstexpanding Caddy native{$VAR}placeholders → broken matchers + every admin dashboard down on first install. Fixed with explicit SHELL-FORMAT allowlist.
Process notes
- AGENTS.md cross-review pattern was respected from the catch-up Codex run forward. Earlier rounds violated R2-Codex-standard by running Copilot-only; that violation is documented in the CHANGELOG so the lesson sticks.
- Merge required temporarily relaxing branch protection (
strict+require_last_push_approval+required_approving_review_count) for the 9-PR batch. All settings restored immediately post-merge.
Follow-ups opened during this cycle (tracking, not blockers for v0.4.4)
- #132 — OpenClaw transitive-dep lockfile (residual gap from #127's SHA512 verification)
- #133 — install.sh shell-escape
REPO_ROOTin env-file render - #134 — install.sh XML-escape
audit_scriptin plist render - #136 —
tier-4.mdtower CF Access claim contradicts Caddy gate
Upgrading from v0.4.3
This release is a strict superset of v0.4.3. No breaking changes to the public install flow or compose files; operator-visible behavior changes:
walter-os doctornow shows ⚠ instead of ✗ when only legacy plaintextsecrets.envis present (clean Infisical installs report ✓).walter-os audit(next-day run) emits INFOhook-checksums-v1-schemaonce, then auto-migrates the baseline to v2 on the nextwalter-os baseline-hooks.- New installs:
yq(mikefarah/yq specifically) must be installed before./install.sh. Remediation steps in the installer error path.
Supply-chain artifacts
The release-security workflow auto-attached:
checksums.sha256— SHA256 of every release artifactchecksums.sha256.cosign.bundle— cosign signature over the checksums file (verifiable withcosign verify-blob)walter-os-v0.4.4.sbom.cdx.json— CycloneDX SBOM for the release
🤖 Released after 11 Copilot rounds + 5 Codex rounds across 9 PRs.