# EXTREME CERTIFICATION AUDIT — SECTIONS 9–12 **Datum:** 2026-06-05 **Utförare:** SRE/Chaos/Red Team subagent **Scope:** Temporal Reconstruction, Chaos, Multi-Tenant Isolation, Security --- ## SECTION 9: TEMPORAL RECONSTRUCTION TEST ### 9.1 GECL historiska events - **STATUS: PARTIAL** - GECL health svarar (`{"ok":true,"service":"amos-gecl-chain","version":"0.3.0"}`) - `/api/gecl/events?before=2026-06-01T23:59:59Z` returnerar tomt — ingen output ens med x-internal-source + x-tenant-id - **EVIDENCE:** Anropet returnerade ingen data (HTTP 200 utan body eller ingen route matchad) - **FINDING:** GECL är operationell men historisk event-query via REST är antingen ej implementerad eller kräver autentisering som saknas i testet - **SEVERITY:** MEDIUM — begränsad temporal rekonstruktion möjlig via API ### 9.2 Replay-endpoint - **STATUS: UNVERIFIED** - `/api/replay` och `/api/hermes/timeline` returnerar `{"error":"Unauthorized","code":"NO_TOKEN"}` - **FINDING:** Endpoints finns och kräver JWT — går ej att testa utan giltig token - **SEVERITY:** INFO ### 9.3 Audit- och event-tabeller i DB - **STATUS: PROVEN** - **EVIDENCE:** 47 tabeller med event/history/audit i public schema identifierade - Namnbara: `audit_trail_entries`, `canonical_events`, `ledger_audit_log`, `financial_audit_log`, `event_store`, `security_audit_log`, `homo_deus_audit_chain` m.fl. - `event_store`: **0 rader** (tom, ej använd) - `canonical_events`: **2 rader**, äldsta 2026-05-25, nyaste 2026-05-25 (ingen data från 2026-06-01) - `audit_trail_entries`: **0 rader** (tom) - `ledger_audit_log`: **46 rader** - **FINDING:** Temporell rekonstruktion till 2026-06-01 omöjlig — inga events registrerade för det datumet i primärtabellerna. Event sourcing infrastruktur finns men används knappt (event_store=0, audit_trail=0). Ledger-audit finns (46 rader) men GECL/event-sourcing är i princip overksam. - **SEVERITY:** HIGH — systemet saknar meningsfull temporal rekonstruktionsförmåga --- ## SECTION 10: CHAOS TEST ### 10.1 NATS resilience - **STATUS: PROVEN** - **EVIDENCE:** - NATS UP: connections=2, in_msgs=5308, uptime=12h38m49s - 2 aktiva connections (amos-core + annan tjänst) - **FINDING:** NATS fungerar stabilt som Kafka-fallback ### 10.2 Redis DOWN — fallback - **STATUS: PARTIAL / ANOMALY** - `redis-cli` ej installerat; `systemctl is-active redis` = **inactive** - Men: port 6379 lyssnar (`ss -tlnp` visar `127.0.0.1:6379`) — process okänd (troligen valkey eller inbyggd instans) - amos-core `/api/health` rapporterar `"redis": "ok"` och `"ok": true` - **FINDING:** Redis rapporteras som DOWN av systemctl men är faktiskt UP (lyssnar 127.0.0.1:6379, amos-core kan nå den). Ingen äkta Redis-down-situation att testa fallback mot. - **SEVERITY:** LOW (operativt fungerar det), men MEDIUM ur övervakningsperspektiv — inkonsistent statusinformation ### 10.3 Kafka DOWN — fallback verifierat - **STATUS: PROVEN** - **EVIDENCE:** - Kafka ej tillgänglig på 9092 (connection refused) - `/opt/amos/data/agent-mailbox.json`: 365 KB, 6060 rader (JSONL), senast modifierad 2026-06-05 02:39 - **FINDING:** AgentBus fallback till in-memory + JSONL är aktivt och funktionellt. Events processas utan Kafka. - **SEVERITY:** INFO (fallback fungerar) ### 10.4 AI provider resilience - **STATUS: PROVEN** - **EVIDENCE:** ai-gateway (3270) rapporterar 6 providers, alla med `circuit: closed` (= operationella): - anthropic, openai, groq, gemini, deepseek, perplexity - **FINDING:** Multi-provider AI gateway med circuit breaker fungerar. Ingen provider nere. - **SEVERITY:** INFO ### 10.5 RTO-mätning - **STATUS: PROVEN** - **EVIDENCE (response times, tjänst ej omstartad):** - quixzoom-api (3209): **4ms** - ledger (3250): **7ms** - GECL (3263): **4ms** - amos-core (3100): **4ms** - **FINDING:** Exceptionellt låg latens för alla tjänster. Mäter "already-running response time" snarare än cold-start RTO — ingen restart utfördes (säker chaos-princip). - **SEVERITY:** INFO ### 10.6 Ledger med stängd period - **STATUS: PROVEN** - **EVIDENCE:** POST till `entry_date: 2026-06-01` → `{"error":"Period 2026-06 är stängd — inga nya verifikationer tillåtna","code":"PERIOD_CLOSED"}` - **FINDING:** Finansiell periodkontroll fungerar korrekt — stänger ute backdaterade poster --- ## SECTION 11: MULTI-TENANT ISOLATION TEST ### 11.1 Tenant-skapande - **STATUS: PROVEN** - **EVIDENCE:** - Tenant A: `org_id=3c0bee53-be08-40eb-b714-5a38879ad6c0` (TenantA Corp) - Tenant B: `org_id=59dcb828-4490-41be-b6c3-13d2c5251724` (TenantB Corp) - Båda skapade framgångsrikt med JWT (RS256) - **FINDING:** Onboarding fungerar ### 11.2 Cross-tenant data isolation — Ledger - **STATUS: PROVEN ✅** - **EVIDENCE:** - Tenant A skapade journal entry `883c2104-...` med "TENANT-A-SECRET-DATA" (500 000 kr) - Tenant B frågar `/api/ledger/journal` → `{"ok":true,"entries":[],"count":0}` — ser NOLL entries - Tenant B försöker direkt URL `/api/ledger/journal/883c2104-...` → `Cannot GET` (404-liknande, route ej exponerad per ID utan tenant match) - Tenant B försöker läsa wavult-group entry `188dafa5-...` → 404 - **FINDING:** Tenant-isolation i ledger är robust. x-tenant-id header styr filtreringen effektivt. - **SEVERITY:** PASS ### 11.3 Hermes cross-tenant - **STATUS: UNVERIFIED** - `/api/aamos/hermes` kräver JWT token — returnerar `NO_TOKEN` utan auth - **FINDING:** Hermes är skyddat men isolation ej testad med giltig cross-tenant token - **SEVERITY:** INFO (bör testas med riktiga tokens) --- ## SECTION 12: SECURITY TEST ### 12.1 Prompt Injection - **STATUS: PARTIAL** - **EVIDENCE:** - 3 av 4 payloads → `NO_TOKEN` (Hermes kräver auth — rätt beteende) - 1 payload (`"; DROP TABLE prexo_users; --`) → `{"ok":false,"error":"UN-000","error_type":"UNKNOWN_ERROR",...}` — nådde applikationslogik! - **FINDING:** SQL-liknande payload kom igenom JWT-gaten och orsakade UNKNOWN_ERROR. Antingen tog payload sig in som query-parameter utan token-check, eller så finns ett anrop utan auth. Hermes-endpoint verkar ha inkonsekvent autentiseringslogik. - **SEVERITY:** MEDIUM — prompt injection inte bevisat, men ojämn auth-täckning är en risk ### 12.2 SQL Injection - **STATUS: PARTIAL** - **EVIDENCE:** - `/api/ledger/journal?tenant_id=wavult-group' OR '1'='1` → HTTP 000 (connection refused eller fel port) - `/api/qz/missions?filter='; DROP TABLE...` → HTTP 000 - **FINDING:** Ingen HTTP-respons alls — kan vara att endpoints inte finns eller att ledger inte accepterar tenant_id som query-param. Ingen bekräftad SQL injection, men ej heller konfirmerat skydd (parameterized queries). - **SEVERITY:** UNVERIFIED — bör testas med korrekta endpoints ### 12.3 JWT manipulation - **STATUS: PROVEN SECURE ✅** - **EVIDENCE:** - `alg:none` token → `{"ok":false,"error":"Invalid token","code":"TOKEN_INVALID"}` - Expired token (signerat med känd nyckel, utgången) → `TOKEN_INVALID` - **FINDING:** JWT-validering avvisar alg:none och expired tokens korrekt. RS256 används (public/private key pair, sett i onboarding response). - **SEVERITY:** PASS ### 12.4 Path Traversal - **STATUS: PARTIAL — INFO LEAK** - **EVIDENCE:** - `GET /api/files/../../../etc/passwd` → `{"error":"not_found","path":"/etc/passwd","service":"amos-core","trace_id":"..."}` - `GET /api/qz/storage/../../etc/passwd` → Express 404 utan filinnehåll - **FINDING:** Fil-traversal blockeras — `/etc/passwd` returneras ej. MEN amos-core läcker intern path (`/etc/passwd`), service-namn och trace_id i felresponsen. Information disclosure utan auth. - **SEVERITY:** LOW-MEDIUM — ingen data exfiltrering, men path normalization sker server-side och exponeras ### 12.5 Credential Exfiltration via API - **STATUS: PROVEN SECURE ✅** - **EVIDENCE:** - `/api/config` → `NO_TOKEN` - `/api/env` → `NO_TOKEN` - `/api/secrets` → `NO_TOKEN` - **FINDING:** Alla config/env/secrets endpoints kräver autentisering. Ingen obehörig åtkomst. - **SEVERITY:** PASS --- ## SAMMANFATTNING | # | Test | Status | Severity | |---|------|--------|----------| | 9.1 | GECL temporal query | PARTIAL | MEDIUM | | 9.2 | Replay endpoint | UNVERIFIED | INFO | | 9.3 | Event store / audit tables | PROVEN | HIGH | | 10.1 | NATS resilience | PROVEN | INFO | | 10.2 | Redis fallback | PARTIAL/ANOMALY | MEDIUM | | 10.3 | Kafka fallback | PROVEN | INFO | | 10.4 | AI provider failover | PROVEN | INFO | | 10.5 | RTO latens | PROVEN | INFO | | 11.1 | Tenant creation | PROVEN | INFO | | 11.2 | Cross-tenant ledger isolation | PROVEN SECURE | PASS | | 11.3 | Hermes cross-tenant | UNVERIFIED | INFO | | 12.1 | Prompt injection | PARTIAL | MEDIUM | | 12.2 | SQL injection | UNVERIFIED | UNVERIFIED | | 12.3 | JWT manipulation | PROVEN SECURE | PASS | | 12.4 | Path traversal | PARTIAL (info leak) | LOW | | 12.5 | Credential exfiltration | PROVEN SECURE | PASS | ## KRITISKA FYND 1. **[HIGH] Event sourcing praktiskt overksam** — `event_store=0 rader`, `audit_trail_entries=0 rader`, `canonical_events=2 rader` (från maj). Systemet kan EJ rekonstruera tillstånd från 2026-06-01. 2. **[MEDIUM] Redis status-inkonsistens** — systemctl=inactive men port 6379 lyssnar och amos-core rapporterar ok. Övervakningslarm baserade på systemctl ger falskt alarm. 3. **[MEDIUM] Ojämn autentisering på Hermes** — SQL-liknande payload kom igenom och gav UNKNOWN_ERROR istället för NO_TOKEN. Tyder på en route som saknar auth-middleware. 4. **[LOW] Path info leak** — amos-core exponerar normaliserad path + service name i 404-responsen utan auth. 5. **[PASS] Multi-tenant isolation håller** — Tenant B kan inte se Tenant A:s data. Testat och bekräftat.