[TRACKING] security: red-steel remediation — 3/26 landed, S2 in flight, S3–S6 open - #630
CueCrux-Myles wants to merge 26 commits into
Conversation
Use one authentication-posture predicate for transport requests, discovery metadata, and daemon bind validation. Add missing and unknown bearer regressions for OAuth-only deployments.\n\nagent:codex-work
agent:codex-work
Require admin:write for structural governance mutations, derive secure route-auth defaults from listener and auth posture, preserve semantic read/capability reachability, and pin enforce mode across shipped packaging.\n\nagent:codex-work
Derive work and orchestrator authority from authenticated identity and tenant context, isolate cross-tenant access, require canonical human gate provenance, protect governed entities, and namespace unmapped automation principals. agent:codex-work
agent: Codex
agent: Codex
agent: Codex
Bind verified principal and tenant per request, enforce exact-name scope intersections, isolate session storage, and preserve tenant-distinct receipts. Agent: Codex
Co-Authored-By: OpenAI Codex <codex@openai.com>
Co-Authored-By: OpenAI Codex <codex@openai.com>
Co-Authored-By: OpenAI Codex <codex@openai.com>
Co-Authored-By: OpenAI Codex <codex@openai.com>
Co-Authored-By: OpenAI Codex <codex@openai.com>
Co-Authored-By: OpenAI Codex <codex@openai.com>
agent:openai
Default wired HTTP fact-backed surfaces to verified JWT tenant stamping while retaining explicit off and shadow migration modes. Freeze the posture at startup, fail closed on ambiguous authority, and tenant-bind paired reads, caches, receipts, overlays, candidates, replay, and result-envelope flows. Co-Authored-By: OpenAI Codex <codex@openai.com>
Constrain repository and workspace scans to canonical allowed roots with descriptor-rooted traversal, symlink and hardlink containment, bounded admission, and global tenant authority. Make scan persistence, watchers, startup recovery, legal holds, and explicit compaction fail closed under durability uncertainty. Co-Authored-By: OpenAI Codex <codex@openai.com>
Update stale actor-attribution fixtures for the tenant partition introduced before M17. Work collaborators remain mutually visible inside the work tenant, while legacy default-tenant facts remain isolated and retain a null actor. Co-Authored-By: OpenAI Codex <codex@openai.com>
Apply one console-compatible browser security policy to direct daemon routes and the desktop proxy. Deny foreign framing without breaking same-origin Studio and 3D tiles, replace hostile upstream policy headers, and regression-test all response classes plus daemon/proxy parity. Co-Authored-By: OpenAI Codex <codex@openai.com>
Require reviewed full commit SHAs for every external workflow action, with the verifier-required SLSA version tag as the sole exact exception. Keep Rust toolchain selection explicit after SHA pinning and extend the trusted workflow policy with adversarial YAML, reusable-workflow, and local-action checks. Co-Authored-By: OpenAI Codex <codex@openai.com>
Build activation tenant options with DOM nodes and textContent instead of parsing response values as HTML. Mark the synthetic add-tenant option with DOM-owned metadata so a real __add_new__ tenant remains selectable, and execute the shipped inline script against hostile values in a dependency-free mock DOM regression. Co-Authored-By: OpenAI Codex <codex@openai.com>
Stop receipt and daemon crates from re-enabling ZIP defaults so the unused aes-crypto graph is absent. Make the CLI Deflate backend explicit with zlib-rs, add a compressed-import round trip, refresh root and fuzz locks, and enforce yanked-package denial in the existing cargo-deny CI job. Co-Authored-By: OpenAI Codex <codex@openai.com>
Minimize the Docker build context, tighten the runtime and local Compose posture, add a digest-pinned shared deployment example, and enforce exact fail-closed Docker/Compose/publication contracts. Build and scan one candidate digest, sign and attest it, then promote supported tags only after every security gate succeeds. Co-Authored-By: OpenAI Codex <codex@openai.com>
Update the eviction test helper for the tenant-aware fact-store API so the integrated workspace suite compiles and exercises the intended default tenant. Co-Authored-By: OpenAI Codex <codex@openai.com>
Make device grant issuance transactional, cap all retained public state, enforce absolute refresh expiry, and preserve backward-compatible CLI credential handling.\n\nExecPlan: crux-daemon-red-steel-remediation-2026-07-30\n\nCo-Authored-By: Codex <codex@openai.com>
Rebase attempted — 32/32 conflicts resolved, 13 errors leftPushed to The 40 → 13 correctionThe first build showed ~40 errors, which read like deep API divergence. It wasn't. 28 were a single cause: the moved scan code needs Decisions worth reviewingStructural — Auth handlers — took Symlink walk — took this branch. Both sides independently fixed the same descent bug. The shared tail binds Privacy prefixes — union, verified. 56 and 57 entries, computed against both sides, nothing dropped. Losing main's Both-sides-additive — kept both halves. Workflows. SHA pins kept throughout; main's per-job CARGO_HOME seeding (the md3 disk-leak fix) kept in ⚠ Needs author sign-off
The 13 remaining
An ExecPlan scoping the bridge follows. 🤖 Generated with Claude Code |
Disposition: retire this branch as the delivery vehicle; replay in slicesAssessed today against current Why not finish the mergeDrift velocity, measured rather than estimated. On 2026-08-07 alone Replaying the 26 commits onto current This branch stays pushed as the reference for the resolution reasoning already done — the WIP commit message is the best record of it (auth handlers → take main; privacy prefixes → union, 56+57 verified; symlink walk → take red-steel; the workspace-scan crate extraction analysis). First slice shipped#653 — Two things that need a human, not a merge resolution
A live finding surfaced while slicing
Full slice breakdown, verification status, and decision log: Suggest keeping this PR open as the tracking issue until the slices land, then closing it unmerged. 🤖 Generated with Claude Code |
S2 resolved — #671 open, all checks greenNot the way this branch proposed.
Untrusted code reaching the self-hosted pool is gated behind a human click, with nobody positioned to attempt it. That does not justify reversing #631's pool split and the shared The correction that mattered more: escalating S2 as one decision was the error. It was three — runner topology, token scope, action pinning — and the latter two were cheap, un-gated, and independent of the question they had been parked behind. Both were live exposures:
#671
Both are re-derivations, not ports. One finding worth carrying forward
Separately: reusable workflows are exempt from GitHub's Status3 of 26 landed (#653), S2's three resolved via #671 — one dropped on the merits, two shipped. S3–S6 remain, and S3 (tenant isolation) is still the largest security delta.
Plan and decision log: 🤖 Generated with Claude Code |
Draft, not ready to merge. Opened to get 26 commits of security remediation off a single machine and under review. The branch had never been pushed — it existed only in one local checkout, so a disk failure would have lost all of it.
No code was changed to open this. The branch is exactly as its author left it on 2026-07-31.
What's in it
26 commits, 215 files, +41,050 / −6,254. Security remediation across auth, tenant isolation, and CI:
repo_scan_policy); harden daemon browser responses; authenticate self-update manifests; bind coordination and punchcard ownership.Milestone gates M5–M22 for this work are already recorded in PlanCrux (landed separately in PlanCrux#177), so the plan-side record exists; only the code was stranded.
Why it is a draft
The branch is 202 commits behind
mainand a test merge produces 32 conflicts. I ran that merge in a scratch worktree and aborted it — nothing here is resolved yet.Conflicts cluster in four places:
.github/workflowsmainhas since edited the same workflowscrates/corecrux-workspace-scan/srcmainextractedworkspace_scan*into its own crate (#593); this branch wraps those same call sites in the newrepo_scan_policycontainmentcrates/corecruxd/src/http+srccorecruxd/examples,corecrux-memory,crux-mcp,corecruxctl, docsThe
workspace-scancluster is the one that needs care rather than mechanical resolution: both sides are correct and they touch the same lines.repo_scan_policy::execute(root, workspace_scan::run_scan_regex_at)has to survive the move intocorecrux-workspace-scan, and the containment must not be silently dropped while reconciling the paths.What this PR is asking for
Resolving 32 conflicts across security-critical code — auth boundaries, tenant isolation, CI token scope — is not safe to do mechanically, and the person who wrote these fixes is best placed to confirm intent survives the rebase. Suggested order:
mainin, resolving theworkspace-scancluster first since it is the only structural one.cargo test --workspace,clippy -D warnings,unwrap-ratchet.sh,check-agent-docs.sh --exec, andcargo build --workspace --all-targets(examples are in the conflict set and--testsalone will not build them).Until then this branch is at least backed up and visible.
🤖 Generated with Claude Code