You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Attestation-bootstrapped JWT-SVID issuance for sandboxes (and any workload with provider-native identity evidence): a one-time bootstrap reference issued at registration, redeemed from inside the workload with provider evidence + an in-workload DPoP key, yielding a short-lived JWT-SVID whose trust tier is decided by the evidence class. This is ODIS-L1-11 (attestation-bootstrapped trust) as a single generic door — platform evidence today, hardware evidence (#61) later, same endpoint.
Driving consumer: highflame-forge per-sandbox identity (see the forge companion issue). Today forge's mint injects a zid_sk_ API key as a plaintext env var — a bearer secret with authority, delivered over the channel forge's own credentials.py guard exists to prohibit.
Flow
Register (control plane): the trusted broker (forge) registers the agent as today but receives a bootstrap ref instead of an API key — single-use, ≤2 min TTL, no intrinsic authority (grants only the right to attempt redemption). Registration carries expected-evidence constraints (provider, workspace/app, instance binding claims).
Redeem (in-workload): POST /v1/attest/redeem with {bootstrap_ref, provider_evidence, DPoP proof}. ZeroID consumes the ref (single-use — reuse the WIMSE nonce machinery), dispatches to the matching attestation verifier, cross-checks evidence claims against the registration's expectations (e.g. Modal container_id binds this instance), assigns trust tier from evidence class, and issues the JWT-SVID.
Renew: same DPoP key, registration-active check (ODIS-L2-14); full re-attestation only on confirmed compromise signals (ODIS-L1-12). Revocation unchanged: registration delete / CAE cascade / TTL backstop.
Work items
Bootstrap-ref issuance on registration (opt-in alongside the existing api_key response) + single-use redemption store
POST /v1/attest/redeem — verify ref + evidence + DPoP binding, mint JWT-SVID with cnf.jkt, emit act chain from the broker's OBO exchange (per forge docs/PER-SANDBOX-IDENTITY.md end-state)
Compliance tests in house style (TestSPIFFE_JWTSVID_...) + COMPLIANCE.md row
Non-goals
X.509-SVIDs — SPIFFE: No X.509-SVID support #49 stands; revisit only when a concrete mTLS consumer exists (forge ForgeChannel is Phase-5 roadmap). SPIRE is deliberately not deployed: its value is node attestation on infrastructure we own; on Modal/Cloudflare the provider's own OIDC evidence is stronger than any join token we could mint.
Summary
Attestation-bootstrapped JWT-SVID issuance for sandboxes (and any workload with provider-native identity evidence): a one-time bootstrap reference issued at registration, redeemed from inside the workload with provider evidence + an in-workload DPoP key, yielding a short-lived JWT-SVID whose trust tier is decided by the evidence class. This is ODIS-L1-11 (attestation-bootstrapped trust) as a single generic door — platform evidence today, hardware evidence (#61) later, same endpoint.
Driving consumer: highflame-forge per-sandbox identity (see the forge companion issue). Today forge's mint injects a
zid_sk_API key as a plaintext env var — a bearer secret with authority, delivered over the channel forge's owncredentials.pyguard exists to prohibit.Flow
provider, workspace/app, instance binding claims).POST /v1/attest/redeemwith{bootstrap_ref, provider_evidence, DPoP proof}. ZeroID consumes the ref (single-use — reuse the WIMSE nonce machinery), dispatches to the matching attestation verifier, cross-checks evidence claims against the registration's expectations (e.g. Modalcontainer_idbinds this instance), assigns trust tier from evidence class, and issues the JWT-SVID.Work items
POST /v1/attest/redeem— verify ref + evidence + DPoP binding, mint JWT-SVID withcnf.jkt, emitactchain from the broker's OBO exchange (per forgedocs/PER-SANDBOX-IDENTITY.mdend-state)iss: https://oidc.modal.com; claims: workspace, environment, app, function,container_id) — sits beside the existing GitHub Actions / GCP WIF / K8s verifiersAttestationPolicy(forge-brokered-only → lowest; provider OIDC →verified_third_party; hardware report (feat: Hardware attestation — HSM/enclave key confinement and attestation document binding #61) → highest)sub= existing SPIFFE URI, single-audenforcement (rides RFC 8707 resource parameter on the token endpoint — the minting half of INV-IDN-006 #258/OAuth access tokens: aud defaults to the issuer — adopt RFC 8707 resource indicators so it names the target resource server #199 resource-indicator work),typconventions, and verify/.well-known/spiffe-trust-bundle.jsonand JWKS publish the same keys — standard SPIFFE SDKs must validate unmodifiedTestSPIFFE_JWTSVID_...) + COMPLIANCE.md rowNon-goals
Related
service/zeroid_mint.py,docs/PER-SANDBOX-IDENTITY.md,credentials.py(INV-ENF-004), forge companion issue