21 KiB
EXO-AI 2025 Security Architecture
Executive Summary
EXO-AI 2025 implements a post-quantum secure cognitive substrate with multi-layered defense-in-depth security. This document outlines the threat model, cryptographic choices, current implementation status, and known limitations.
Current Status: 🟡 Development Phase - Core cryptographic primitives implemented with proper libraries; network layer and key management pending.
Table of Contents
- Threat Model
- Security Architecture
- Cryptographic Choices
- Implementation Status
- Known Limitations
- Security Best Practices
- Incident Response
Threat Model
Adversary Capabilities
We design against the following threat actors:
| Threat Actor | Capabilities | Likelihood | Impact |
|---|---|---|---|
| Quantum Adversary | Large-scale quantum computer (Shor's algorithm) | Medium (5-15 years) | CRITICAL |
| Network Adversary | Passive eavesdropping, active MITM | High | HIGH |
| Byzantine Nodes | Up to f=(n-1)/3 malicious nodes in federation | Medium | HIGH |
| Timing Attack | Precise timing measurements of crypto operations | Medium | MEDIUM |
| Memory Disclosure | Memory dumps, cold boot attacks | Low | HIGH |
| Supply Chain | Compromised dependencies | Low | CRITICAL |
Assets to Protect
- Cryptographic Keys: Post-quantum keypairs, session keys, shared secrets
- Agent Memory: Temporal knowledge graphs, learned patterns
- Federation Data: Inter-node communications, consensus state
- Query Privacy: User queries must not leak to federation observers
- Substrate Integrity: Cognitive state must be tamper-evident
Attack Surfaces
┌─────────────────────────────────────────────────────┐
│ ATTACK SURFACES │
├─────────────────────────────────────────────────────┤
│ │
│ 1. Network Layer │
│ • Federation handshake protocol │
│ • Onion routing implementation │
│ • Consensus message passing │
│ │
│ 2. Cryptographic Layer │
│ • Key generation (RNG quality) │
│ • Key exchange (KEM encapsulation) │
│ • Encryption (AEAD implementation) │
│ • Signature verification │
│ │
│ 3. Application Layer │
│ • Input validation (query sizes, node counts) │
│ • Deserialization (JSON parsing) │
│ • Memory management (key zeroization) │
│ │
│ 4. Physical Layer │
│ • Side-channel leakage (timing, cache) │
│ • Memory disclosure (cold boot) │
│ │
└─────────────────────────────────────────────────────┘
Security Architecture
Defense-in-Depth Layers
┌──────────────────────────────────────────────────────┐
│ Layer 1: Post-Quantum Cryptography │
│ • CRYSTALS-Kyber-1024 (KEM) │
│ • 256-bit post-quantum security level │
└──────────────────────────────────────────────────────┘
↓
┌──────────────────────────────────────────────────────┐
│ Layer 2: Authenticated Encryption │
│ • ChaCha20-Poly1305 (AEAD) │
│ • Per-session key derivation (HKDF-SHA256) │
└──────────────────────────────────────────────────────┘
↓
┌──────────────────────────────────────────────────────┐
│ Layer 3: Privacy-Preserving Routing │
│ • Onion routing (multi-hop encryption) │
│ • Traffic analysis resistance │
└──────────────────────────────────────────────────────┘
↓
┌──────────────────────────────────────────────────────┐
│ Layer 4: Byzantine Fault Tolerance │
│ • PBFT consensus (2f+1 threshold) │
│ • Cryptographic commit proofs │
└──────────────────────────────────────────────────────┘
↓
┌──────────────────────────────────────────────────────┐
│ Layer 5: Memory Safety │
│ • Rust's ownership system (no use-after-free) │
│ • Secure zeroization (zeroize crate) │
│ • Constant-time operations (subtle crate) │
└──────────────────────────────────────────────────────┘
Trust Boundaries
┌─────────────────────────────────────────────┐
│ TRUSTED COMPUTING BASE │
│ • Rust standard library │
│ • Cryptographic libraries (audited) │
│ • Local substrate instance │
└─────────────────────────────────────────────┘
│
Trust Boundary (cryptographic handshake)
│
↓
┌─────────────────────────────────────────────┐
│ SEMI-TRUSTED ZONE │
│ • Direct federation peers │
│ • Verified with post-quantum signatures │
│ • Subject to Byzantine consensus │
└─────────────────────────────────────────────┘
│
Trust Boundary (onion routing)
│
↓
┌─────────────────────────────────────────────┐
│ UNTRUSTED ZONE │
│ • Multi-hop relay nodes │
│ • Global federation queries │
│ • Assume adversarial behavior │
└─────────────────────────────────────────────┘
Cryptographic Choices
1. Post-Quantum Key Encapsulation Mechanism (KEM)
Choice: CRYSTALS-Kyber-1024
Rationale:
- ✅ NIST PQC Standardization: Selected as NIST FIPS 203 (2024)
- ✅ Security Level: Targets 256-bit post-quantum security (Level 5)
- ✅ Performance: Faster than lattice-based alternatives
- ✅ Key Sizes: Public key: 1184 bytes, Secret key: 2400 bytes, Ciphertext: 1568 bytes
- ✅ Research Pedigree: Based on Module-LWE problem, heavily analyzed
Alternative Considered:
- Classic McEliece (rejected: 1MB+ key sizes impractical)
- NTRU Prime (rejected: less standardization progress)
Implementation: pqcrypto-kyber v0.8 (Rust bindings to reference C implementation)
Security Assumptions:
- Hardness of Module Learning-With-Errors (MLWE) problem
- IND-CCA2 security in the QROM (Quantum Random Oracle Model)
2. Authenticated Encryption with Associated Data (AEAD)
Choice: ChaCha20-Poly1305
Rationale:
- ✅ IETF Standard: RFC 8439 (2018)
- ✅ Software Performance: 3-4x faster than AES-GCM on non-AES-NI platforms
- ✅ Side-Channel Resistance: Constant-time by design (no lookup tables)
- ✅ Nonce Misuse Resistance: 96-bit nonces reduce collision probability
- ✅ Quantum Resistance: Symmetric crypto only affected by Grover (256-bit key = 128-bit quantum security)
Implementation: chacha20poly1305 v0.10
Usage Pattern:
// Derive session key from Kyber shared secret
let session_key = HKDF-SHA256(kyber_shared_secret, salt, info)
// Encrypt message with unique nonce
let ciphertext = ChaCha20-Poly1305.encrypt(
key: session_key,
nonce: counter || random,
plaintext: message,
aad: channel_metadata
)
3. Key Derivation Function (KDF)
Choice: HKDF-SHA-256
Rationale:
- ✅ RFC 5869 Standard: Extract-then-Expand construction
- ✅ Post-Quantum Safe: SHA-256 provides 128-bit quantum security (Grover)
- ✅ Domain Separation: Supports multiple derived keys from one shared secret
Derived Keys:
shared_secret (from Kyber KEM)
↓
HKDF-Extract(salt, shared_secret) → PRK
↓
HKDF-Expand(PRK, "encryption") → encryption_key (256-bit)
HKDF-Expand(PRK, "authentication") → mac_key (256-bit)
HKDF-Expand(PRK, "channel-id") → channel_identifier
4. Hash Function
Choice: SHA-256
Rationale:
- ✅ NIST Standard: FIPS 180-4
- ✅ Quantum Resistance: 128-bit security against Grover's algorithm
- ✅ Collision Resistance: 2^128 quantum collision search complexity
- ✅ Widespread: Audited implementations, hardware acceleration
Usage:
- Peer ID generation
- State update digests (consensus)
- Commitment schemes
Upgrade Path: SHA-3 (Keccak) considered for future quantum hedging.
5. Message Authentication Code (MAC)
Choice: HMAC-SHA-256
Rationale:
- ✅ FIPS 198-1 Standard
- ✅ PRF Security: Pseudo-random function even with related-key attacks
- ✅ Quantum Resistance: 128-bit quantum security
- ✅ Timing-Safe Comparison: Via
subtle::ConstantTimeEq
Note: ChaCha20-Poly1305 includes Poly1305 MAC, so standalone HMAC only used for non-AEAD cases.
6. Random Number Generation (RNG)
Choice: rand::thread_rng() (OS CSPRNG)
Rationale:
- ✅ OS-provided entropy: /dev/urandom (Linux), BCryptGenRandom (Windows)
- ✅ ChaCha20 CSPRNG: Deterministic expansion of entropy
- ✅ Thread-local: Reduces contention
Critical Requirement: Must be properly seeded by OS. If OS entropy is weak, all cryptography fails.
Implementation Status
✅ Implemented (Secure)
| Component | Library | Status | Notes |
|---|---|---|---|
| Post-Quantum KEM | pqcrypto-kyber v0.8 |
✅ Ready | Kyber-1024, IND-CCA2 secure |
| AEAD Encryption | chacha20poly1305 v0.10 |
⚠️ Partial | Library added, integration pending |
| HMAC | hmac v0.12 + sha2 |
⚠️ Partial | Library added, integration pending |
| Constant-Time Ops | subtle v2.5 |
⚠️ Partial | Library added, usage pending |
| Secure Zeroization | zeroize v1.7 |
⚠️ Partial | Library added, derive macros pending |
| Memory Safety | Rust ownership | ✅ Ready | No unsafe code outside stdlib |
⚠️ Partially Implemented (Insecure Placeholders)
| Component | Current State | Security Impact | Fix Required |
|---|---|---|---|
| Symmetric Encryption | XOR cipher | CRITICAL | Replace with ChaCha20-Poly1305 |
| Key Exchange | Random bytes | CRITICAL | Integrate pqcrypto-kyber::kyber1024 |
| MAC Verification | Custom hash | HIGH | Use HMAC-SHA-256 with constant-time compare |
| Onion Routing | Predictable keys | HIGH | Use ephemeral Kyber per hop |
| Signature Verification | Hash-based | HIGH | Implement proper post-quantum signatures |
❌ Not Implemented
| Component | Priority | Quantum Threat | Notes |
|---|---|---|---|
| Key Rotation | HIGH | No | Static keys are compromise-amplifying |
| Forward Secrecy | HIGH | No | Session keys must be ephemeral |
| Certificate System | MEDIUM | Yes | Need post-quantum certificate chain |
| Rate Limiting | MEDIUM | No | DoS protection for consensus |
| Audit Logging | LOW | No | For incident response |
Known Limitations
1. Placeholder Cryptography (CRITICAL)
Issue: Several modules use insecure placeholder implementations:
// ❌ INSECURE: XOR cipher in crypto.rs (line 149-155)
let ciphertext: Vec<u8> = plaintext.iter()
.zip(self.encrypt_key.iter().cycle())
.map(|(p, k)| p ^ k)
.collect();
// ✅ SECURE: Should be
use chacha20poly1305::{ChaCha20Poly1305, KeyInit, AeadInPlace};
let cipher = ChaCha20Poly1305::new(&self.encrypt_key.into());
let ciphertext = cipher.encrypt(&nonce, plaintext.as_ref())?;
Impact: Complete confidentiality break. Attackers can trivially decrypt.
Mitigation: See Crypto Implementation Roadmap below.
2. Timing Side-Channels (HIGH)
Issue: Non-constant-time operations leak information:
// ❌ VULNERABLE: Variable-time comparison (crypto.rs:175)
expected.as_slice() == signature // Timing leak!
// ✅ SECURE: Constant-time comparison
use subtle::ConstantTimeEq;
expected.ct_eq(signature).unwrap_u8() == 1
Impact: Attackers can extract MAC keys via timing oracle attacks.
Mitigation:
- Use
subtle::ConstantTimeEqfor all signature/MAC comparisons - Audit all crypto code for timing-sensitive operations
3. No Key Zeroization (HIGH)
Issue: Secret keys not cleared from memory after use.
// ❌ INSECURE: Keys linger in memory
pub struct PostQuantumKeypair {
pub public: Vec<u8>,
secret: Vec<u8>, // Not zeroized on drop!
}
// ✅ SECURE: Automatic zeroization
use zeroize::Zeroize;
#[derive(Zeroize)]
#[zeroize(drop)]
pub struct PostQuantumKeypair {
pub public: Vec<u8>,
secret: Vec<u8>, // Auto-zeroized on drop
}
Impact: Memory disclosure attacks (cold boot, process dumps) leak keys.
Mitigation: Add #[derive(Zeroize)] and #[zeroize(drop)] to all key types.
4. JSON Deserialization Without Size Limits (MEDIUM)
Issue: No bounds on deserialized message sizes.
// ❌ VULNERABLE: Unbounded allocation (onion.rs:185)
serde_json::from_slice(data) // Can allocate GBs!
// ✅ SECURE: Bounded deserialization
if data.len() > MAX_MESSAGE_SIZE {
return Err(FederationError::MessageTooLarge);
}
serde_json::from_slice(data)
Impact: Denial-of-service via memory exhaustion.
Mitigation: Add size checks before all deserialization.
5. No Signature Scheme (HIGH)
Issue: Consensus and federation use hashes instead of signatures.
Impact: Cannot prove message authenticity. Byzantine nodes can forge messages.
Mitigation: Implement post-quantum signatures:
- Option 1: CRYSTALS-Dilithium (NIST FIPS 204) - Fast, moderate signatures
- Option 2: SPHINCS+ (NIST FIPS 205) - Hash-based, conservative
- Recommendation: Dilithium-5 for 256-bit post-quantum security
6. Single-Point Entropy Source (MEDIUM)
Issue: Relies solely on OS RNG without health checks.
Impact: If OS RNG fails (embedded systems, VMs), all crypto fails silently.
Mitigation:
- Add entropy health checks at startup
- Consider supplementary entropy sources (hardware RNG, userspace entropy)
Security Best Practices
For Developers
-
Never Use
unsafewithout security review- Current status: ✅ No unsafe blocks in codebase
-
Always Validate Input Sizes
if input.len() > MAX_SIZE { return Err(Error::InputTooLarge); } -
Use Constant-Time Comparisons
use subtle::ConstantTimeEq; if secret1.ct_eq(&secret2).unwrap_u8() != 1 { return Err(Error::AuthenticationFailed); } -
Zeroize Sensitive Data
#[derive(Zeroize, ZeroizeOnDrop)] struct SecretKey(Vec<u8>); -
Never Log Secrets
// ❌ BAD eprintln!("Secret key: {:?}", secret); // ✅ GOOD eprintln!("Secret key: [REDACTED]");
For Operators
-
Key Management
- Generate keys on hardware with good entropy (avoid VMs if possible)
- Store keys in encrypted volumes
- Rotate federation keys every 90 days
- Back up keys to offline storage
-
Network Security
- Use TLS 1.3 for transport (in addition to EXO-AI crypto)
- Implement rate limiting (100 requests/sec per peer)
- Firewall federation ports (default: 7777)
-
Monitoring
- Alert on consensus failures (Byzantine activity)
- Monitor CPU/memory (DoS detection)
- Log federation join/leave events
Crypto Implementation Roadmap
Phase 1: Fix Critical Vulnerabilities (Sprint 1)
Priority: 🔴 CRITICAL
- Replace XOR cipher with ChaCha20-Poly1305 in
crypto.rs - Integrate
pqcrypto-kyberfor real KEM incrypto.rs - Add constant-time MAC verification
- Add
#[derive(Zeroize, ZeroizeOnDrop)]to all key types - Add input size validation to all deserialization
Success Criteria: No CRITICAL vulnerabilities remain.
Phase 2: Improve Crypto Robustness (Sprint 2)
Priority: 🟡 HIGH
- Implement proper HKDF key derivation
- Add post-quantum signatures (Dilithium-5)
- Fix onion routing to use ephemeral keys
- Add entropy health checks
- Implement key rotation system
Success Criteria: All HIGH vulnerabilities mitigated.
Phase 3: Advanced Security Features (Sprint 3+)
Priority: 🟢 MEDIUM
- Forward secrecy for all sessions
- Post-quantum certificate infrastructure
- Hardware RNG integration (optional)
- Formal verification of consensus protocol
- Third-party security audit
Success Criteria: Production-ready security posture.
Incident Response
Security Contact
Email: security@exo-ai.example.com (placeholder) PGP Key: [Publish post-quantum resistant key when available] Disclosure Policy: Coordinated disclosure, 90-day embargo
Vulnerability Reporting
- DO NOT open public GitHub issues for security bugs
- Email security contact with:
- Description of vulnerability
- Proof-of-concept (if available)
- Impact assessment
- Suggested fix (optional)
- Expect acknowledgment within 48 hours
- Receive CVE assignment for accepted vulnerabilities
Known CVEs
None at this time (pre-production software).
Audit History
| Date | Auditor | Scope | Findings | Status |
|---|---|---|---|---|
| 2025-11-29 | Internal (Security Agent) | Full codebase | 5 CRITICAL, 3 HIGH, 2 MEDIUM | This Document |
Appendix: Cryptographic Parameter Summary
| Primitive | Algorithm | Parameter Set | Security Level (bits) | Quantum Security (bits) |
|---|---|---|---|---|
| KEM | CRYSTALS-Kyber | Kyber-1024 | 256 (classical) | 256 (quantum) |
| AEAD | ChaCha20-Poly1305 | 256-bit key | 256 (classical) | 128 (quantum, Grover) |
| KDF | HKDF-SHA-256 | 256-bit output | 256 (classical) | 128 (quantum, Grover) |
| Hash | SHA-256 | 256-bit digest | 128 (collision) | 128 (quantum collision) |
| MAC | HMAC-SHA-256 | 256-bit key | 256 (classical) | 128 (quantum, Grover) |
Minimum Quantum Security: 128 bits (meets NIST Level 1, suitable for SECRET classification)
Recommended Upgrade Timeline:
- 2030: Migrate to Kyber-1024 + Dilithium-5 (if not already)
- 2035: Re-evaluate post-quantum standards (NIST PQC Round 4+)
- 2040: Assume large-scale quantum computers exist, full PQC migration mandatory
References
- NIST FIPS 203 - Module-Lattice-Based Key-Encapsulation Mechanism Standard
- RFC 8439 - ChaCha20 and Poly1305
- RFC 5869 - HKDF
- NIST PQC Project
- Timing Attacks on Implementations of Diffie-Hellman, RSA, DSS, and Other Systems - Kocher, 1996
Document Version: 1.0 Last Updated: 2025-11-29 Next Review: Upon Phase 1 completion or 2025-12-31, whichever is sooner