# CAS Security Architecture

## The Problem with chmod-based Protection

### User-Mode Reality Check

In user-space (`~/.local/share/nexus/cas/`), **chmod 555 is security theater**, not security:

- **User owns the inode** → User can `chmod 700`, modify, `chmod 555` back
- **No privilege separation** → Cannot protect user from themselves with POSIX permissions
- **xattr immutable flag** → Requires root/CAP_LINUX_IMMUTABLE (not available to regular users)

**Verdict:** `chmod 555` is a "Do Not Touch" sign written in pencil. It prevents *accidental* deletion but provides **zero security** against intentional tampering.

## The Real Security Model

### 1. Merkle Tree Verification (Primary Defense)

**The CAS Merkle tree is the source of truth**, not filesystem permissions.

```
Filesystem = "Dirty" Physical Layer (untrusted)
Merkle Tree = "Sacred" Logical Layer (trusted)
```

**Strategy:**
- **Lazy Verification:** Verify hash before executing/grafting critical binaries
- **Tainted Flag:** Hash mismatch → refuse to run OR auto-heal (re-download/re-link)
- **Continuous Integrity:** Periodic background verification of CAS contents

**Implementation:**
```nim
proc verifyAndExecute*(cas: CasManager, hash: string): Result[void, CasError] =
  # 1. Retrieve chunk
  let data = cas.retrieveChunk(hash)

  # 2. Verify hash matches
  let calculatedHash = calculateXxh3(data)
  if calculatedHash != hash:
    # Hash mismatch - chunk is tainted
    return err(CasError(
      code: IntegrityViolation,
      msg: "Chunk integrity violation - auto-healing",
      objectHash: hash
    ))

  # 3. Execute only if verified
  return ok()
```

### 2. User Namespaces (Runtime Isolation)

**For execution environments**, use Linux User Namespaces to enforce read-only access:

```bash
# Create mount namespace with read-only CAS
unshare --mount --map-root-user bash -c '
  mount --bind -o ro ~/.local/share/nexus/cas ~/.local/share/nexus/cas
  exec /path/to/application
'
```

**Benefits:**
- Kernel-enforced read-only view (not bypassable by process)
- Even if app is compromised, cannot write to CAS
- Works without root privileges (user namespaces)

**Implementation Strategy:**
```nim
proc launchWithProtection*(cas: CasManager, executable: string): Result[Process, CasError] =
  # 1. Create user namespace with read-only bind mount
  # 2. Execute application inside namespace
  # 3. Application sees CAS as truly read-only
```

### 3. System-Mode Protection (Root-Owned CAS)

**For system-wide installations** (`/var/lib/nexus/cas/`):

- **Root owns files:** `chown root:root`, `chmod 644/755`
- **Users in pkg-users group:** Read-only access
- **Daemon handles writes:** Only privileged daemon can modify CAS
- **Here chmod actually works:** Users cannot change permissions they don't own

## Hybrid Architecture

### Storage Layer (Disk)
- **Keep chmod 555** as UX guardrail (prevents accidental `rm`)
- **Acknowledge it's not security** - just convenience
- **Real security comes from verification**

### Execution Layer (Runtime)
- **User Namespaces:** Bind-mount CAS as read-only for process tree
- **Merkle Verification:** Verify hashes before execution
- **Auto-Healing:** Re-download/re-link on integrity violation

### System Mode
- **Root ownership:** Traditional POSIX permissions work here
- **Daemon-mediated writes:** Only privileged process modifies CAS
- **User read-only access:** Standard Unix security model

## Implementation Priorities

### Phase 1: Merkle Verification (CRITICAL)
✅ Already implemented: xxh3-128 hashing
🔧 TODO: Pre-execution verification
🔧 TODO: Auto-healing on integrity violation
🔧 TODO: Background integrity scanning

### Phase 2: User Namespace Isolation (HIGH)
🔧 TODO: Launcher wrapper with mount namespaces
🔧 TODO: Read-only bind mount for CAS during execution
🔧 TODO: Integration with nippels namespace system

### Phase 3: System Mode (MEDIUM)
🔧 TODO: Root-owned CAS for system installations
🔧 TODO: Privileged daemon for write operations
🔧 TODO: User group management

## Security Guarantees

| Attack Vector | User Mode Defense | System Mode Defense |
|---------------|-------------------|---------------------|
| Accidental deletion | chmod 555 (UX) | root ownership |
| Intentional tampering | Merkle verification | root ownership + Merkle |
| Compromised app | User namespaces | User namespaces + root ownership |
| Supply chain attack | Signature verification | Signature verification |
| Bit rot / corruption | Merkle verification | Merkle verification |

## Conclusion

**Don't rely on chmod for security in user-mode.** Use:

1. **Merkle tree verification** (cryptographic integrity)
2. **User namespaces** (kernel-enforced isolation)
3. **Root ownership** (system-mode only)

The current chmod implementation remains as a **UX feature** (prevents accidents), but security comes from **cryptographic verification** and **architectural isolation**.

---

**Document Version:** 1.0
**Last Updated:** November 20, 2025
**Status:** Architecture Decision Record
**Credit:** Analysis by Voxis Forge
