Skip to content

v1.11.0 — service & integration hardening (7 High + 4 Medium)#15

Merged
wyckit merged 1 commit into
masterfrom
fix/v1.11-service-hardening
Jun 21, 2026
Merged

v1.11.0 — service & integration hardening (7 High + 4 Medium)#15
wyckit merged 1 commit into
masterfrom
fix/v1.11-service-hardening

Conversation

@wyckit

@wyckit wyckit commented Jun 21, 2026

Copy link
Copy Markdown
Owner

Closes a fifth external review. Every finding was verified against current master first. 240 passing + 3 env-gated skipped; 16 new tests.

High — fixed

  • Export honored caller approvals/api/export signed/bundle output ran with caller-supplied approvals, bypassing server-issued challenges + approver authz. Now always runs unapproved (test: Export_does_not_honor_caller_supplied_approvals).
  • Rerun before signature verify/challenges + /approve now verify the stored bundle signature before re-running saved.Prompt409 on a tampered artifact (test: A_tampered_stored_run_fails_integrity_before_approval).
  • Per-file delete approvals over the web — challenges minted per unit (node#fileRef for deletes) via new PolicyView.ApprovalRefs (test: Per_file_delete_confirmations_are_minted_and_approved_per_file).
  • Persistence fail-open/api/run + /approve return 503 (no leaked exception) when a run can't be durably stored.
  • No rate limits — built-in framework limiter (no new dependency): per-client /api cap + stricter POST /api/auth/token (test: Auth_endpoint_is_rate_limited_per_client).
  • Side-effecting GET/HEAD bypass — imported-OpenAPI confirmation keys on side effect, not verb (test: OpenApiImporter_ToContract_side_effecting_get_still_requires_confirmation).
  • MCP custom-mapper path bypass — path policy enforces the normalized typed action path, not just raw arg keys (test: McpProxy_custom_mapper_with_nonstandard_arg_name_still_enforces_path_policy).

Medium — fixed

  • Reads require ≥ viewer (roleless principal → 403).
  • Legacy INTENTMESH_WEB_TOKEN reduced to operator+viewer (no approver), documented dev-only.
  • Security headers (CSP script-src 'self', nosniff, DENY, no-referrer); SPA token → sessionStorage.
  • Release hardening: repo NuGet.config (single-source mapping), Docker --locked-mode restore, attestation moved to a separate least-privilege CI job.

Documented residuals (not single-PR)

NuGet package signing needs a code-signing certificate; base-image digest pinning needs registry access — both deployment-owned and noted in MATURITY. KMS/HSM and encrypted/WORM storage remain future seams.

🤖 Generated with Claude Code

…Medium)

High:
- /api/export no longer honors caller-supplied approvals (it signed bundles with
  them, bypassing server-issued challenges + approver authz); always runs unapproved.
- /challenges and /approve verify the stored bundle signature before re-running
  saved.Prompt (409 on failure) — a tampered artifact can't seed a signed approved run.
- per-file delete approvals over the web: challenges minted per unit (bare node id,
  or node#fileRef for destructive delete) via new PolicyView.ApprovalRefs.
- fail-closed persistence: /api/run and /approve return 503 (no leaked detail) when a
  run can't be durably stored, instead of 200 with an unsaved result.
- rate limiting (built-in framework limiter, no new dep): per-client /api cap + a
  stricter policy on POST /api/auth/token.
- imported-OpenAPI confirmation keys on the inferred side effect, not the HTTP verb,
  so a side-effecting GET/HEAD is still gated.
- MCP path policy enforces the normalized typed action path (FsRead/FsWrite.Path),
  not only fixed raw arg keys — closes a custom-mapper bypass.

Medium:
- read endpoints require >= viewer (roleless principal gets 403).
- legacy INTENTMESH_WEB_TOKEN reduced to operator+viewer (no approver), documented dev-only.
- security headers (CSP script-src 'self', nosniff, DENY, no-referrer); SPA token moved
  to sessionStorage.
- release hardening: repo NuGet.config (single-source mapping), Docker restore
  --locked-mode, attestation split into a separate least-privilege CI job.

Note: findings overlapping v1.9.2/v1.10.x were re-verified; AllowedHosts, key floor,
draft gate, and SHA-pinning remain resolved. 16 new tests; 240 passing + 3 skipped.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@wyckit wyckit merged commit 46c4305 into master Jun 21, 2026
2 checks passed
@wyckit wyckit deleted the fix/v1.11-service-hardening branch June 21, 2026 10:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant