Pular para o conteúdo principal

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

TEEProviderStatus validação
AWS Nitro EnclavesNitroProvider (v4.1)✅ Validação ECDSA completa contra Nitro Root CA embutida
Intel SGX DCAPSgxDcapProvider (v4.4)⚠️ Parsing + measurements + nonce check; assinatura ECDSA contra Intel root requer libsgx_dcap_quoteverify (Phase 2)
AMD SEV-SNPSevSnpProvider (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-v3
  • amd-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

  1. Decode COSE_Sign1 + payload CBOR via cbor-x
  2. Cert chain walk até AWS Nitro Root CA (PEM embedded, validated SHA-384)
  3. ECDSA-P384/SHA-384 signature verify (raw → DER conversion)
  4. Freshness ±5min default
  5. Nonce match via timingSafeEqual (anti-replay)
  6. 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)

OffsetCampo
96MRENCLAVE (32 bytes)
176MRSIGNER (32 bytes)
368REPORTDATA (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)

OffsetCampo
152Measurement (SHA-384, 48 bytes)
424Chip 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)

Referências