Files
boc/memory/audit-s9-s12.md
T
Bernt bae705aa97 ARCHITECTURE: NFC roadmap, edge AI, audit logging
- Add NFC ePassport roadmap (ICAO 9303, eIDAS)
- Add TensorFlow.js edge face detection (BlazeFace)
- Add structured audit logger (GDPR-compliant)
- Risk scoring support

Part of KYC Apple Native UX v1.1.0
2026-06-29 16:24:48 +00:00

191 lines
9.5 KiB
Markdown
Raw 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.
# EXTREME CERTIFICATION AUDIT — SECTIONS 912
**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.