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
Merge upstream v7.0.0: Full TEE Capability — Phase 2 backend LLM attestation
Brings in upstream's v7.0.0 release (MorpheusAIs#712):
- Phase 2 provider-side backend LLM attestation (TDX quote, TLS pinning,
RTMR3 workload replay, CPU-GPU nonce binding, NVIDIA NRAS GPU attestation,
per-prompt fast verify)
- Single on-chain "tee" tag drives both hops; local isTee flag retired
- request_id propagation across inference/attestation log paths
- Per-entry Badger activity keys for session storage GC reclaim
- ECS deploy / CI-CD wait-timing hardening, docs rewrite, swagger updates
- Major version bump to 7
Conflict resolved in proxy-router/internal/blockchainapi/service.go:
OpenSession keeps the fork's nil-guard on authConfig (for mobile SDK use)
alongside upstream's new log := s.requestLog(ctx) binding, and our
execution-reverted retry loop was switched to use the request-scoped logger.
Verified: proxy-router builds cleanly and our touched packages
(chatstorage, storages, proxyapi, mobile) pass their unit tests. The
remaining pre-existing failures (attestation fixture/network tests,
TestRating, vet warnings) are inherited unchanged from upstream v7.0.0.
Made-with: Cursor
Copy file name to clipboardExpand all lines: .ai-docs/TEE_CICD_Supply_Chain_Hardening.md
+77-36Lines changed: 77 additions & 36 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,9 +1,11 @@
1
1
# CI/CD Supply-Chain Hardening for Morpheus Docker Images
2
2
3
-
**Last updated:** 2026-03-11
4
-
**First successful run (Phase 1a — signing):**[#22920492249](https://github.com/MorpheusAIs/Morpheus-Lumerin-Node/actions/runs/22920492249)
3
+
**Last updated:** 2026-04-22
4
+
**First successful run (Phase 1a — signing):**[#22920492249](https://github.com/MorpheusAIs/Morpheus-Lumerin-Node/actions/runs/22920492249)
5
5
**First end-to-end run (Phase 1b — deploy + verify):**[#22969993910](https://github.com/MorpheusAIs/Morpheus-Lumerin-Node/actions/runs/22969993910)
6
6
7
+
> **v7.0.0 release status.** The CI/CD hardening described here is the foundation that every downstream trust check depends on. Both **Phase 1c** (consumer-side proxy-router verification of the P-Node) and **Phase 2** (P-Node verifies its own backend LLM) have shipped on top of it — see [`TEE_Attestation_Architecture.md`](TEE_Attestation_Architecture.md) §7.4 and §7.7 for the code-level flow. The CI/CD pipeline itself remains unchanged from Phase 1b in this release; v7 is the *consumer* of the artifacts this pipeline produces.
8
+
7
9
---
8
10
9
11
## Why This Matters
@@ -197,38 +199,59 @@ This shows all attached artifacts — signature, attestation, and SBOM — in a
197
199
198
200
---
199
201
200
-
## What This Enables — The Full Loop
202
+
## What This Enables — The Full Loop (as of v7.0.0)
201
203
202
-
This CI/CD hardening is the **foundation layer** for the full TEE attestation loop. As of Phase 1b, the pipeline is fully automated end-to-end:
204
+
This CI/CD hardening is the **foundation layer** for the full TEE attestation loop. As of v7.0.0, the loop is complete end-to-end — both consumer-side Phase 1 and P-Node-side Phase 2 are shipped:
**Why v6+ consumers are forward-compatible with v7+ providers:** Phase 2 runs **entirely inside the P-Node** — the consumer never talks to the backend LLM and never sees the backend's attestation quote. The consumer trusts Phase 2 transitively because it has already attested (via Phase 1) that the P-Node is running the exact `-tee` binary that enforces Phase 2. No client-side upgrade is required to get Phase 2 guarantees.
254
+
232
255
**How each artifact feeds the trust chain:**
233
256
234
257
1.**Image signing** → Consumers can verify a provider is running an official image, not a modified fork
@@ -255,28 +278,46 @@ This CI/CD hardening is the **foundation layer** for the full TEE attestation lo
255
278
256
279
## Current Status and Next Steps
257
280
258
-
### Completed (Phase 1a + 1b)
281
+
### Completed (Phase 1a + 1b — CI/CD)
259
282
260
283
| Step | Description | Status |
261
284
|---|---|---|
262
-
|**Cosign signing + SBOM**| Keyless signing, digest capture, SPDX SBOM for TEE image |**Done**|
263
-
|**TEE attestation manifest**| Signed JSON with digests, hashes, baked env, build provenance |**Done**|
264
-
|**RTMR3 computation**| Computed in CI/CD from deployed compose + SecretVM rootfs; embedded in signed manifest |**Done**|
265
-
|**Auto-deploy to SecretVM**|`Deploy-SecretVM-Test` job deploys digest-pinned compose to test VM via `secretvm-cli`|**Done**|
266
-
|**Post-deploy verification**| Polls live VM attestation, extracts RTMR3 from raw TDX quote, compares against CI-computed value |**Done**|
285
+
|**Cosign signing + SBOM**| Keyless signing, digest capture, SPDX SBOM for TEE image |**Done** (v6.0.0) |
286
+
|**TEE attestation manifest**| Signed JSON with digests, hashes, baked env, build provenance |**Done** (v6.0.0) |
287
+
|**RTMR3 computation**| Computed in CI/CD from deployed compose + SecretVM rootfs; embedded in signed manifest |**Done** (v6.0.0) |
288
+
|**Auto-deploy to SecretVM**|`Deploy-SecretVM-Test` job deploys digest-pinned compose to test VM via `secretvm-cli`|**Done** (v6.0.0) |
289
+
|**Post-deploy verification**| Polls live VM attestation, extracts RTMR3 from raw TDX quote, compares against CI-computed value |**Done** (v6.0.0) |
|**`IsTEEModel()` helper**| Detect `"tee"` tag on blockchain-registered models | TODO |
273
-
|**Consumer-side verification**| Fetch attestation from `:29343`, verify RTMR3 against signed manifest before opening session | TODO |
274
-
|**Consumer UI TEE badge**| Visual indicator for TEE-verified models | TODO |
296
+
|**`IsTeeModel()` helper**| Detect `"tee"` tag on blockchain-registered models; drives both hops of the trust chain |**Done** — PR #708, #709 (consolidated as sole TEE switch) |
297
+
|**Consumer-side verification**| Fetch attestation from `:29343`, verify quote via SecretAI portal, compare RTMR3 against signed manifest, pin TLS cert — all before opening session |**Done** (`attestation/verifier.go`) |
298
+
|**Per-prompt fast-verify**| Re-fetch quote, compare hash + TLS fingerprint on every forwarded prompt |**Done** — PR #686, #689|
299
+
|**Consumer UI TEE badge**| Visual indicator for TEE-verified models + session status |**Done**|
| CI/CD | Full RTMR0-2 *recomputation* in CI (today we verify RTMR0-2 by artifact-registry lookup, which is sufficient) | TODO — blocked on ACPI templates |
318
+
| CI/CD | AMD SEV-SNP measurement via `sev-snp-measure`| TODO — TDX-only today |
319
+
| CI/CD | CVE scanning (Trivy/Grype) — advisory then gating | TODO |
320
+
| Proxy-router | Verifiable per-message signing using SecretVM TEE-bound key | Deferred to Phase 2b |
321
+
| Proxy-router | Local in-process quote verification (remove `quote-parse` dependency on SCRT Labs) | Deferred to Phase 2b |
322
+
| Proxy-router | Co-located proxy-router + LLM in a single TDX VM (collapses both hops into one RTMR3) | Deferred to Phase 2b |
323
+
| Proxy-router | NRAS alternatives for non-NVIDIA GPU vendors | Deferred to Phase 2b |
0 commit comments