security: the three red-steel fixes that apply cleanly to current main - #653
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
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>
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>
`014cd05a` carried its own Cargo.lock from 2026-07-30. Replayed onto a main that has moved 76 commits since, that lock no longer resolves, and CI runs `--locked`, so every cargo job failed identically: error: the lock file Cargo.lock needs to be updated but --locked was passed My local verification missed it by running cargo without `--locked`, which silently regenerated the lock instead of failing. Both workspace and fuzz lockfiles regenerated and re-checked with `--locked`. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
Correction to the PR description, on the I wrote that On
So the test sees 3 rows because all three facts land in The residual exposure worth tracking: MCP reads are unfiltered, so facts written under a non-default tenant via other ingest paths (HTTP with a JWT tenant claim) would be returned to an MCP caller. Nothing in this PR's three commits changes; only my characterisation of why |
First slice of the red-steel remediation stranded in #630. These three commits are taken unmodified from
codex/crux-red-steel-remediation-2026-07-30and cherry-pick cleanly onto currentmain:a3e2eabffix(mcp): fail closed for OAuth-only auth2d5c085dfix(security): harden daemon browser responses014cd05afix(security): remove the yanked ZIP crypto pathVerification
cargo check --workspace --all-targets— cleancargo test -p crux-mcp -p corecruxd -p corecrux-receipts -p corecruxctl --lib— 282 / 1229 / 801 passed, 0 failedcargo clippy --workspace --all-targets— 17 errors, identical to themainbaseline (all pre-existing inrcx-revocation); no new lint debtWhy only three, when five applied cleanly
41ee2515(test(mcp): assert tenant-isolated actor reads) and33ec4ed1(test(observe): scope eviction deletes by tenant) apply textually but are tests for production changes still in the un-rebased set:33ec4ed1does not compile — it callsstore.delete("default", &id), the tenant-scoped signature introduced byba642868.41ee2515compiles and fails, which is the interesting one. It asserts a work-tenantquery_factssees 2 rows; on currentmainit sees 3, the extra being a fact written under thedefaulttenant.mainand red-steel disagree about whether default-tenant facts are visible cross-tenant, and red-steel'sba642868/426ea8a0treat that as a leak to close.Both belong with their production commits, not here.
See #630 for the full picture and the remaining slices.
🤖 Generated with Claude Code