Files
jobtrackingapp/docs/security/ADMIN_INFORMATION_ISOLATION.md
T

3.9 KiB

Admin information isolation, offline increment

9 November 2026. Base de3d5031c8208bc3841a528ae100ec2984d68501 on codex/security-offline-preflight. Compared the audit, Gmail, operations and fixture owners with A3 checkpoint 91e5a6bf; their files were identical before this patch. Testing uses ephemeral loopback Kestrel and SQLite with synthetic owners and a test authentication scheme. No real mailbox, model, credential, provider, staging host or production service was accessed.

Confirmed, privileged audit projection

The Gmail import creates a ReplyReceived event with the original mail subject in JobEvent.Note. The Admin-only Audit endpoint reads events across owners and previously sent that subject to administrators in the generic note field. A synthetic reply proved the subject was returned to an authenticated administrator. Anonymous and ordinary users were denied in the same test. This is excessive visibility to an existing administrative role, with a mailbox-import precondition. The fixture did not show an ordinary-user role bypass.

The read projection now omits Note for ReplyReceived. This also covers historical events without touching stored rows. The event type, response metadata, application association and ordinary status notes remain available. The owner's original event is preserved. Roles, undo/restore, notification producers and persisted data are unchanged.

Covered boundaries

Boundary Evidence
Admin Audit Loopback HTTP verifies 401/403 and the redacted Admin response. The allowed event metadata and a non-private status note remain. Stored owner subject still matches the synthetic input.
Admin Processing Existing HTTP tests verify all three endpoints deny ordinary/anonymous callers, keep role and bounded rate enforcement, and omit raw CV content, file paths and lease data from allowed diagnostics.
User notifications HTTP list/count ignore a forged owner query. A foreign notification ID returns 404 for mark-read and dismiss. The other owner still sees their own notice. Relational state confirms neither mutation occurred.
User operations The owner cannot retrieve the other owner's operation by ID. The owner's own detail omits raw failure text, lease token, result reference and CV content. Public task stage/category remain part of the existing contract.
Pollers and producers Reviewed EF owner filters and operation, saved-search and interrupted-mail producers. These write owner-bound user messages. No admin event producer was identified in the examined notification store. System and Users server role requirements were inspected and covered by existing authorization posture tests.
Public liveness/readiness Source shows the existing minimal liveness version/status and readiness status contracts. Neither substitutes for the role-gated system diagnostic payload. No live checks run.

The red test failed once on the original HTTP response. The final four selected suites passed 62 cases, with zero failures/skips and exit 0. Pinned .NET 9.0.317, locked restore from the local cache and Release tests with --no-restore. Dependency advisory checks were not run during the offline restore.

  • Red TRX, uncompressed SHA-256 3795be6331eb68ff9fef3648d1fea3d938f0333db7c755984eb5705c09f1cb56.
  • Green TRX, uncompressed SHA-256 a46e1c00dbf0e486495bce7a11524fe5b75d9975788e35b63f8e82c074eaeaf6.

Open

Broader audit minimisation, administrative actions, email and realtime delivery boundaries, actual MariaDB and integrated role/session/deployment checks remain open. The Codex Security plugin is present. Formal baseline, diff/deep, integrated and staging scan activities were NOT RUN in this independent offline increment. Source and fixture results do not satisfy those later gates. No support-access or recovery permissions changed. MFA recovery proposal