|
Download docs/THREAT_MODEL.md from Snapkitty/rowm-polymorphic-notebook: direct link, hf CLI and curl.
- Browser
- Download file 18 kB
-
https://huggingface.co/Snapkitty/rowm-polymorphic-notebook/resolve/main/docs/THREAT_MODEL.md
- Command line
-
hf download hf://Snapkitty/rowm-polymorphic-notebook/docs/THREAT_MODEL.md
-
curl -L -o THREAT_MODEL.md https://huggingface.co/Snapkitty/rowm-polymorphic-notebook/resolve/main/docs/THREAT_MODEL.md
18 kB
| # ROWM Threat Model & Security Analysis | |
| **Version:** 1.0.0 | |
| **Status:** Complete (verified 2026-07-27) | |
| **Authors:** Ahmad Ali Parr, Jessica SNAPKITTYWEST | |
| --- | |
| ## 1. Trust Boundaries | |
| ### Trusted Components (Assumed Secure) | |
| 1. **Prolog/Datalog engine** — Logic evaluation, rule grounding | |
| 2. **Rust runtime** — Memory safety, WORM enforcement | |
| 3. **Cryptographic libraries** — Blake3, Ed25519 (from established crates) | |
| 4. **Kernel/OS** — Process isolation, filesystem, system clock | |
| ### Untrusted Components (Validated Before Use) | |
| 1. **External source code** — All user-provided code in any language | |
| 2. **Notebook metadata** — Cell definitions, execution counts, outputs | |
| 3. **Network input** — Remote code, serialized instructions, proofs | |
| 4. **User-provided proofs** — Terms claimed to be proofs (external tools verify) | |
| 5. **Previously sealed artifacts** — Must re-verify linkage | |
| --- | |
| ## 2. In-Scope Threats | |
| ### Threat T1: Unauthorized Code Execution | |
| **Attack Vector:** Agent without permission executes code on protected runtime | |
| **Mitigation:** | |
| - All dispatch routes through `dispatch_gated/5` (sealed entry point) | |
| - Prolog checks: agent_active, trust_level ≠ tier_2, capability_issued, capability_active, not_revoked, not_expired, permission_granted, runtime_active | |
| - No bypass: code cannot query `capability_active/2` or `dispatch_permitted/5` directly | |
| **Residual Risk:** LOW | |
| - Requires compromise of Prolog engine or Rust runtime boundary | |
| - Requires forging Ed25519 signature OR recovering private key | |
| **Test Case:** `test_unauthorized_agent_dispatch` in test_queries.pl | |
| --- | |
| ### Threat T2: Capability Bypass via Expiration Boundary | |
| **Attack Vector:** Agent with expired capability uses it by manipulating time | |
| **Mitigation:** | |
| - Expiration boundary is EXCLUSIVE: `Timestamp < ExpiresAt` (not ≤) | |
| - Capability ExpiresAt=T is inactive at time T | |
| - get_time/1 uses system clock (not user-settable in normal mode) | |
| - Timestamp checked in hardened `dispatch_gated/5` | |
| **Residual Risk:** MEDIUM | |
| - If system clock can be manipulated (e.g., via NTP attack), boundary is bypassed | |
| - If Prolog engine can be forced to use stale time value, boundary is bypassed | |
| **Mitigation Upgrade:** Pin to monotonic clock; disallow backward clock adjustments | |
| **Test Case:** `test_expired_capability_rejection` in test_queries.pl (uses fixed time) | |
| --- | |
| ### Threat T3: Capability Revocation Evasion | |
| **Attack Vector:** Agent retains reference to revoked capability; uses it before revocation is detected | |
| **Mitigation:** | |
| - Revocation recorded as fact: `capability_revoked(CapID, Reason)` | |
| - Every dispatch checks: `\+ capability_revoked(CapID, _)` (negation-as-failure) | |
| - Revocation is WORM-sealed (immutable once written) | |
| - No capability can be "un-revoked" (monotonic) | |
| **Residual Risk:** LOW | |
| - Requires Prolog engine compromise (to retract revocation fact) | |
| - Requires racing between revocation and dispatch in nanosecond window | |
| **Test Case:** `test_revoked_capability_immediate_rejection` in test_queries.pl | |
| --- | |
| ### Threat T4: Proof Obligation Circumvention | |
| **Attack Vector:** Agent forces transition to RELEASED without discharging all 4 proof obligations | |
| **Mitigation:** | |
| - Release gate 1: `all_proofs_satisfied(true)` queries proof_satisfied/2 for all 4 obligations | |
| - Each proof obligation checked before release transition: | |
| 1. InvariantPreservation — loop invariants maintained | |
| 2. SemanticPreservation — source ≡ compiled semantics | |
| 3. LoopInvariantMaintenance — bounds and termination | |
| 4. ReceiptChainIntegrity — monotonic sequence + hash linkage | |
| - Failed proof blocks transition (state stays RECEIPTED) | |
| **Residual Risk:** LOW | |
| - Requires compromise of proof validator or Prolog engine | |
| - Requires forging proof artifact from external verifier | |
| **Test Case:** `test_release_blocked_on_failed_proof` in test_queries.pl | |
| --- | |
| ### Threat T5: Receipt Chain Tampering | |
| **Attack Vector:** Attacker modifies a receipt or inserts a receipt out of sequence | |
| **Mitigation:** | |
| - Receipt is signed with Ed25519 (once issued, immutable) | |
| - Signature covers canonical receipt bytes + previous_receipt_hash | |
| - Chain integrity verified via `receipt_chain_valid/1` predicate | |
| - Monotonic sequencing enforced: `Receipt_N.sequence < Receipt_N+1.sequence` | |
| - Out-of-order insertion detected by hash linkage mismatch | |
| **Residual Risk:** MEDIUM | |
| - If Ed25519 private key is compromised, receipts can be forged | |
| - If Prolog engine allows fact retraction, receipts can be deleted | |
| - Timestamp manipulation can reorder receipts within same second | |
| **Mitigation Upgrade:** | |
| - Use hardware-backed Ed25519 keys (TPM/HSM) | |
| - Append receipts to tamper-evident external ledger (blockchain or WORM storage) | |
| - Use nanosecond timestamps or logical clocks | |
| **Test Case:** `test_receipt_tampering_detected` in test_queries.pl | |
| --- | |
| ### Threat T6: Invariant Violation & Rollback Abuse | |
| **Attack Vector:** Attacker deliberately violates invariant to trigger rollback, causing state loss or inconsistency | |
| **Mitigation:** | |
| - Invariant violation triggers rollback to LAST VALID CHECKPOINT | |
| - Rollback is WORM-sealed (cannot undo a rollback) | |
| - Violation is recorded in receipt chain (permanent audit trail) | |
| - Repeated violations increment agent's violation counter (eventually triggers revocation) | |
| **Residual Risk:** LOW | |
| - Attacker can cause localized rollback but cannot escape global audit | |
| - Proof obligations will fail on violated execution path | |
| **Test Case:** `test_invariant_violation_triggers_rollback` in test_queries.pl | |
| --- | |
| ### Threat T7: Self-Modifying Code Escape | |
| **Attack Vector:** Cell code rewrites bytecode to bypass invariant checks or authorization | |
| **Mitigation:** | |
| - Code invariant is extracted and proved: `∀t ∈ [code_start, code_end]: M[t] == original[t]` | |
| - If code violates this invariant, symbolic execution detects the rewrite | |
| - Rewritten code is NOT re-compiled (would fail signature verification) | |
| - Self-modification is only allowed via M4 feedback (between cells), not within execution | |
| **Residual Risk:** LOW | |
| - Requires compromise of invariant extractor or symbolic execution engine | |
| - Requires proof obligation bypass (T4) | |
| **Test Case:** `test_code_self_modification_detected` in test_queries.pl | |
| --- | |
| ### Threat T8: Cross-Cell State Leakage via M4 | |
| **Attack Vector:** Cell N writes secret to M4 definitions; Cell N+1 accesses secret | |
| **Mitigation:** | |
| - M4 definitions are sandboxed: max_expansion_depth=100, max_output_size=1MB | |
| - Definitions are scoped to individual notebook execution (not global) | |
| - Outputs are passed through Prolog facts (auditable, signed) | |
| - Proof obligation checks semantic equivalence (no covert channels) | |
| **Residual Risk:** MEDIUM | |
| - M4 macro expansion is Turing-complete (can compute anything) | |
| - If M4 sandbox limits are exceeded, behavior is undefined | |
| **Mitigation Upgrade:** | |
| - Disable M4 macro expansion for untrusted agents | |
| - Use restricted M4 builtins (no system calls) | |
| - Require proof of M4 output equivalence | |
| **Test Case:** `test_m4_cross_cell_access_denied` (when sandboxed) | |
| --- | |
| ## 3. Out-of-Scope Threats | |
| ### Threat OOS-1: Physical Attacks | |
| **Scope:** Tamper with machine hardware, steal RAM, modify CPU | |
| **Rationale:** System assumes hardware boundary is protected. Mitigated by: | |
| - Deployment in secure data center | |
| - Hardware security modules (HSM) for key storage | |
| - Physical access controls | |
| --- | |
| ### Threat OOS-2: Compromised Kernel/OS | |
| **Scope:** Kernel patch that violates memory isolation or filesystem integrity | |
| **Rationale:** System assumes kernel is trustworthy. Cannot defend if OS is compromised. | |
| **Mitigation:** | |
| - Use verified kernel (e.g., seL4 with formal proof of isolation) | |
| - Run in VM hypervisor with attestation | |
| - Use signed boot (Secure Boot, measured launch) | |
| --- | |
| ### Threat OOS-3: Supply Chain Attack on Dependencies | |
| **Scope:** Malicious update to blake3, ed25519-dalek, or swipl packages | |
| **Rationale:** System assumes crates.io and package managers are trustworthy. | |
| **Mitigation:** | |
| - Pin dependency versions to verified commits | |
| - Use cargo vendor to isolate dependencies | |
| - Run internal security audit on critical crates | |
| - Use binary reproducibility to verify builds | |
| --- | |
| ### Threat OOS-4: Spectre/Meltdown CPU Attacks | |
| **Scope:** Side-channel attacks via CPU cache/speculation | |
| **Rationale:** Prolog/Rust don't have built-in defenses against CPU microarchitecture attacks. | |
| **Mitigation:** | |
| - Use constant-time implementations for cryptography (already in ed25519-dalek) | |
| - Run on CPUs with microcode patches | |
| - Deploy in VM with IBRS enabled | |
| --- | |
| ## 4. Cryptographic Assumptions | |
| ### Assumption C1: Blake3 Collision Resistance | |
| **Claim:** Two different inputs X, Y never produce same Blake3 hash (within 256-bit space) | |
| **Usage:** Receipt hashing, capability hashing, checkpoint ancestry verification | |
| **Risk:** If collision found, receipt chain integrity compromised | |
| **Mitigation:** | |
| - Use full 256-bit hash (not truncated) | |
| - Verify against Blake3 team's formal analysis | |
| - Monitor cryptanalysis literature for attacks | |
| --- | |
| ### Assumption C2: Ed25519 Signature Unforgeability | |
| **Claim:** Attacker without private key cannot produce valid Ed25519 signature | |
| **Usage:** Receipt signing, release manifest signing, agent identity | |
| **Risk:** If forged, attacker can fake any receipt or impersonate agent | |
| **Mitigation:** | |
| - Protect private keys in HSM or secure enclave | |
| - Rotate keys periodically | |
| - Publish public keys in tamper-evident registry | |
| - Use key pinning for critical agents | |
| **Current Gap:** HMAC-SHA256 used instead of Ed25519 (symmetric, not asymmetric) | |
| → Cannot verify signatures without secret key | |
| → Third-party audit impossible | |
| --- | |
| ### Assumption C3: SHA2 Second Preimage Resistance | |
| **Claim:** Attacker cannot find X' ≠ X such that SHA256(X') = SHA256(X) | |
| **Usage:** Source code hashing, bytecode hashing | |
| **Risk:** If preimage found, two different code paths could have same hash | |
| **Mitigation:** | |
| - Use full 256-bit hash (not truncated) | |
| - Transition to Blake3 where feasible (already using in receipts) | |
| --- | |
| ### Assumption C4: CBOR Deterministic Encoding | |
| **Claim:** Two semantically identical values always encode to identical CBOR bytes | |
| **Usage:** Canonical representation for hashing and signing | |
| **Risk:** If non-deterministic, same payload hashes differently at different times | |
| **Mitigation:** | |
| - Define canonical byte order (little-endian, ascending key order) | |
| - Validate CBOR library implements RFC 7049 deterministic encoding | |
| - Test equivalence: canonical(X) = canonical(canonicalize(X)) | |
| --- | |
| ## 5. Known Vulnerabilities & Limitations | |
| ### Vulnerability V1: Timestamp-Based Nondeterminism | |
| **Issue:** Receipt timestamps make reproducible verification impossible | |
| **Evidence:** Receipt includes `timestamp: 1719432000`, which differs on each execution | |
| **Impact:** Two executions of same code produce different receipt hashes | |
| **Mitigation:** | |
| - Inject canonical time at sealing time (not at execution time) | |
| - Use logical clock or block height (e.g., Git commit count) | |
| - For testing: mock get_time/1 | |
| **Status:** Known, documented, accepted for now | |
| **Upgrade Path:** Canonical time injection via test harness | |
| --- | |
| ### Vulnerability V2: No Cross-System Replay Protection | |
| **Issue:** Receipt from System A can be replayed in System B | |
| **Evidence:** Release.pl gate 11 checks "no_active_dependencies" but doesn't verify context | |
| **Impact:** Attacker can use same receipt in multiple contexts | |
| **Mitigation:** | |
| - Add context-specific binding: receipt includes system_id or deployment_context | |
| - Require capabilities to be per-system (not global) | |
| - Validate receipt is for current deployment | |
| **Status:** Known, documented, acknowledged | |
| **Upgrade Path:** Per-system capability scoping | |
| --- | |
| ### Vulnerability V3: Notebook Mutation After Seal | |
| **Issue:** Jupyter .ipynb file can be edited after cell execution recorded | |
| **Evidence:** Notebook cells are mutable JSON; no signature covers them | |
| **Impact:** Attacker modifies notebook cell after it executed, creating false history | |
| **Mitigation:** | |
| - Don't trust notebook file as source of truth | |
| - Use Prolog facts as authoritative record of cell state | |
| - Optionally: GPG-sign .ipynb file after each execution | |
| - For production: use immutable notebook storage (e.g., IPFS, blockchain) | |
| **Status:** Known, documented, mitigation available | |
| **Upgrade Path:** Signed notebook artifacts | |
| --- | |
| ### Vulnerability V4: HMAC Instead of Ed25519 | |
| **Issue:** Receipts are HMAC-signed (symmetric), not Ed25519-signed (asymmetric) | |
| **Evidence:** Scripts use `hmac_sha256(data, WORM_SECRET)`, not Ed25519 | |
| **Impact:** Cannot verify receipts without secret key; third-party audit impossible; not legally admissible | |
| **Compliance Impact:** | |
| - SOX §302: Officer certification requires independent verification ✗ | |
| - GDPR Article 5(2): Accountability requires third-party audit capability ✗ | |
| - ISO 27001 A.12.4: Event logging integrity requires asymmetric signatures ✗ | |
| **Mitigation:** | |
| - Implement Ed25519 signing for all receipts | |
| - Keep private key in HSM (not in code) | |
| - Publish public key for verification | |
| - Rotate keys annually | |
| **Status:** Known, unresolved | |
| **Upgrade Path:** Ed25519 implementation required before production release | |
| --- | |
| ### Vulnerability V5: Truncated Hashes | |
| **Issue:** Some implementations truncate hashes to 16 bytes (128 bits) instead of full 256 | |
| **Evidence:** `signature.slice(0, 16)` in worm-receipts.js | |
| **Impact:** Collision resistance reduced from ~2^128 to ~2^64; attackers can forge signatures with ~2^64 operations | |
| **Mitigation:** | |
| - Use full 256-bit hashes everywhere | |
| - Audit all hash truncation and remove it | |
| - Enforce minimum hash size in schemas | |
| **Status:** Known, unresolved | |
| **Upgrade Path:** Full-hash enforcement in cryptographic layer | |
| --- | |
| ### Vulnerability V6: Untested Proof Tool Integration | |
| **Issue:** Agda, Ada/SPARK, Lean 4 invocations are stubs; proof artifacts not validated | |
| **Evidence:** No integration tests for external proof tools | |
| **Impact:** Proof claims are unverified; release gates can pass falsely | |
| **Mitigation:** | |
| - Implement end-to-end tests for each proof tool | |
| - Validate proof artifacts (terms, types, signatures) | |
| - Reject unverified proof status | |
| - Require manual proof review for critical proofs | |
| **Status:** Known, documented | |
| **Upgrade Path:** Proof tool integration tests (Phase 8+) | |
| --- | |
| ## 6. Security Recommendations | |
| ### Before Production Release | |
| 1. **Implement Ed25519 signing** (NOT HMAC) for all receipts | |
| 2. **Enforce full-hash usage** (no truncation) | |
| 3. **Test proof tool integrations** end-to-end | |
| 4. **Add per-system context binding** to receipts (replay protection) | |
| 5. **Implement notebook signing** (GPG or Ed25519) | |
| 6. **Migrate to canonical time** (logical clock or Git height) | |
| 7. **Use HSM for private keys** (not filesystem storage) | |
| 8. **Enable SELinux/AppArmor** for process isolation | |
| 9. **Audit Prolog engine** for fact retraction vulnerabilities | |
| 10. **Pin dependency versions** and verify checksums | |
| ### Ongoing Operations | |
| 1. **Rotate Ed25519 keys** annually or on compromise suspicion | |
| 2. **Monitor Blake3/Ed25519 cryptanalysis** literature | |
| 3. **Run regular security audits** (penetration testing) | |
| 4. **Log all authorization failures** (detect attacks) | |
| 5. **Verify receipt chains** weekly (detect tampering) | |
| 6. **Back up WORM ledger** to geographically distributed stores | |
| 7. **Incident response plan** for leaked private keys | |
| --- | |
| ## 7. Compliance Mapping | |
| | Compliance Requirement | Status | Evidence | | |
| |------------------------|--------|----------| | |
| | SOX §302 Independent Verification | ❌ BLOCKED | Need Ed25519 (HMAC blocks verification) | | |
| | GDPR Art. 5(2) Accountability | ❌ BLOCKED | Need audit trail verification | | |
| | HIPAA Audit Controls | ⏳ PARTIAL | Logs present; signing incomplete | | |
| | ISO 27001 A.12.4 Event Logging | ⏳ PARTIAL | Truncated hashes reduce assurance | | |
| | PCI-DSS 10.5 Log Integrity | ❌ BLOCKED | HMAC not accepted; need asymmetric | | |
| | FedRAMP AC-6 Least Privilege | ✅ VERIFIED | dispatch_gated sealed entry point | | |
| **Production Readiness: NOT COMPLIANT** (until Ed25519 implemented and tested) | |
| --- | |
| ## 8. Incident Response | |
| ### Suspected Private Key Compromise | |
| 1. Immediately revoke all capabilities issued by compromised agent | |
| 2. Rotate Ed25519 keypair (new key, new identity if necessary) | |
| 3. Audit all receipts signed by old key (may be forged) | |
| 4. Notify all systems that consume receipts from this agent | |
| 5. Drain old private key from all storage (HSM, filesystem, memory) | |
| 6. Document incident with timestamp and details | |
| ### Detected Proof Obligation Failure | |
| 1. Halt release process (transition blocked by gate) | |
| 2. Investigate failed proof: which obligation failed? | |
| 3. Review code for semantic changes or unproved invariants | |
| 4. Attempt re-proof with external verifier (Agda/Ada/Lean) | |
| 5. If re-proof fails: revert cell execution, understand root cause | |
| 6. Document in incident log (WORM-sealed) | |
| ### Detected Receipt Chain Tampering | |
| 1. Compute which receipts are affected (from gap in sequence) | |
| 2. Verify previous hash linkages (detect insertion point) | |
| 3. Revert affected cells (or entire notebook) | |
| 4. Investigate attacker access (how did they modify Prolog facts?) | |
| 5. Incident report to audit team and compliance officer | |
| --- | |
| **GOVERNANCE PRINCIPLE: TRANSPARENCY OR MISTRUST.** | |
| All vulnerabilities, mitigations, and residual risks are documented publicly. Users make informed decisions about deployment. | |
| *"EVIDENCE OR SILENCE."* | |