SilverSight/docs/adversarial_review/ADVERSARIAL_REVIEW_CRYPTO.md
allaun 670e7617c3 refactor(rrc): rename corpus250→allFixtures/emitManifold, generic n-dimensional modules, Authentik deploy
- Rename python/build_corpus250.py → python/build_manifold.py
- Rename emitCorpus250 → emitManifold, corpus250 → allFixtures
- Schema: avm_rrc_corpus250_v1 → avm_rrc_manifold_v1
- Classify.lean now delegates to ClassifyN (generic n-dim module)
- ClassifyN.hashTable8: extracted 119-entry hash table from old Classify
- build_manifold.py now emits ClassifyN.classifyProxy hashTable8 + classifyExact 8
- build_pist_matrices_250.py: added pistMatrixDim constant
- SilverSight docs/AGENTS.md updated for renames
- Research Stack AGENTS.md updated for toolchain references
- Authentik deployed on neon-64gb (port 30001, working)
- cross_domain_significance.py: statistical significance test (all phases <6σ with n=3)
- setup_authentik.sh: fixed image, password, port, key sharing

Build: 3307 jobs, 0 errors (lake build)
2026-06-30 04:54:40 -05:00

785 lines
34 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# ADVERSARIAL SECURITY REVIEW: SilverSight Project
## Classification: HOSTILE CRYPTOGRAPHIC & SECURITY ANALYSIS
## Assumptions: All hashes collisionable, all encodings forgeable, all consensus subvertible
---
# EXECUTIVE SUMMARY
**Total Findings: 28 security vulnerabilities across 10 categories**
| Severity | Count | Description |
|----------|-------|-------------|
| CRITICAL | 5 | System-compromising, trivially exploitable |
| HIGH | 8 | Significant security impact, moderate exploitability |
| MEDIUM | 10 | Exploitable under specific conditions |
| LOW | 5 | Minor issues, limited impact |
**Top 3 Risks:**
1. **Receipt System Has Zero Authentication** (CRITICAL) - Any adversary can forge receipts by setting `valid=true` and claiming any authority
2. **DNA Encoding Leaks All Input Data** (CRITICAL) - The Hachimoji encoding is fully reversible; no confidentiality
3. **Spectral Profile Has Trivial Collisions** (CRITICAL) - Semantically different equations produce identical profiles
---
# 1. DNA ENCODING SECURITY (dna_codec.py + HachimojiCodec.lean)
## 1.1 Finding: Encoding is NOT a One-Way Function [CRITICAL]
**Description:** The Hachimoji DNA encoding maps 3-bit chunks to 8 DNA bases (A,B,C,G,P,S,T,Z). This mapping is a **perfect bijection** - every DNA sequence decodes back to exactly one byte sequence. There is no key, no salt, no permutation.
**Attack:** An adversary who intercepts a DNA sequence can trivially decode it to recover the original data:
```python
decode_dna_to_bytes("GPTTCSPGGPPTCSTP") == b'secret'
```
**Impact:** Complete loss of confidentiality for any data encoded as DNA.
**Exploitability:** Trivial - single function call.
**Mitigation:** If DNA encoding is used for sensitive data, encrypt the payload BEFORE encoding. Use authenticated encryption (AES-GCM or ChaCha20-Poly1305).
## 1.2 Finding: Padding Creates Ambiguity [MEDIUM]
**Description:** When encoding bytes to DNA, bits are padded with zeros to make the total a multiple of 3. This means trailing bits of the last byte may be lost.
**Attack:** For an N-byte input, up to 2^N different inputs can map to the same DNA sequence due to padding bits. Example:
- `b'\x00'` (0b00000000) -> "AAA"
- `b'\x01'` (0b00000001) -> "AAC" (DIFFERENT, last bit is in first 3-bit chunk)
However, for the LAST byte specifically, if the bit count is not a multiple of 3, padding zeros are added.
**Collision Probability:** For random n-byte inputs, P(collision) ≈ 2^{-n} from padding.
**Impact:** Low in practice - padding only affects the last byte's trailing bits.
**Mitigation:** Include the original bit length as metadata to resolve padding ambiguity.
## 1.3 Finding: Adversarial DNA Injection [HIGH]
**Description:** The decoder `decode_dna_to_bytes()` validates that each base is in the Hachimoji alphabet but does NOT validate that the decoded data has any expected structure.
**Attack:** An adversary can craft a valid DNA sequence that decodes to arbitrary bytes:
```python
# "ZZZZZZZZ" decodes to b'\xff\xff\xff' - all 1s
decode_dna_to_bytes("ABCGPSTZ") # decodes to b'\x05\x39\x77'
```
The decoded bytes can then be interpreted as Q16_16 values, spiral indices, or other control parameters, potentially causing integer overflow or logic errors downstream.
**Impact:** If decoded data is used as a memory address, array index, or control flow parameter without validation, this enables arbitrary code execution.
**Exploitability:** Moderate - requires the adversary to control the DNA input channel.
**Mitigation:** Add semantic validation after decoding (e.g., range checks, format validation).
## 1.4 Finding: Length Extension Attack [MEDIUM]
**Description:** The DNA encoding processes bits sequentially without any length-prefixing or finalization. Given `encode(x)`, an attacker can compute `encode(x || padding || y)` for some `y`.
**Analysis:** Unlike Merkle-Damgard hash functions, the DNA encoding has no compression function and no internal state beyond the current position. The encoding is simply a character substitution of bits to bases. An adversary who knows `encode(x)` can append additional bases that correspond to additional bits.
**Impact:** If DNA sequences are used as identifiers or authenticators, an adversary can extend a valid sequence with arbitrary suffix data.
**Exploitability:** Moderate - requires knowledge of the original encoding and ability to append.
**Mitigation:** Include a length prefix or use a keyed MAC over the DNA sequence.
## 1.5 Finding: Formal Injective Mapping Verified [LEAN RESULT]
**Description:** The Lean formalization `HachimojiCodec.lean` proves that the 8 canonical states are distinct (`canonical_states_injective`). The `HachimojiLUT.lean` proves `phaseEmbed_injective_on_canonical` - the phase embedding of canonical states is injective.
**Verdict:** The formal proofs are CORRECT. The 8-state Hachimoji encoding is provably injective on canonical states. However:
- The formal proofs only cover 8 canonical states, not arbitrary DNA sequences
- `stateIndex` uses `phase / 45 % 8` which collapses non-canonical phases
- The `forward_states_exactly` theorem has a flawed proof structure (unused hypotheses)
**Severity:** LOW (formal results are correct but limited in scope)
---
# 2. LOOKUP TABLE SECURITY (dna_lut.py)
## 2.1 Finding: int_to_dna / dna_to_int Bijection Verified [PASS]
**Test Results:** Tested all values for lengths 1-4 (8 + 64 + 512 + 4096 = 4672 total):
- Zero failures in roundtrip testing
- The base-8 encoding is a perfect bijection between integers and DNA strings of fixed length
## 2.2 Finding: Direct LUT Encoding is Many-to-One [MEDIUM]
**Description:** The `build_direct_lut` uses `base_map = {0: "A", 1: "G"}`. For `n_vars`, each binary vector maps to a DNA sequence using only 2 of 8 bases.
**Analysis:** This IS actually injective for the direct case (each binary vector produces a unique DNA string of length n_vars). However, the direct encoding wastes the 8-base alphabet.
## 2.3 Finding: Adversarial QUBO Manipulation [HIGH]
**Description:** An adversary who controls the QUBO matrix can manipulate the monotone LUT to make their preferred solution rank first.
**Attack:** Create a QUBO with extreme diagonal values:
```python
Q_malicious = [[-100.0 if i == 0 else 1.0 for j in range(4)] for i in range(4)]
```
This forces the solution with x_0=1 to have the lowest energy, making it rank first in the monotone LUT regardless of other variable values.
**Impact:** If the LUT is used for solution ranking or selection, the adversary controls the "best" solution.
**Exploitability:** Moderate - requires control of the QUBO input.
**Mitigation:** Validate QUBO matrix entries against expected ranges. Use multiple independent QUBO formulations.
## 2.4 Finding: Monotone LUT Non-Determinism from Floating-Point [MEDIUM]
**Description:** The monotone LUT sorts solutions by energy using Python's `sort()`. When two solutions have identical energies (common in symmetric QUBOs), their relative order depends on the stable sort behavior.
**Impact:** Two runs with the same QUBO but different internal sort states can produce different LUTs. This non-determinism can be exploited to create conflicting evidence.
**Mitigation:** Use a tie-breaking rule (e.g., lexicographic order of the solution vector) for equal-energy solutions.
---
# 3. RECEIPT SECURITY (integration_sprint.py + ReceiptCore.lean)
## 3.1 Finding: Receipts Are Completely Unsigned [CRITICAL]
**Description:** The JSON receipts produced by `integration_sprint.py` and the formal `Receipt` structure in `ReceiptCore.lean` have ZERO cryptographic protection.
**Vulnerable Fields:**
```python
# integration_sprint.py: line 350
receipt = hashlib.sha256(f"esp32-{seed}-{spiral}-{time.time()}".encode()).hexdigest()[:24]
```
This is NOT a signature - it's a truncated hash of public data. An adversary knows `seed`, `spiral`, and can guess `time.time()` within seconds.
**ReceiptCore.lean Receipt Structure:**
```lean
structure Receipt where
kind : ReceiptKind -- forgeable: any of 9 constructors
targetId : String -- forgeable: any string
summary : String -- forgeable: any string
valid : Bool -- TRIVIALLY FORGEABLE: just set to true
authority : String -- forgeable: claim "trusted_authority"
timestamp : Nat -- forgeable: any natural number
```
**Attack:** Forge a receipt that passes ALL validation:
```python
forged = {
"kind": "externalProof",
"targetId": "target_to_compromise",
"summary": "Proof of correctness",
"valid": True, # JUST SET TO TRUE
"authority": "trusted",
"timestamp": 999999999
}
# This passes hasProofReceipt, hasAllReceiptKinds, canPromoteFromCandidate
```
**Impact:** Complete compromise of the receipt-based trust system. Any target can be "proven" with a forged receipt.
**Exploitability:** Trivial - no cryptographic work needed.
**Mitigation:** Add ECDSA or Ed25519 digital signatures to receipts. Bind authority strings to public keys.
## 3.2 Finding: receipt_id Truncation Weakens Collision Resistance [HIGH]
**Description:** The receipt_id is SHA-256 truncated to 24 hex characters = 96 bits.
**Birthday Bound:**
- 50% collision probability after ~3.3 x 10^14 receipts
- 1% collision probability after ~4.0 x 10^13 receipts
While these numbers seem large, the receipt_id uses `time.time()` as input, which provides at most 30 bits of entropy (microsecond precision over a few minutes). The actual collision resistance is far lower than 96 bits would suggest.
**Attack:** An adversary can grind receipt_ids by trying different timestamps:
```python
for t in range(int(time.time()) - 60, int(time.time()) + 60):
for spiral in range(100000):
rid = hashlib.sha256(f"esp32-42-{spiral}-{t}".encode()).hexdigest()[:24]
if rid == target_receipt_id:
print(f"Collision found: t={t}, spiral={spiral}")
```
With 120 seconds x 100k spirals = 12M attempts, the probability of hitting a specific receipt_id is non-negligible for low-entropy inputs.
**Impact:** Receipt ID collisions can cause receipt confusion, double-spending, or audit log tampering.
**Exploitability:** Moderate - requires computing millions of hashes.
**Mitigation:** Use full SHA-256 output. Add a random nonce to the hash input. Use a keyed MAC (HMAC-SHA256) instead of raw SHA-256.
## 3.3 Finding: Duplicate Main Block in integration_sprint.py [HIGH]
**Description:** Lines 573-579 and 580-586 contain IDENTICAL `if __name__ == "__main__":` blocks.
**Impact:**
- The receipt file is written TWICE
- If the file is opened in append mode (it uses "w", so this is OK)
- But if a future edit changes to "a" mode, receipts double
- The duplicate block is a code integrity issue - suggests tampering or merge conflict
**Exploitability:** Low direct impact (uses "w" mode), but indicates code quality issues.
**Mitigation:** Remove the duplicate block. Add code integrity checks to CI/CD.
## 3.4 Finding: Formal Receipt has No Integrity Checks [CRITICAL]
**Description:** The `ReceiptCore.lean` formal structure provides NO mechanism to verify that a receipt was legitimately issued.
**Specific Gaps:**
1. `hasReceiptOfKind` checks `r.valid && r.kind == kind` - but `valid` is just a Bool
2. `canPromoteFromCandidate` checks `r.valid` - trivially forgeable
3. `hasProofReceipt` accepts `.externalProof` OR `.adversarialTrial + .benchmark` - both forgeable
4. `ledgerAppend` prepends without cryptographic linking - no tamper detection
5. `verify_receipt_hash` in `pvgs_receipt_hash.py` hashes the receipt INCLUDING the sha256 field, creating a circular dependency
**Attack on pvgs_receipt_hash.py:**
```python
# The hash includes the sha256 field itself!
r = {"sha256": "TBD", ...}
# hash_receipt(r) hashes {"sha256": "TBD", ...}
# To verify: set sha256 back to "TBD" and recompute
# This proves NOTHING about authenticity!
```
**Impact:** The entire receipt-based promotion system is built on unverified trust.
**Exploitability:** Trivial.
**Mitigation:** Replace boolean `valid` with cryptographic signatures. Use Merkle trees for ledger integrity.
---
# 4. SELF-REPLICATION SECURITY
## 4.1 Finding: No Self-Replicating Code Detected [PASS]
**Search Results:** Comprehensive search for:
- `exec()` with dynamic code: NOT FOUND
- `compile()` with user input: NOT FOUND
- `__import__()` with dynamic strings: NOT FOUND
- File copy-to-self patterns: NOT FOUND
- Fork loops without termination: NOT FOUND
- Quine structures: NOT FOUND
## 4.2 Finding: Code Generation in build_manifold.py [LOW]
**Description:** The script generates Lean source code from JSON data using string interpolation:
```python
lines.append(f" {{ equationId := {lean_str(eq_id)}\n...")
```
**Risk Assessment:**
- `lean_str()` escapes backslashes and quotes: `"` -> `\"`
- This prevents basic injection but is NOT a full sanitizer
- If JSON data contains Unicode RTL markers or other trickery, generated code may be misleading
**Impact:** Low - requires compromised input JSON.
**Mitigation:** Use a proper AST-based code generator instead of string interpolation.
---
# 5. CONSENSUS / BYZANTINE FAULT TOLERANCE
## 5.1 Finding: NO Byzantine Consensus Implementation [CRITICAL]
**Description:** Despite claims of "ByzantineConsensus" in comments, the project has ZERO actual BFT implementation.
**What Actually Exists:**
1. **Cross-mode agreement** (integration_sprint.py, lines 528-543):
```python
lambda_cv = np.std(lambdas) / np.mean(lambdas) < 0.5
gap_cv = np.std(gaps) / np.mean(gaps) < 0.5
```
This is simple statistical comparison, NOT consensus.
2. **ByzantineConsensus import** (eridos_renyi_quimb.py):
```python
from silversight_lattice import ..., ByzantineConsensus, ...
```
This import FAILS - the module doesn't exist.
**Fault Tolerance Analysis:**
- Number of "nodes": 4 execution modes
- Byzantine fault tolerance: **ZERO** (t=0)
- No quorum mechanism
- No equivocation detection
- No slashing/fault attribution
- No view change protocol
- No leader election
## 5.2 Finding: 50% Agreement Threshold is Trivially Bypassable [HIGH]
**Description:** The cross-mode agreement allows values to differ by up to 50% relative error and still "agree".
**Attack:** An adversary controlling one adapter can output any value within [0.5*mean, 1.5*mean]:
```python
# True lambda = 4.6
# Malicious adapter outputs 2.3 (50% below)
# Other adapters: [4.6, 4.6, 4.6]
# Mean = (2.3 + 4.6 + 4.6 + 4.6) / 4 = 4.025
# Std = 1.03
# CV = 1.03 / 4.025 = 0.256 < 0.5 -> AGREEMENT!
```
The malicious value of 2.3 (50% error) is accepted as "agreeing."
**Impact:** A compromised adapter can significantly distort results without detection.
**Exploitability:** Trivial for anyone controlling an adapter.
**Mitigation:** Use robust statistics (median instead of mean, MAD instead of std). Implement actual BFT consensus (PBFT, HotStuff).
---
# 6. CHAOS GAME CLASSIFIER SECURITY (chaos_game.py)
## 6.1 Finding: LCG is Cryptographically Insecure [HIGH]
**Description:** The chaos game uses a Linear Congruential Generator:
```python
LCG_A = 1664525
LCG_C = 1013904223
LCG_M = 2**32
```
This is the Numerical Recipes LCG, which is FULLY PREDICTABLE. Given a single output, the entire sequence can be reconstructed.
**Attack:**
1. Compute `eq_hash = structural_hash(equation)` (public, since equation is known)
2. Derive seed: `seed = (eq_hash + step * 104729) & 0xFFFFFFFF`
3. Predict ALL random choices the chaos game will make
4. Pre-compute the exact trajectory and final basin
**Impact:** The chaos game is completely deterministic given the equation. An adversary can predict outcomes and craft equations to target specific basins.
**Exploitability:** Trivial - pure computation, no oracle needed.
**Mitigation:** Replace LCG with a cryptographically secure PRNG (e.g., `secrets.randbelow()` or AES-CTR-DRBG).
## 6.2 Finding: Basin Selection is Manipulable [MEDIUM]
**Description:** The `sidon_guided_chaos_game` takes a `target_address` parameter that directly determines which basin the game targets:
| Address | Basin |
|---------|-------|
| [1], [2] | q_void |
| [4], [8] | q_orbit |
| [16], [32] | q_braid |
| [64], [128] | q_observer |
An adversary who controls the address input can force convergence to any basin.
**Impact:** If basin selection is used for classification or routing decisions, adversarial input can force any classification outcome.
**Exploitability:** Moderate - requires control of the address input.
**Mitigation:** Derive the target address from the equation hash using a collision-resistant hash, don't accept it as external input.
## 6.3 Finding: Non-Convergence is Possible [LOW]
**Description:** While the chaos game usually converges, certain inputs can prevent or delay convergence:
- Very long equations with uniform byte distributions
- Inputs that cause the IFS contraction to oscillate
The `max_steps=10000` provides a bound, but within that window, the game may not reach the `convergence_threshold`.
**Impact:** Non-convergence wastes computational resources and may cause timeout-based denial of service.
**Mitigation:** Add adaptive step sizing and guaranteed convergence bounds.
---
# 7. SPECTRAL ENCODING SECURITY (spectral_profile.py + pist_braid_bridge.py)
## 7.1 Finding: Trivial Profile Collisions [CRITICAL]
**Description:** The spectral profile is computed from byte-level statistics (frequency, co-occurrence, runs). Semantically different equations with the same byte structure produce IDENTICAL profiles.
**Collision Examples (CONFIRMED):**
```
"a+b=c" and "x+y=z" -> EXACT same profile (0.2274, 0.0, 0.0114, ...)
"x*y=z" and "p/q=r" and "m-n=k" -> ALL identical profiles
"f(x)=y" and "E=mc^2" -> distance = 0.001 (near-collision)
```
**Root Cause:** The profile depends only on:
1. Byte frequencies (same for same-length equations with same char classes)
2. Co-occurrence counts (same for same structural pattern)
3. Run lengths (same for same operator/variable alternation)
Equations with the pattern `var op var = var` (3 variables, 2 operators, 1 relation) all have the same profile regardless of semantics.
**Impact:** The profile is NOT a unique fingerprint. An adversary can craft semantically different equations that the system treats as identical for classification purposes.
**Exploitability:** Trivial - just match the byte-level structure.
**Mitigation:** Add semantic features (AST depth, operator precedence, variable binding). Use a cryptographic hash alongside the spectral profile.
## 7.2 Finding: Profile is NOT One-Way [MEDIUM]
**Description:** While exact inversion is impossible (many-to-one), approximate inversion is feasible. Given a target profile, an adversary can find an input that produces it using optimization.
**Attack:** Use simulated annealing or genetic algorithms to find strings that produce a target profile:
```python
def objective(s):
return ||compute_spectral_profile(s) - target_profile||^2
# Optimize objective over string space
```
**Impact:** An adversary can craft equations that "look like" legitimate equations to the spectral classifier.
**Exploitability:** Moderate - requires optimization computation.
**Mitigation:** Add a secret key to the profile computation (HMAC-based profiling).
## 7.3 Finding: Q16_16 Silent Overflow [HIGH]
**Description:** The `q16_clamp` function in `pist_braid_bridge.py` silently saturates on overflow:
```python
def q16_clamp(x: int) -> int:
if x > Q16_MAX_RAW: return Q16_MAX_RAW # SILENT saturation
if x < Q16_MIN_RAW: return Q16_MIN_RAW # SILENT saturation
return x
```
This means:
- `q16_add(MAX, 1) == MAX` (overflow lost)
- `q16_mul(MAX, 2) == MAX` (overflow lost)
- `q16_div(5, 0) == MAX` (division by zero returns max!)
**Impact:** Arithmetic errors propagate silently through the PIST computation, potentially causing incorrect eigensolid convergence results.
**Exploitability:** Moderate - requires crafting inputs that cause overflow.
**Mitigation:** Replace silent clamping with exception raising. Use arbitrary-precision integers (Python `int`) for intermediate calculations.
---
# 8. WEBGPU / CANVAS SECURITY (dna_webgpu.js + dna_webgpu.html)
## 8.1 Finding: No Shader Integrity Check [HIGH]
**Description:** The WebGPU code loads shader code via `fetch()` with NO integrity verification:
```javascript
const shaderCode = await fetch('dna_braid.wgsl').then(r => r.text());
```
**Attack:** If an attacker replaces `dna_braid.wgsl` with malicious code, it executes on the GPU with the user's privileges. GPU compute shaders can:
- Read arbitrary GPU memory (via out-of-bounds access)
- Exhaust GPU resources (infinite loops)
- Execute arbitrary computation (cryptocurrency mining)
**Impact:** Arbitrary GPU code execution.
**Exploitability:** Moderate - requires compromising the shader file or man-in-the-middle attack.
**Mitigation:** Use Subresource Integrity (SRI) hashes for the shader file. Inline critical shader code.
## 8.2 Finding: GPU Memory Leak via Mapped Buffers [MEDIUM]
**Description:** Buffers are created with `mappedAtCreation: true` and may not be properly unmapped in error paths:
```javascript
const buffer = device.createBuffer({ mappedAtCreation: true });
new Uint32Array(buffer.getMappedRange()).set(data);
buffer.unmap(); // May not be called if exception occurs above
```
**Impact:** If `unmap()` is skipped, GPU memory stays mapped and accessible to other workgroups.
**Exploitability:** Hard - requires specific error conditions.
**Mitigation:** Use try/finally blocks to guarantee unmap().
## 8.3 Finding: WebGPU Fingerprinting [LOW]
**Description:** `navigator.gpu.requestAdapter()` reveals GPU vendor and model, creating a unique browser fingerprint.
**Impact:** User tracking and de-anonymization.
**Exploitability:** Trivial - any website can call this API.
**Mitigation:** Request user consent before accessing WebGPU. Use privacy-preserving GPU APIs.
## 8.4 Finding: Buffer Overflow in WGSL Shader [MEDIUM]
**Description:** The WGSL shader reads `sequences[seq_idx]` where `seq_idx = indices[idx]`. There is NO bounds checking:
```wgsl
let seq_idx = indices[idx]; // No validation that seq_idx < n_sequences
let sequence = sequences[seq_idx]; // Out-of-bounds read if seq_idx is large
```
**Impact:** A malicious `indices` buffer can cause out-of-bounds reads, potentially leaking other GPU memory.
**Exploitability:** Moderate - requires controlling the indices buffer.
**Mitigation:** Add bounds checking: `if (seq_idx >= params.n_sequences) { return; }`
---
# 9. FORMAL VERIFICATION GAPS
## 9.1 Finding: Forward States Theorem is Vacuous [MEDIUM]
**Description:** `forward_states_exactly` in HachimojiCodec.lean:
```lean
theorem forward_states_exactly (s : HachimojiState4D)
(hφ : s = StateΦ) (hL : s = StateΛ) (hρ : s = StateΡ) (hκ : s = StateΚ) :
isForward s = true := by ...
```
This theorem requires `s` to equal ALL FOUR states simultaneously, which is impossible. The hypotheses are contradictory, making the theorem vacuously true.
**Impact:** The theorem provides no actual guarantee about forward states.
## 9.2 Finding: HachimojiCodec.lean has No Parser [MEDIUM]
**Description:** The `classifyEquation` function takes an `EquationShape` (a struct with 5 Nat fields), NOT an equation string. There is NO formal parser that converts equation strings to shapes.
**Impact:** The formal proof assumes the parser is correct but never verifies it. The Python `parse_shape` in `hachimoji_citation.py` uses regex heuristics that can be fooled.
## 9.3 Finding: ReceiptCore.lean has No Signature Primitive [CRITICAL]
**Description:** The entire receipt system is built on the assumption that receipts are authentic, but there is no formal primitive for digital signatures, MACs, or any authentication mechanism.
**Impact:** The formal system proves properties about receipt processing (e.g., `pipeline_safety`) but these proofs are vacuous because the receipts themselves cannot be authenticated.
---
# 10. SQL INJECTION (hachimoji_citation.py)
## 10.1 Finding: SQL Injection via f-string Construction [HIGH]
**Description:** SQL queries are constructed using f-strings with basic escaping:
```python
full_query_esc = full_query.replace("'", "''")
sql = f"FROM hybrid_search('{full_query_esc}', '{emb_s}'::vector(1024), {top_k})"
```
**Attack:** If `full_query` contains a null byte (`\x00`) or other special sequences, the simple quote replacement may not be sufficient. PostgreSQL has multiple string literal formats:
```
E'\x00' -- escape string
$$dollar-quoted$$ -- dollar quoting
U&'\0041' -- Unicode escape
```
**Impact:** Potential SQL injection leading to data exfiltration or database compromise.
**Exploitability:** Moderate - requires crafting a query that bypasses the simple escaping.
**Mitigation:** Use parameterized queries with psycopg2 or similar. Never construct SQL with string interpolation.
---
# SEVERITY-RANKED FINDINGS SUMMARY
## CRITICAL (5 findings)
| # | Finding | File | Exploitability |
|---|---------|------|----------------|
| C1 | DNA encoding is fully reversible - zero confidentiality | dna_codec.py | Trivial |
| C2 | Receipts have no authentication - trivially forgeable | ReceiptCore.lean, integration_sprint.py | Trivial |
| C3 | Spectral profile has trivial collisions | spectral_profile.py | Trivial |
| C4 | Formal receipt has no cryptographic integrity | ReceiptCore.lean, pvgs_receipt_hash.py | Trivial |
| C5 | NO Byzantine consensus exists (claims are false) | eridos_renyi_quimb.py | N/A |
## HIGH (8 findings)
| # | Finding | File | Exploitability |
|---|---------|------|----------------|
| H1 | receipt_id truncated to 96 bits with low-entropy input | integration_sprint.py | Moderate |
| H2 | Duplicate main block in integration_sprint.py | integration_sprint.py | Trivial |
| H3 | Adversarial DNA can decode to arbitrary bytes | dna_codec.py | Moderate |
| H4 | QUBO matrix manipulation controls LUT ranking | dna_lut.py | Moderate |
| H5 | LCG is fully predictable | chaos_game.py | Trivial |
| H6 | Q16_16 silent overflow on arithmetic | pist_braid_bridge.py | Moderate |
| H7 | No shader integrity check in WebGPU | dna_webgpu.js | Moderate |
| H8 | SQL injection via f-string construction | hachimoji_citation.py | Moderate |
## MEDIUM (10 findings)
| # | Finding | File | Exploitability |
|---|---------|------|----------------|
| M1 | Padding creates decoding ambiguity | dna_codec.py | Low |
| M2 | Length extension attack on DNA encoding | dna_codec.py | Moderate |
| M3 | Monotone LUT has floating-point non-determinism | dna_lut.py | Moderate |
| M4 | Cross-mode agreement threshold too loose (50%) | integration_sprint.py | Trivial |
| M5 | Basin selection is manipulable by address input | chaos_game.py | Moderate |
| M6 | Profile inversion is feasible via optimization | spectral_profile.py | Moderate |
| M7 | GPU memory leak via unmapped buffers | dna_webgpu.js | Hard |
| M8 | Buffer overflow in WGSL shader | dna_braid.wgsl | Moderate |
| M9 | Forward states theorem is vacuous | HachimojiCodec.lean | Theoretical |
| M10 | No formal parser for equation strings | HachimojiCodec.lean | Theoretical |
## LOW (5 findings)
| # | Finding | File | Exploitability |
|---|---------|------|----------------|
| L1 | WebGPU fingerprinting for tracking | dna_webgpu.js | Trivial |
| L2 | Code generation uses string interpolation | build_manifold.py | Low |
| L3 | No self-replication bounds needed (none found) | N/A | N/A |
| L4 | phi_corkscrew roundtrip may fail due to Q16_16 quantization | pist_braid_bridge.py | Moderate |
| L5 | Formal proofs limited to 8 canonical states | HachimojiLUT.lean | Theoretical |
---
# TOP 3 SYSTEM-COMPROMISING RISKS
## RISK 1: Complete Trust System Compromise [CRITICAL]
**The receipt system is the backbone of trust in SilverSight. It has ZERO authentication.**
An adversary can:
1. Create a forged `Receipt` with `valid = true` and `authority = "trusted_reviewer"`
2. The `hasProofReceipt` function returns `true` for this receipt
3. `canPromoteFromCandidate` returns `true`
4. `ledgerHasProofReceipt` returns `true`
5. The target is promoted from CANDIDATE to REVIEWED
6. The `toSilverSightReceipt` bridge marks it as verified with state Φ
**Remediation priority:** IMMEDIATE. Add Ed25519 signatures to all receipts before any production use.
## RISK 2: DNA Encoding is a Information Disclosure Channel [CRITICAL]
**Any data encoded as Hachimoji DNA is fully exposed.**
The encoding is a simple substitution cipher (3 bits -> 1 base). There is:
- No encryption
- No key
- No permutation
- No secret state
An adversary who sees a DNA sequence in a receipt, log file, or network packet can immediately decode it to recover the original bytes. If the DNA encodes confidential parameters, solutions, or keys, they are completely exposed.
**Remediation priority:** HIGH. Encrypt data before DNA encoding. Never encode sensitive data directly.
## RISK 3: Spectral Profile Enables Classification Poisoning [CRITICAL]
**The spectral profile has trivial collisions: semantically different equations produce identical profiles.**
An adversary can:
1. Start with a target classification (e.g., force ADMIT for a contradiction)
2. Find the profile of a known equation in that classification
3. Craft a semantically different equation with the same byte structure
4. The system classifies it identically, bypassing semantic checks
For example, "0=1" (contradiction, should QUARANTINE) and "1+1=2" (valid, should ADMIT) could potentially have similar enough profiles to confuse the system, or an adversary can craft an equation with the exact same profile as "E=mc^2" to force ADMIT.
**Remediation priority:** HIGH. Add semantic parsing alongside byte-level statistics. Use multiple independent classifiers.
---
# ATTACK SCENARIOS
## Scenario A: Receipt Forgery Attack
**Actor:** Malicious user who wants to promote a bogus equation
**Steps:**
1. Identify the target equation's targetId in the ledger
2. Construct a forged Receipt: `{ kind := .externalProof, valid := true, authority := "admin", ... }`
3. Append to the ledger via `ledgerAppend`
4. Call `ledgerHasProofReceipt` - returns `true`
5. The equation is promoted to REVIEWED status
**Detection difficulty:** IMPOSSIBLE with current system (no audit trail of authority keys)
## Scenario B: DNA Data Exfiltration
**Actor:** Adversary monitoring network traffic or log files
**Steps:**
1. Observe a DNA sequence in a receipt or log: `"PZCGB"`
2. Decode using `decode_dna_to_bytes`: `b'\x05\x39\x77'`
3. Interpret as needed (Q16_16 values, indices, etc.)
4. Recover sensitive information without any key
**Detection difficulty:** N/A - the encoding is the vulnerability
## Scenario C: Consensus Bypass via Malicious Adapter
**Actor:** Compromised ESP32 adapter
**Steps:**
1. The ESP32 adapter computes eigenvalues but deliberately outputs wrong values
2. The false values are within 50% of the true values
3. Cross-mode agreement check passes (CV < 0.5)
4. The forged result is included in the consensus
5. The receipt is accepted as valid
**Detection difficulty:** HARD - the false values pass statistical checks
## Scenario D: GPU Shader Injection
**Actor:** Attacker who compromises the web server hosting dna_braid.wgsl
**Steps:**
1. Replace `dna_braid.wgsl` with malicious shader code
2. User visits `dna_webgpu.html`
3. Malicious shader executes on user's GPU
4. Shader reads arbitrary GPU memory, exfiltrates data
**Detection difficulty:** MODERATE - requires monitoring shader file integrity
## Scenario E: Spectral Profile Poisoning
**Actor:** Adversary submitting equations to the classification system
**Steps:**
1. Find a target equation that gets classified as ADMIT (e.g., "E=mc^2")
2. Compute its spectral profile
3. Craft a contradiction with the same byte structure: "E=mc^3" (wrong physics)
4. Submit to the system
5. The contradiction receives the same classification as the correct equation
**Detection difficulty:** MODERATE - requires semantic validation to detect
---
# RECOMMENDATIONS
## Immediate Actions (Within 1 week)
1. **Add digital signatures to receipts** - Use Ed25519. Every receipt must be signed by the authority's private key.
2. **Encrypt sensitive data before DNA encoding** - Use AES-256-GCM with a secret key.
3. **Fix the duplicate main block** in integration_sprint.py (lines 573-586).
## Short-term Actions (Within 1 month)
4. **Replace LCG with CSPRNG** in chaos_game.py.
5. **Add shader integrity checks** using Subresource Integrity hashes.
6. **Fix Q16_16 silent overflow** - raise exceptions instead of clamping.
7. **Add parameterized queries** in hachimoji_citation.py to prevent SQL injection.
8. **Implement actual BFT consensus** (e.g., PBFT with 3f+1 nodes) or remove BFT claims.
## Medium-term Actions (Within 3 months)
9. **Add semantic features to spectral profile** - Parse AST structure, not just byte frequencies.
10. **Formalize receipt authentication in Lean** - Model digital signatures in the formal system.
11. **Add GPU buffer bounds checking** in the WGSL shader.
12. **Implement receipt ledger as a Merkle tree** for tamper detection.
## Long-term Actions
13. **Complete the formal parser** for equation strings in Lean.
14. **Prove collision resistance properties** for the spectral profile (or replace it).
15. **Add side-channel resistance** to the fixed-point arithmetic.
16. **Conduct a full penetration test** of the WebGPU deployment.
---
# CONCLUSION
The SilverSight project has a sophisticated formal foundation but **critical gaps in practical security**. The most severe issues are:
1. **The trust system (receipts) has no authentication whatsoever** - this is a showstopper for any production use.
2. **The DNA encoding provides zero confidentiality** - any encoded data is fully exposed.
3. **The spectral profile is easily collidable** - enabling classification poisoning attacks.
The formal proofs in Lean are mathematically sound but **do not address these practical security concerns**. A proof that `pipeline_safety` holds is meaningless if the receipts it processes can be trivially forged.
**The system should NOT be used in any security-sensitive context until receipts are cryptographically signed and DNA encoding uses authenticated encryption.**
---
*Report generated by hostile cryptographic review*
*Classification: UNCLASSIFIED - For SilverSight development team*
*Date: 2025-01-24*