Do not file a public issue for security vulnerabilities.
Use GitHub's private vulnerability reporting or email security@adaptive-storage.dev.
We aim to acknowledge reports within 48 hours and provide a fix timeline within 7 days.
| Severity | Examples | Embargo | Target Fix |
|---|---|---|---|
| Critical | Remote code execution, key material leak, auth bypass | Up to 90 days | 72 hours |
| High | Privilege escalation, data corruption, crypto weakness | Up to 60 days | 7 days |
| Medium | Denial of service, information disclosure | Up to 30 days | 14 days |
| Low | Minor info leak, hardening gap | No embargo | Next release |
For Critical and High severity issues:
- Fixes are developed in a private branch (not pushed to
mainuntil disclosure). - The reporter is consulted on the Coordinated Release Date (CRD).
- Maximum embargo period is 90 days from acknowledgment.
- Disclosure dates avoid Fridays and public holidays.
- Once the fix is released, a security advisory is published with CVE (if applicable).
Only the latest main branch receives security updates.
This describes the post-reset main branch. None of it has been professionally audited; don't use SPACE in production without an independent review.
- Segments can be encrypted with XTS-AES-256 and authenticated with a 16-byte BLAKE3 keyed MAC. The MAC is checked in constant time before decryption.
- Per-version keys are derived from a 32-byte master key with HKDF-HMAC-SHA256 and zeroized on drop. See ENCRYPTION_IMPLEMENTATION.md.
spacectl createand S3 PUT encrypt by default whenSPACE_MASTER_KEYis set.spacectl create --policy-filepicks another policy.- The master key comes from
SPACE_MASTER_KEY(64 hex characters).SPACE_MASTER_KEY_FILEisn't supported; the library API does have aFileKeyProvider. - A malformed
SPACE_MASTER_KEYis a startup error. With no key set, writes whose policy asks for encryption fail. - Encryption is deterministic so that dedup keeps working. Identical segments produce identical ciphertext, which reveals that they're equal.
- Key rotation isn't persisted across restarts (#98).
- Every segment is verified on read: encrypted ones by MAC, unencrypted ones by content hash.
- Whether a segment counts as encrypted is a flag in an unauthenticated JSON sidecar. A capsule whose policy requires encryption refuses a segment marked unencrypted.
- Deep scrub verifies content hashes and MACs when it runs, but nothing runs it automatically (#97).
spacectl serve-s3has no authentication. It listens on 127.0.0.1 unless started with--bind, and sends no CORS headers, so web pages on other origins can't call it. Anyone who can reach the port can read, write and delete objects.- There's no TLS.
- Lock acquisitions in
storage,pipeline,protocol-s3andcapsule-registrymostly recover from poisoned locks withunwrap_or_else(|e| e.into_inner()).nvram-simstill uses.unwrap(). - Cryptographic and serialization dependencies are pinned to exact versions in the root
Cargo.toml, andCargo.lockis committed.
These belonged to crates removed in the 2026-10-19 reset and are on archive/pre-reset-2026-10:
- object API path validation;
- replication frame size limits;
- JWT and token auth, and orchestrator signing keys;
- inter-node TLS;
- the eBPF gateway;
- the post-quantum key wrap.