Skip to content

Security Model

What Containment Chamber trusts, protects, and cannot protect

Containment Chamber protects validator signing keys by keeping private key material inside the signer boundary, checking every signature request before signing, and anchoring custody in a set of AWS KMS keys rather than operator passphrases or quorum handshakes.

The kms_auto-static model: the chamber master key is a 256-bit secret Shamir-split M-of-N across N AWS KMS custody keys; each share is individually KMS-wrapped and stored in the MASTER_KEY DynamoDB row. The trust anchor is the static ceremony parameter set — compiled into the binary and PCR0-measured on Nitro builds, or supplied in a trusted ceremony: config block on standard deployments. Custody parameters are not operator-supplied at runtime; they are part of the deployed artifact.

This page defines the security assumptions and limits. For the detailed adversary analysis — exactly what a compromised parent can and cannot do — see Threat & Risk Model. For component layout and deployment modes, see Architecture Overview.

Asset Protection goal
Validator BLS private keys Never expose through APIs, logs, config files, or persistent plaintext storage
DynamoDB master key Keep plaintext only in memory while the chamber is unsealed; split M-of-N across KMS keys at rest
Auth tokens Persist only HMAC-hashed token material in state-backed mode; resolve stateless static_auth secrets from config/env and hash them in memory at boot
Slashing history Preserve non-regressing slashing-protection state before approving new signatures

In standard mode, the host running the signer is inside the trust boundary. A compromised kernel, root account, or container runtime can read process memory or replace the binary. Use host hardening, network isolation, and least-privilege deployment controls to reduce that risk.

In Nitro Enclave mode, the parent EC2 instance or Kubernetes pod is outside the key-material trust boundary. It can forward bytes, provide bootstrap services, and observe metadata such as timing, but decrypted validator keys and reconstructed master-key material stay inside enclave memory.

Nitro mode still trusts AWS Nitro attestation, AWS KMS policy enforcement, and the correctness of the enclave image being measured. See Nitro Enclave Overview for the full model.

Containment Chamber depends on configured external systems:

  • Anti-slashing backend: must preserve accurate, non-regressing signing safety state.
  • AWS KMS: must enforce key policies and decrypt only for authorized callers or attested enclaves.
  • DynamoDB state/key tables: must preserve encrypted key material and chamber state rows with integrity.

Unauthorized signing. Auth policies can restrict callers by API scope, validator key, signing operation, and optional CIDR binding.

Slashable duplicate signing. Anti-slashing checks run before every signature. PostgreSQL is recommended for multi-instance production deployments; SQLite and DynamoDB are available for other deployment models.

Plaintext key persistence in DynamoDB mode. DynamoDB validator keys are encrypted under the chamber master key, which is never stored in plaintext. The master key lives Shamir-split across KMS custody keys; reconstructing it requires at least kms_threshold KMS decrypts from the ceremony key set.

Single KMS-key compromise. Because the master key is Shamir-split M-of-N, compromising one KMS key is insufficient when the threshold M is greater than one.

Accidental secret leakage. Private keys and plaintext tokens are not returned by APIs or written to logs. Secrets are zeroized when dropped, and Linux builds disable core dumps.

Compromised parent host in Nitro mode. With attested KMS and RA-TLS verification, the parent host can move traffic but cannot read enclave memory or KMS plaintext released only to the attested enclave.

Share renumbering and splicing attacks. Even if an attacker has DynamoDB write access, the share_hmac field — a master-key-keyed HMAC over each share’s share_id and every wrap’s (kms_key_arn, blob) — prevents forging a row with renumbered or spliced shares that would pass Shamir reconstruction.

Forged SEAL_OVERRIDE latches. The SEAL_OVERRIDE row carries an HMAC over (sealed_at, sealed_by_replica, reason) computed by a master-key subkey. The watcher verifies this HMAC before honouring a seal — a forged or tampered latch fails the watcher tick rather than triggering an unauthorized seal.

A fully compromised standard-mode host. Root-level access to the host can read process memory or replace the running binary. Use Nitro Enclave mode when the parent host should not be trusted with plaintext key material.

Enough compromised KMS keys. If an attacker can obtain plaintext decrypts from kms_threshold or more of the ceremony KMS keys, they can reconstruct the master key. Protect KMS key policies, IAM, and CloudTrail accordingly.

