Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
53a53a2
feat(guest-agent): restore Verify on the unversioned service
Aug 24, 2026
b91f1d0
feat(guest-agent): fail EmitEvent with an explicit removal message
Aug 24, 2026
7f7748d
feat(guest-agent): add the dstack.guest.v1 proto surface
kvinwang Aug 24, 2026
6d88699
feat(guest-agent): serve dstack.guest.v1 and close the unversioned su…
kvinwang Aug 24, 2026
3f8a582
docs: specify the guest agent v1 API
kvinwang Aug 24, 2026
f124202
docs: changelog for the guest agent v1 API
kvinwang Aug 24, 2026
f4fea39
feat(guest-agent): name the frozen surfaces v0 and mount them at /v0
kvinwang Aug 24, 2026
a09e49e
feat(guest-agent): derive v1 keys under a v1-specific HKDF salt
kvinwang Aug 24, 2026
5982b85
docs: specify the v0/v1 path scheme and the v1 KDF salt
kvinwang Aug 24, 2026
e75756d
refactor(ra-tls): share the v1 key constants and the chain-link envelope
kvinwang Aug 24, 2026
f75c219
feat(guest-agent): drop AttestAppKey from WorkerV1
kvinwang Aug 24, 2026
2d51cf0
test(guest-agent): pin the frozen wire surfaces against silent additions
kvinwang Aug 24, 2026
9619d5e
test(guest-agent): tighten the mount and health-poll coverage
kvinwang Aug 24, 2026
c4202e2
docs: correct the v1 spec's external surface, probe rule and SDK status
kvinwang Aug 24, 2026
75af666
feat(sdk-rust): mirror both guest-agent surfaces with V0 and V1 clients
kvinwang Aug 24, 2026
376f5c3
docs(sdk): describe the two client surfaces
kvinwang Aug 24, 2026
a4c9e66
chore: drop the REUSE entry for the removed SDK vectors
kvinwang Aug 24, 2026
7572023
feat(sdk-python): mirror both guest-agent surfaces with V0 and V1 cli…
kvinwang Aug 24, 2026
8ee5e61
feat(sdk-go): mirror both guest-agent surfaces with V0 and V1 clients
kvinwang Aug 24, 2026
f2d11a0
feat(sdk-js): mirror both guest-agent surfaces with V0 and V1 clients
kvinwang Aug 24, 2026
cc652bb
docs: record that the SDKs now implement v1
kvinwang Aug 24, 2026
09ca570
docs: fold the SDK verification note into the 0.6.0 client entry
kvinwang Aug 24, 2026
d739525
feat(guest-agent): return boot-time GPU evidence as evidence bundles
kvinwang Aug 24, 2026
46791f3
feat(sdk): decode boot-time GPU evidence as evidence bundles
kvinwang Aug 24, 2026
8a5e03b
test(sdk-js): cover the non-empty GPU evidence bundle path
kvinwang Aug 24, 2026
0fcd31c
refactor: name the v1 services DstackGuest/Worker and split generated…
kvinwang Aug 24, 2026
5ca8f12
docs: v1-first framing, and drop traces of never-released methods
kvinwang Aug 24, 2026
7021e98
feat(sdk): make the unsuffixed client name the v1 surface
kvinwang Aug 24, 2026
9008caf
feat(sdk): make the unsuffixed client name the v1 surface in python a…
kvinwang Aug 24, 2026
5a1c166
docs(sdk): keep the chain adapters in the v0 world
kvinwang Aug 24, 2026
a808564
docs(sdk): keep the chain adapters in the v0 world for python and go
kvinwang Aug 24, 2026
b3c5d9b
docs(sdk-python): label the chain extras as v0-era
kvinwang Aug 24, 2026
e25fd5c
docs: keep v1 documentation free of chain flavor
kvinwang Aug 24, 2026
bca3311
docs(sdk): keep v1 documentation free of chain flavor in go, python a…
kvinwang Aug 24, 2026
1f35d1d
test(sdk): use neutral domain examples in the v1 suites
kvinwang Aug 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 19 additions & 6 deletions CHANGELOG.md

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,7 @@ Apps communicate with the guest agent via HTTP over `/var/run/dstack.sock`. Use
- [Gateway](./docs/dstack-gateway.md) - Gateway configuration

