bae705aa97
- 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
191 lines
9.5 KiB
Markdown
191 lines
9.5 KiB
Markdown
# 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.
|