GPU TEE attestation: verify GPU confidential mode and bind it to the CVM (currently unverified)
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 5/5
- Thời gian dự kiến
- Hơn một tuần
- Mức phù hợp với người mới
- 25/100
- Loại issue
- Tính năng
- Độ rõ ràng
- Khá rõ ràng
- Mức độ hoạt động
- Ít trao đổi
- Lĩnh vực
- infrastructure, security
Hướng nghiên cứu
Bắt đầu với docs/gpu-attestation-design.md, sau đó kiểm tra verifier/src/verification.rs, vmm/src/app/qemu.rs:840, dstack-attest/src/attestation.rs:176 và guest-agent/src/rpc_service.rs:327. Truy vết ranh giới sự kiện đã được đo hiện có và các dịch vụ khởi động GPU trước khi chọn một hướng công việc. Để được xem là hoàn tất, cần có xác minh và liên kết GPU theo chế độ fail-closed, đồng thời bao quát các thay đổi đối với verifier, KMS, RPC, service-gating và tài liệu khi phù hợp.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
Problem
dstack attaches NVIDIA GPUs to CVMs but never verifies them. The CPU-side stack has no GPU/NRAS logic, and the guest OS flips the GPU to "ready" unconditionally at boot, before the workload runs. Consequences:
- A non-confidential GPU (CC off in host BIOS, or a normal GPU) is exposed plaintext to the workload with no error that stops it — no attacker required.
- Even a genuine CC GPU is not bound to the CVM: nothing lets a relying party (or the KMS) trust that a specific attested CVM is backed by a genuine GPU in confidential mode.
"Dual attestation" in docs/security/security-model.md is a documented expectation, not something enforced anywhere.
Full design write-up: docs/gpu-attestation-design.md (branch gpu-tee-nras-verification).
Current gaps (evidence)
- No CPU-side GPU verification —
AttestationQuoteis CPU-TEE only;VerificationDetailshas no GPU fields (verifier/src/verification.rs). - GPU attached as plain
vfio-pci, no CC-mode/attestation (vmm/src/app/qemu.rs:840). nvidia-smi conf-compute -srs 1run unconditionally at boot, nocc_modecheck (meta-dstacknvidia-persistenced.service).app-compose.servicehas no dependency on GPU bring-up — the workload starts even if it fails.- No app-facing RPC to query/enable GPU confidentiality.
Threat model (what this closes / doesn't)
| Attack | Closed? |
|---|---|
| Forge GPU evidence (no NVIDIA key) | ✅ cert chain + RIM, verifier in measured guest |
| Non-CC / CC-off GPU silently used | ✅ fail-fast, cc_mode==ON |
| Copy attack — GPU-less instance B copies a GPU-attested value from A | ✅ only if verdict lives in append-only measured pre-app state; ❌ if in report_data (app-forgeable via guest-agent/src/rpc_service.rs:327) |
| Stale/replayed GPU evidence | ✅ fresh boot nonce |
| Live relay / cuckoo to a genuine remote CC GPU | ❌ residual — no shipping system defeats it; needs TEE-IO/TDISP hardware. Document, don't imply "GPU proven local." |
Workstreams
1. Offline local verifier (NVAT)
- Adopt NVIDIA C++ Attestation SDK (
libnvat, NVIDIA/attestation-sdk); Pythonnvtrustis EOL 2026-09-15. - Bake
libnvat+ pre-provisioned filesystem RIM store into the NVIDIA image (re-provision on driver/VBIOS upgrade). - Handle OCSP (the one online dep,
ocsp.ndis.nvidia.com): in-CVM caching/replay proxy at--ocsp-url, and/or a Rego policy toleratingx-nvidia-cert-ocsp-status.
2. Binding via measured append-only state (before the app boundary)
-
dstack-utilemits agpu-attestationevent committingH(nvat_eat‖cert_chain‖claims)beforesystem-ready. - Verifier trusts it via the existing
find_eventboundary (breaks atsystem-ready,dstack-attest/src/attestation.rs:176) → RTMR3-bound on TDX. -
report_datastays for freshness + RA-TLS key binding only — not the GPU verdict.
3. Fail-fast enforcement & app gate
-
dstack-gpu-attest.service: verify every configured GPU (num_gpus>0is measured), requirecc_mode==ON(rejectOFFandDEVTOOLS), set-srs 1only on pass. -
app-compose.serviceRequires=+After=dstack-gpu-attest.service; fail closed (nosystem-ready, no workload). - Guest-agent RPC
GetGpuAttestation()/EnsureGpuReady()so apps can confirm/enable before use.
4. KMS gating, verifier surfacing, docs
- KMS gates key release on the
gpu-attestationevent (likecompose-hash). - Verifier parses NVAT EAT/claims into
VerificationDetails. -
security-model.md: state the guarantee (measured-guest-vouches + channel-bound) and the co-location residual.
Caveats
- SEV-SNP is blocked: no runtime measurement register (
tpm_runtime_pcr()=None,has_tdx()=false);decode_app_info_sev_snpreads identity from launch-timeHOST_DATA/MrConfigV3and ignores the runtime log. SNP needs an SVSM/coconut-vTPM (PCR channel) before this works — until then SNP GPU attestation is strictly weaker than TDX. (See #713.) - DEVTOOLS CC mode enables CC APIs without memory encryption — must be rejected.
- Co-location residual stands until Blackwell TEE-IO/TDISP.
Hardware validation checklist (unconfirmed in docs)
- NVAT behavior on OCSP connection failure (fail-open vs closed); can Rego neutralize revocation?
- OCSP
nextUpdatewindow; warm-cache ride-through. - Exact
libnvatenv-var spellings; trust-root store overridability. - Does
-srs 1error or no-op on a CC-off GPU? - Does the driver expose SPDM
KEY_EXCHANGEkey (optional session-binding stretch)? - SNP SVSM vTPM feasibility in meta-dstack.
- Ngôn ngữ chính
- Rust
- Star
- 546
- Fork
- 96
- Merge trung bình
- 19 giờ 22 phút
- Pull request đã merge (30 ngày)
- 109
Hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của Dstack-TEE/dstack
-
Độ khó 5/5 Hơn một tuần Mức phù hợp với người mới 30/100
Dstack-TEE/dstack#1301 ·
-
Độ khó 3/5 1-2 ngày Mức phù hợp với người mới 55/100
Dstack-TEE/dstack#1300 ·
-
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 48/100
Dstack-TEE/dstack#1299 ·
-
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 48/100
Dstack-TEE/dstack#1298 ·
-
Độ khó 5/5 Hơn một tuần Mức phù hợp với người mới 25/100
Dstack-TEE/dstack#1297 ·
Tất cả issue của Dstack-TEE/dstack
Issue tương tự
-
risk:low runtime status:in-progress type:test
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 92/100
zeroclaw-labs/zeroclaw#11023 ·
-
good first issue refactor
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 84/100
EricSpencer00/Resilient#4835 · 1 bình luận ·
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 74/100
bisq-network/bisq-musig#204 ·
-
agent:ready documentation
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 88/100
cesarferreira/stax#890 ·