Confidential Computing — TEE attestation
A partir da v4.4, o CipherVault valida atestados de 3 Trusted Execution Environments principais. Use case: provar para o cofre que um workload está rodando dentro de uma enclave íntegra antes de liberar secrets críticos.
TEEs suportados
| TEE | Provider | Status validação |
|---|---|---|
| AWS Nitro Enclaves | NitroProvider (v4.1) | ✅ Validação ECDSA completa contra Nitro Root CA embutida |
| Intel SGX DCAP | SgxDcapProvider (v4.4) | ⚠️ Parsing + measurements + nonce check; assinatura ECDSA contra Intel root requer libsgx_dcap_quoteverify (Phase 2) |
| AMD SEV-SNP | SevSnpProvider (v4.4) | ⚠️ Parsing 1184 bytes + measurement + nonce; assinatura contra AMD root requer libsnphost (Phase 2) |
Endpoint principal
POST /attestation/verify
Payload depende do format:
{
"format": "aws-nitro-cose-sign1",
"attestation_doc_b64": "...",
"expected_pcrs": { "0": "...", "1": "...", "2": "..." },
"nonce": "..."
}
Formats aceitos:
aws-nitro-cose-sign1(default, back-compat)sgx-dcap-quote-v3amd-sev-snp-report
Response:
{
"valid": true,
"format": "aws-nitro-cose-sign1",
"signature_validated": true,
"freshness_ok": true,
"nonce_match": true,
"pcr_match": true,
"measurements": {
"PCR0": "...",
"PCR1": "...",
"PCR2": "..."
}
}
AWS Nitro Enclaves (validação completa)
Producer (dentro da enclave)
# Dentro da enclave — gera attestation doc com nonce do CV
nsm-cli describe-pcr --pcr-index 0
nsm-cli get-attestation-doc \
--user-data <hash-do-nonce> \
--output attestation-doc.bin
Verifier (no CV)
curl -X POST https://cv.acme.com.br/attestation/verify \
-H "Authorization: Bearer $CV_TOKEN" \
-d '{
"format": "aws-nitro-cose-sign1",
"attestation_doc_b64": "...",
"nonce": "challenge-from-cv-1234",
"expected_pcrs": {
"0": "0000...8af2",
"1": "0000...beef"
}
}'
O que é validado
- Decode COSE_Sign1 + payload CBOR via
cbor-x - Cert chain walk até AWS Nitro Root CA (PEM embedded, validated SHA-384)
- ECDSA-P384/SHA-384 signature verify (raw → DER conversion)
- Freshness ±5min default
- Nonce match via
timingSafeEqual(anti-replay) - PCR allowlist comparada contra
expected_pcrs
Configuração via env
# Allowlist de PCRs aceitas (carregada por loadExpectedPCRsFromEnv)
ATTESTATION_EXPECTED_PCR0=0000...8af2
ATTESTATION_EXPECTED_PCR1=0000...beef
# Janela de freshness (default 300s)
ATTESTATION_FRESHNESS_SECONDS=300
# Bypass para testes (NUNCA em produção)
NITRO_NSM_BINARY=/usr/bin/nsm-cli
NITRO_MOCK_DOC_FILE=/path/to/mock-doc.bin
Intel SGX DCAP
# Dentro da enclave — gera quote DCAP v3
sgx-quote-cli --report-data <sha256-do-nonce> --out quote.bin
curl -X POST https://cv.acme.com.br/attestation/verify \
-d '{
"format": "sgx-dcap-quote-v3",
"quote_b64": "...",
"nonce": "challenge-from-cv-...",
"expected_measurements": {
"mrenclave": "abcdef...",
"mrsigner": "123456..."
}
}'
Estrutura parseada (436+ bytes)
| Offset | Campo |
|---|---|
| 96 | MRENCLAVE (32 bytes) |
| 176 | MRSIGNER (32 bytes) |
| 368 | REPORTDATA (64 bytes) |
Nonce é validado via SHA-256(nonce) === REPORTDATA[0..32].
Limitação atual
signature_validated: false na response — assinatura ECDSA contra
Intel root CA exige libsgx_dcap_quoteverify (binding C nativa).
Phase 2 follow-up.
Mock para dev sem hardware
SGX_QGS_BINARY=/usr/bin/sgx-quote-cli
SGX_MOCK_QUOTE_FILE=/path/to/mock-quote.bin
AMD SEV-SNP
# Dentro do guest SEV-SNP
sev-snp-cli get-report --report-data <sha512-do-nonce> --out report.bin
curl -X POST https://cv.acme.com.br/attestation/verify \
-d '{
"format": "amd-sev-snp-report",
"report_b64": "...",
"nonce": "challenge-...",
"expected_measurements": {
"measurement": "abcdef...",
"chip_id": "..."
}
}'
Estrutura (1184 bytes per AMD SEV-SNP ABI Spec table 21)
| Offset | Campo |
|---|---|
| 152 | Measurement (SHA-384, 48 bytes) |
| 424 | Chip ID (64 bytes) |
Nonce: SHA-512(nonce) === REPORTDATA[0..64].
Limitação
Mesma da SGX — signature_validated: false. Phase 2 requer
libsnphost.
SEV_SNP_BINARY=/usr/bin/sev-snp-cli
SEV_SNP_MOCK_REPORT_FILE=/path/to/mock-report.bin
Healthcheck
GET /health/attestation
Retorna providers disponíveis + healthy:
{
"providers": {
"nitro": { "available": true, "binary": "/usr/bin/nsm-cli" },
"sgx": { "available": false, "reason": "binary not found" },
"sev-snp": { "available": true, "binary": "/usr/bin/sev-snp-cli" }
}
}
Casos de uso
1. Liberar secret apenas a workload validado
App em enclave Nitro pede secret ao CV. CV exige attestation no header
X-Attestation-Doc antes de retornar valor. Se PCRs não baterem com
allowlist do tenant → 403.
2. Auditoria de provisionamento
CRDs Kubernetes (CipherVaultLease) podem incluir attestation field.
Operator anexa attestation no request, CV registra attestation_pcrs
no audit log.
3. Compliance regulatório
PCI DSS / FedRAMP exigem evidência de execução em ambiente isolado. Logs de attestation cumprem o requisito (export SIEM com payload completo).
Roadmap (Phase 2)
- Validação ECDSA Intel SGX completa via
libsgx_dcap_quoteverify - Validação ECDSA AMD SEV-SNP via
libsnphost - Support para Apple Secure Enclave (workloads M-series)
- TDX (Intel Trust Domain Extensions) — substituto SGX
- Attestation continua válida por TTL configurável (revalidação automática)