**Reference**
- [Guest Agent API v1](./docs/guest-api-v1.md) - Key derivation, signature chains, and the versioned guest API
- [App Compose Format](./docs/normalized-app-compose.md) - Compose file specification
- [Intel TDX Attestation](./docs/attestation-tdx.md) - Measurement and runtime-event verification
- [Native TEE Interfaces](./docs/native-tee-interfaces.md) - Advanced compatibility with Linux TEE devices and configfs-tsm
Expand Down
1 change: 0 additions & 1 deletion REUSE.toml
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,6 @@ path = [
"tools/sca/examples/hello-c/config.json",
"tools/sca/examples/heartbeat/rootfs/etc/heartbeat/interval",
"sdk/simulator/*.json",
"sdk/tests/vectors/*.json",
"sdk/go/go.sum",
"sdk/go/ratls/go.sum",
"dstack/kms/dstack-app/builder/shared/builder-pinned-packages.txt",
Expand Down
4 changes: 2 additions & 2 deletions docs/amd-sev-snp.md
Original file line number Diff line number Diff line change
Expand Up @@ -88,8 +88,8 @@ MrConfigV3 document through `HOST_DATA`, so a verifier can validate the report
and document binding and then compare this field with the expected GPU policy
digest. If the field is absent, this optional check is not asserted. This binds
the GPU policy, but not the later `gpu-attestation` runtime event or the
`GpuInfo` output: the current SEV-SNP path has no quote-bound runtime
measurement register.
boot-time GPU evidence returned by `/v1/Attest`: the current SEV-SNP path has
no quote-bound runtime measurement register.

The verifier supports the AMD Milan, Genoa, and Turin KDS product families.
Bergamo and Siena are handled through AMD's canonical Genoa KDS product path.
Expand Down
2 changes: 1 addition & 1 deletion docs/app-health-checks.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ older guest chokes on.
## Where the verdict comes from

The guest agent recomputes a verdict every 5 seconds and caches it; the gateway
polls `Worker.Health`, which only reads that cache. The two cadences are
polls `/prpc/v1/Health`, which only reads that cache. The two cadences are
independent on purpose — a fleet of gateway nodes polling the same instance must
not multiply into that many container-runtime queries inside the CVM, and the
RPC is served on the CVM's publicly reachable listener.
Expand Down
2 changes: 1 addition & 1 deletion docs/attestation-tdx.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ evaluation, `gpu-attestation`. The `gpu-policy-hash` payload is
The `gpu-attestation` payload is JSON containing the verified device count,
CC/DevTools state, and `evidence_sha256`.

The guest-agent `GpuInfo` API returns the complete `nvattest` JSON captured during boot; `Attest` returns the same bytes in `boottime_gpu_evidence` when called with `include_boottime_gpu_evidence`, so a verifier can fetch the quote and the GPU evidence in one round trip. It is not trustworthy by itself. (`AttestGpu` runs a *fresh* attestation against a caller nonce, but its result is not bound to the TD and must not be used as remote evidence; only the boot-time record below is.) After verifying the TDX quote and replaying the event log to RTMR3, hash the exact UTF-8 bytes of `GpuInfo.attestation` (or `Attest.boottime_gpu_evidence`) and require the result to equal the `gpu-attestation` event's `evidence_sha256`. See [GPU Security for AI Workloads](./security/security-model.md#gpu-security-for-ai-workloads) for the event schema, ordering, Rego example, and platform differences.
The guest-agent returns the complete `nvattest` record captured during boot from `/v1/Attest`, when the request sets `include_boottime_gpu_evidence`, so a verifier can fetch the quote and the GPU evidence in one round trip. `AttestResponse.boottime_gpu_evidence` is a list of `GpuEvidenceBundle` (`{vendor, format, evidence}`); the boot record is the bundle whose `vendor` is `nvidia` and whose `format` is `nvidia-nvattest-boottime-json-v1`, and its `evidence` is hex-encoded bytes that decode to the exact UTF-8 `nvattest` output. It is not trustworthy by itself. (`/v1/AttestGpu` runs a *fresh* attestation against a caller nonce and returns bundles tagged `nvidia-nvattest-collect-evidence-json-v1`, a deliberately distinct format that a boot-record verifier does not appraise; its result is not bound to the TD and must not be used as remote evidence; only the boot-time record below is.) After verifying the TDX quote and replaying the event log to RTMR3, hash the *decoded* bundle bytes — `SHA-256(hex_decode(bundle.evidence))`, never the JSON string as returned nor a re-serialized form — and require the result to equal the `gpu-attestation` event's `evidence_sha256`. See [GPU Security for AI Workloads](./security/security-model.md#gpu-security-for-ai-workloads) for the event schema, ordering, Rego example, and platform differences.

### 2.2. Determining expected MRs
MRTD, RTMR0, RTMR1, and RTMR2 correspond to the image. dstack OS builds all related software from source.
Expand Down
8 changes: 6 additions & 2 deletions docs/aws-ec2-production-verifier-runbook.md
Original file line number Diff line number Diff line change
Expand Up @@ -214,8 +214,12 @@ For GPU workloads, PCR14 also contains `gpu-policy-hash` immediately after
`SHA-256(JCS(requirements.gpu_policy))`, using `{}` when the policy is omitted.
Because the verifier replays the event chain against the signed NitroTPM
Attestation Document, this validates `gpu_policy_hash` on AWS. A successful GPU
launch also adds `gpu-attestation`; its `evidence_sha256` can be compared with
the exact UTF-8 bytes returned by `GpuInfo.attestation` after PCR14 replay.
launch also adds `gpu-attestation`; after PCR14 replay, its `evidence_sha256`
can be compared with `SHA-256(hex_decode(bundle.evidence))`, where `bundle` is
the `AttestResponse.boottime_gpu_evidence` entry whose `format` is
`nvidia-nvattest-boottime-json-v1`, returned by `/v1/Attest` when the request
sets `include_boottime_gpu_evidence`. Hash the decoded bytes exactly as
returned, not a re-serialized form.

The guest also extends a `MrConfig` V2 **config commitment** into **PCR8**
(`PCR8 = sha384(0^48 || config_id)`). This is **optional** and exists only to
Expand Down
Loading
Loading