Tampered anti-slashing history. If an attacker can delete or rewrite slashing-protection records, the signer may approve signatures it should reject. Protect the backend with authentication, network controls, backups, and restricted write access.

Malicious or compromised validator clients. The signer can restrict what a client may request, but it cannot prove the validator client’s fork choice is honest.

Lost root token with a deleted ROOT_TOKEN_BOOTSTRAP row. The root management token is age-encrypted to root_token_recipients and stored in the ROOT_TOKEN_BOOTSTRAP DynamoDB row at auto-init. If both the decrypted token and the row are lost before any client tokens are created, re-create by IAM-deleting the ROOT_TOKEN_BOOTSTRAP row and restarting — boot re-creates iff the row is absent. Plan accordingly.

The following layers protect the master key and custody state independently; each must be defeated in sequence for a custody attack to succeed.

The MASTER_KEY row carries master_key_hash: a SHA-256 commitment to the plaintext master key, computed at auto-init and re-verified after every KMS auto-unseal. If reconstructed key bytes do not match the stored commitment — whether due to a share substitution attack or storage corruption — unseal fails closed.

share_hmac in the MASTER_KEY row is an HMAC-SHA256 value keyed by a master-key subkey, computed over each share’s share_id and every wrap’s (kms_key_arn, blob) in canonical order. A DynamoDB-write attacker without the master key cannot produce a valid share_hmac for a modified share layout. Verified immediately after the master-key commitment check during auto-unseal.

The auto-unseal path accepts decrypted share blobs only when the kms_key_arn reported by DynamoDB is present in the ceremony key set’s ARN list. Blobs wrapped under out-of-ceremony keys are rejected, regardless of whether KMS decrypts them. On Nitro, the ceremony ARN list is part of the PCR0-measured binary — changing which KMS keys are trusted requires a measurable rebuild.

Individual DynamoDB rows carrying sensitive state (auth tokens, policies) are HMAC-authenticated by master-key-derived subkeys. A DynamoDB-write attacker without the master key cannot forge a row whose HMAC verifies.

The SEAL_OVERRIDE row carries an HMAC over (sealed_at, sealed_by_replica, reason) computed by a master-key subkey. The watcher verifies this HMAC before honouring the latch. A forged or tampered SEAL_OVERRIDE row — written by an attacker with DynamoDB write access but not the master key — causes the watcher tick to fail rather than sealing the replica (RC8 tamper detection). When the master key is not available (pre-unseal), the latch is honoured conservatively: any present latch stops boot.

On Nitro, every KMS decrypt uses RecipientAttestation: the KMS response is encrypted to a public key generated inside the enclave and bound to the NSM attestation document. A valid decrypt can only be consumed inside the measured enclave. The parent host cannot intercept or pre-compute KMS plaintext for a different binary.

Protection Applies when
Check-before-sign anti-slashing Always, with configured backend
Auth policy enforcement When policies or unauthenticated policy are configured
HMAC-hashed auth tokens Auth enabled
Constant-time token comparison Auth enabled
Secret zeroization Always
Core dump prevention Linux
Memory locking Linux, when permitted by host capabilities
Master-key Shamir splitting (M-of-N across KMS keys) DynamoDB key source
Master-key commitment verification on unseal DynamoDB key source
Share-binding HMAC DynamoDB key source
KMS-ARN gate (ceremony key set) DynamoDB key source
SEAL_OVERRIDE HMAC (tamper detection) DynamoDB key source
Seal/unseal gating DynamoDB key source
RA-TLS attestation Nitro Enclave / RA-TLS deployments
PCR0-measured ceremony static Nitro Enclave
  • Use PostgreSQL anti-slashing for multi-instance production deployments.
  • Use Nitro Enclave mode when the parent host must not see plaintext key material.
  • Set kms_threshold ≥ 2 with KMS keys in distinct AWS accounts or regions to require multi-key compromise.
  • Keep management tokens in a secrets manager and prefer narrowly scoped client tokens.
  • Protect DynamoDB write access at the IAM level; write access alone is insufficient for a custody attack, but DynamoDB integrity is a defence-in-depth layer.
  • Monitor slashing rejections, auth failures, signer state, KMS errors, and canary-key signing.

For deployment-specific steps, see Production Hardening and Observability.