Authority Threat Model (STRIDE)

Prepared by: Security Guild — 2025-10-12. Scope: Authority host, Standard plug-in, CLI, bootstrap workflow, and offline revocation distribution.

Related: For implementation details, see Authority architecture. Sender-constraint binding (DPoP/mTLS) rollout is tracked in DPoP & mTLS rollout; the offline revocation bundle format is documented in Revocation bundle. Canonical scopes (StellaOpsScopes) are catalogued in Authority scopes.

1. Scope & Method

2. Assets & Entry Points

Asset / SurfaceDescriptionPrimary Actors
Token issuance APIs (/token, /authorize, /introspect, /revoke)OAuth/OIDC endpoints mediated by OpenIddict (custom endpoint URIs configured in Program.cs)CLI, UI, automation agents
Bootstrap channelAPI-key-protected /internal/* HTTP endpoints (/internal/users, /internal/clients, /internal/invites) gated by the X-StellaOps-Bootstrap-Key header and Bootstrap.EnabledPlatform operators
Revocation bundleOffline JSON + detached JWS exported via GET /internal/revocations/export, consumed by agentsConcelier, Agents, Zastava
Plug-in manifestsIdentity-provider plug-in configuration (Standard/LDAP/OIDC/SAML) and password-policy overridesOperators, DevOps
Signing keysSigning keys backing tokens and revocation manifests (ES256 default; algorithm configurable via Signing.Algorithm), resolved through ICryptoProviderRegistrySecurity Guild, HSM/KeyOps
Audit telemetryStructured login/audit stream persisted to PostgreSQL via AuthorityAuditSinkIAuthorityLoginAttemptStore, with dual-write to the Timeline unified audit sinkSOC, SecOps

3. Trust Boundaries

BoundaryRationaleControls
TB1 — Public network ↔️ Authority ingressInternet/extranet exposure for /token, /authorize, /introspect, /revoke (the /internal/* bootstrap surface is not intended for public exposure)TLS 1.3, reverse proxy ACLs, partitioned rate limiting (authority-token, authority-authorize, authority-internal limiters in AuthorityRateLimiter; SEC3.A / CORE8.RL)
TB2 — Authority host ↔️ PostgreSQL storageCredential store, revocation state, audit log persistenceAuthenticated PostgreSQL, network segmentation, deterministic serializers
TB3 — Authority host ↔️ Plug-in sandboxIdentity-provider plug-ins (Standard/LDAP/OIDC/SAML) may override password policy and provisioning flowsManifest validation, restart-time loading only (no hot reload), registrar warnings when an override weakens the host baseline
TB4 — Operator workstation ↔️ Bootstrap APIBootstrap provisioning and revocation export are HTTP /internal/* calls authenticated with the static X-StellaOps-Bootstrap-Key; the operator CLI consumes issued tokens and bundlesBootstrap API-key secrecy, Bootstrap.Enabled gate, one-time invite tokens, offline kit checksum
TB5 — Authority ↔️ Downstream agentsRevocation bundle consumption, token validationSender-constrained tokens (DPoP jkt / mTLS x5t#S256 confirmation claims), detached JWS bundle signatures, bundle sequence + freshness checks

4. Data Flow Diagrams

4.1 Runtime token issuance

flowchart LR
    subgraph Client Tier
        CLI[StellaOps CLI]
        UI[UI / Automation]
    end
    subgraph Perimeter
        RP[Reverse Proxy / WAF]
    end
    subgraph Authority
        AUTH[Authority Host]
        PLGIN[Standard Plug-in]
        STORE[(PostgreSQL Credential Store)]
    end
    CLI -->|OAuth password / client creds| RP --> AUTH
    UI -->|OAuth flows| RP
    AUTH -->|PasswordHashOptions + Secrets| PLGIN
    AUTH -->|Verify / Persist hashes| STORE
    STORE -->|Rehash needed| AUTH
    AUTH -->|Access / refresh token| RP --> Client Tier

4.2 Bootstrap & revocation

flowchart LR
    subgraph Operator
        OPS[Operator Workstation]
    end
    subgraph Authority
        AUTH[Authority Host]
        STORE[(PostgreSQL)]
    end
    subgraph Distribution
        OFFKIT[Offline Kit Bundle]
        AGENT[Authorized Agent / Concelier]
    end
    OPS -->|POST /internal/users + X-StellaOps-Bootstrap-Key| AUTH
    AUTH -->|One-time invite + Argon2id hash| STORE
    AUTH -->|GET /internal/revocations/export (signed bundle + detached JWS)| OFFKIT
    OFFKIT -->|Base64 JSON + JWS signature + sha256 digest| AGENT
    AGENT -->|Revocation ACK / telemetry| AUTH

5. STRIDE Analysis

ThreatSTRIDE VectorSurfaceRisk (L×I)Existing ControlsGaps / ActionsOwner
Spoofed revocation bundleSpoofingTB5 — Authority ↔️ AgentsMed×HighDetached JWS signature over canonical bundle (RevocationBundleSigner, typ=application/vnd.stellaops.revocation-bundle+jws, b64:false/crit:["b64"]) via ICryptoProviderRegistry; per-bundle sha256 digest + monotonic sequence; offline kit checksumsShip operator-facing verification script/CLI sample and document key registry/rotation for offline consumers (SEC4.B/SEC4.HOST)Security Guild (follow-up: SEC5.B)
Parameter tampering on /tokenTamperingTB1 — Public ingressMed×HighASP.NET model validation, OpenIddict, rate limiter (CORE8.RL)Tampered requests emit authority.token.tamper audit events (request.tampered, unexpected parameter names) correlating with /token outcomes (SEC5.C)Security Guild + Authority Core (follow-up: SEC5.C)
Bootstrap invite replayRepudiationTB4 — Operator ↔️ Bootstrap APILow×HighOne-time invite tokens reserved/released at /internal/users, Argon2id hashing on creationInvites carry ExpiresAt and are rejected after expiry/consumption, emitting authority.bootstrap.invite.{consumed,expired,rejected} audit events (SEC5.D)Security Guild
Token replay by stolen agentInformation DisclosureTB5Med×HighSender-constrained tokens bind the token to a proof key — DPoP (cnf.jkt confirmation + nonce) or mTLS (cnf.x5t#S256 certificate thumbprint), applied by AuthoritySenderConstraintHelper; signed revocation bundlesMonitor revocation acknowledgement latency via Zastava and tune replay alerting thresholds; behavioural device-fingerprint heuristics are not yet implementedSecurity Guild + Zastava (follow-up: SEC5.E)
Privilege escalation via plug-in overrideElevation of PrivilegeTB3 — Plug-in sandboxMed×HighRestart-only plug-in loading, configuration validation (StandardPluginOptions.Validate), runtime registrar warning when an override password policy is weaker than the host baseline (PasswordPolicyOptions.IsWeakerThan)Add static analysis on plug-in manifests/overrides to catch weakening before deploymentSecurity Guild + DevOps (follow-up: SEC5.F)
Offline bundle tamperingTamperingDistributionLow×HighSHA256 manifest; Authority’s revocation bundle itself carries a detached JWS (see “Spoofed revocation bundle”), but whole-Offline-Kit supply-chain attestation is not yet wiredAdd supply-chain attestation for the Offline Kit build and publish a verification CLI in docsSecurity Guild + Ops (follow-up: SEC5.G)
Failure to log denied tokensRepudiationTB2 — Authority ↔️ PostgreSQLMed×MedAuthorityAuditSink persists every AuthEventRecord to PostgreSQL (IAuthorityLoginAttemptStore.InsertAsync) carrying outcome, correlation ID, subject/client, tenant, and network (remote/forwarded-for/user-agent) fields, with structured logging scope and dual-write to the Timeline audit sink; Standard plug-in credential telemetry (authority.plugin.standard.password_verification)Require the same audit contract for the federation plug-ins (LDAP/OIDC/SAML) and confirm denial reasons are normalised across grant typesSecurity Guild + Authority Core (follow-up: SEC5.H)

Risk scoring uses qualitative scale (Low/Med/High) for likelihood × impact; mitigation priority follows High > Med > Low.

6. Follow-up Backlog Hooks

Backlog IDLinked ThreatSummaryTarget Owners
SEC5.PLGTB3 — Plug-in sandboxStandard plug-in mitigations documented: Argon2id bootstrap hashing (with PBKDF2 legacy verification + transparent rehash), password-policy warnings, and credential audit telemetry (plugin.retry_after_seconds, plugin.lockout_until, plugin.failure_code, plugin.rehashed) wired into SOC pipelines.Security Guild + BE-Auth Plugin
SEC5.BSpoofed revocation bundleBundle signing is implemented (RevocationBundleSigner over ICryptoProviderRegistry, ES256 default, detached JWS). Remaining: ship the operator-facing revocation verification script/CLI sample and document key registry/rotation for offline consumers.Security Guild + Authority Core
SEC5.CParameter tampering on /tokenImplemented: TokenRequestTamperInspector flags unexpected/duplicated parameter names and the grant handlers emit authority.token.tamper audit records (request.tampered) for both the password and client-credentials flows. Remaining: keep the inspector’s known-parameter allow-list in sync with new OpenIddict grant parameters.Security Guild + Authority Core
SEC5.DBootstrap invite replayImplemented: invites carry ExpiresAt, are reserved/released/expired at /internal/users provisioning, and emit authority.bootstrap.invite.{created,consumed,expired,rejected} audit events. Remaining: periodic sweep/expiry telemetry for never-consumed invites.Security Guild
SEC5.EToken replay by stolen agentSender-constraint binding (DPoP/mTLS) is implemented; coordinate Zastava alerting to surface stale revocation acknowledgements. Behavioural device-fingerprint heuristics remain a future enhancement (not yet implemented).Security Guild + Zastava
SEC5.FPlug-in override escalationStatic analysis of plug-in manifests; warn on weaker password policy overrides.Security Guild + DevOps
SEC5.GOffline bundle tamperingExtend Offline Kit build to include attested manifest + verification CLI sample.Security Guild + Ops
SEC5.HFailure to log denied tokensImplemented: AuthorityAuditSink persists all auth events (including /token denials and authority.token.tamper) to PostgreSQL with correlation IDs. Remaining: enforce the same audit contract across the LDAP/OIDC/SAML federation plug-ins.Security Guild + Authority Core

Update src/__Libraries/StellaOps.Cryptography/TASKS.md (Security Guild board) with the above backlog entries to satisfy SEC5.A exit criteria.

6.1 Plugin telemetry status (SEC5.PLG — 2025-11-09)