# Security Review: Kecalek iOS v0.8.5

**Datum:** 14. března 2026
**Platforma:** iOS 26+ / Swift 6
**Architektura:** MVVM + Actor-based concurrency
**Rozsah:** 57 Swift souborů, ~11 500 řádků kódu
**Typ aplikace:** End-to-end encrypted messaging (Signal Protocol)

---

## 1. Shrnutí

Kecalek je kryptograficky vyspělá messaging aplikace postavená na Signal Protocol (Double Ratchet, X3DH, Sender Keys). Využívá výhradně nativní Apple frameworky bez externích závislostí. Celková bezpečnostní úroveň je vysoká — během review byly identifikovány převážně provozní nedostatky, nikoli fundamentální architekturální chyby.

---

## 2. Kryptografická architektura

### 2.1 Protokoly a algoritmy

| Komponenta | Implementace | Hodnocení |
|---|---|---|
| Key Exchange | X3DH (Extended Triple Diffie-Hellman) | Odpovídá Signal specifikaci |
| DM šifrování | Double Ratchet (AES-256-GCM) | Forward secrecy zajištěna |
| Skupinové šifrování | Sender Keys (AES-256-GCM) | Distribuce přes pairwise DM |
| Autentizace | RSA-4096 challenge-response (PSS-SHA256) | Silné |
| Úložiště klíčů | PBKDF2-HMAC-SHA256 (600 000 iterací) + AES-256-GCM | Odpovídající |
| Identity keys | Ed25519 (podepisování) + X25519 (key agreement) | Standard |
| KDF | HKDF-SHA256 | Standard |
| RNG | SecRandomCopyBytes | Kryptograficky bezpečný |
| Message padding | Bucket-based (64B–64KB) | Skrývá délku zpráv |

### 2.2 Správa klíčů

- **Signed Pre-Key (SPK):** rotace každých 7 dní s grace periodem pro předchozí SPK
- **One-Time Pre-Keys (OPK):** batch 50 kusů, doplnění při prahu 20
- **Max skip:** 256 zpráv na chain (ochrana proti DoS přes vynucené přeskakování)
- **TOFU registry:** sledování identity klíčů kontaktů s možností manuální verifikace
- **Safety numbers:** 60místné číslo (SHA-512, 5 200 iterací) + QR kód verifikace

### 2.3 Pozitivní nálezy

- Žádné použití zastaralých algoritmů (MD5, SHA1, DES, RC4)
- Žádné vlastní kryptografické primitivy — vše přes CryptoKit a Security framework
- Správná implementace AAD (Associated Authenticated Data) v AES-GCM
- Snapshot/restore mechanismus pro atomické ratchet operace (M9 fix)
- Self-encryption pro multi-device synchronizaci vlastních zpráv

---

## 3. Nalezené zranitelnosti a nápravná opatření

### 3.1 KRITICKÉ — Opraveno

#### 3.1.1 Únik kryptografických klíčů přes debug výpisy

**Popis:** 160 `print()` volání v produkčním kódu vypisovalo citlivý kryptografický materiál do systémových logů — root keys, chain keys, message keys, identity keys, shared secrets, DH výstupy, nonce hodnoty.

**Riziko:** Na iOS jsou systémové logy čitelné přes USB (Console.app), diagnostické profily a potenciálně dalšími aplikacemi. Útočník s fyzickým přístupem k zařízení nebo se schopností číst logy mohl získat kompletní kryptografický stav relace.

**Dotčené soubory:**

- `Core/ChatClient.swift` — 118 výskytů (session data, OPK IDs, decryption debug)
- `Crypto/DoubleRatchet.swift` — 11 výskytů (root keys, DH public keys, message keys, nonce)
- `Crypto/X3DH.swift` — 9 výskytů (identity keys, ephemeral keys, DH outputs, shared secrets)
- `ViewModels/AuthViewModel.swift` — 7 výskytů
- `AppState.swift` — 7 výskytů
- `Core/MessageCache.swift` — 3 výskyty
- `ViewModels/ChatViewModel.swift` — 2 výskyty
- `ViewModels/ConversationListVM.swift` — 3 výskyty

**Náprava:** Všech 160 print statements zabaleno do `#if DEBUG` / `#endif` bloků. V release buildech nebude žádný kryptografický materiál logován.

#### 3.1.2 Insecure TLS — bypass ověření certifikátu a volitelné TLS

**Popis:** Parametr `tlsInsecure` umožňoval kompletní vypnutí TLS certificate verification. Navíc bylo TLS volitelné — uživatel mohl v UI vypnout šifrování transportní vrstvy přes toggle "Use TLS".

**Riziko:** MitM útok — útočník na síti mohl odposlouchávat a modifikovat veškerou komunikaci, včetně challenge-response autentizace a metadat.

**Dotčené soubory:**

- `Network/ConnectionManager.swift`
- `Core/ChatClient.swift`
- `ViewModels/AuthViewModel.swift`
- `Views/Auth/LoginView.swift`
- `Views/Auth/PairingView.swift`
- `Core/KeychainService.swift`

**Náprava:** TLS je nyní povinné bez výjimek. Parametry `useTLS` a `tlsInsecure` kompletně odstraněny z celého codebase. Toggle "Use TLS" odstraněn z UI. `ConnectionManager.connect()` vždy navazuje TLS spojení. Credentials v Keychainu již neukládají `useTLS` flag.

---

### 3.2 VYSOKÉ — Opraveno

#### 3.2.1 Heslo v paměti po úspěšném přihlášení

**Popis:** `AuthViewModel` uchovával heslo jako `String` property i po úspěšném loginu. Swift String je immutable a garbage collector jej může držet v paměti neomezeně dlouho.

**Riziko:** Memory dump útok — při fyzickém přístupu k zařízení nebo exploitu s přístupem do paměti procesu mohl útočník extrahovat heslo.

**Dotčený soubor:** `ViewModels/AuthViewModel.swift`

**Náprava:** Properties `password` a `confirmPassword` jsou vynulovány ihned po úspěšném přihlášení a uložení do Keychainu.

**Poznámka:** Swift `String` neumožňuje bezpečné přepisování paměti (na rozdíl od `UnsafeMutableBufferPointer`). Kompletní mitigace by vyžadovala vlastní typ pro citlivé řetězce. Aktuální řešení minimalizuje dobu expozice.

---

### 3.3 STŘEDNÍ — Opraveno

#### 3.3.1 Clipboard bez automatického vymazání

**Popis:** Funkce kopírování zprávy zapisovala text do systémového clipboardu (`UIPasteboard.general`) bez časového omezení.

**Riziko:** Jiné aplikace mohou číst obsah clipboardu (iOS 14+ zobrazuje notifikaci, ale nezabraňuje přístupu). Citlivý obsah zpráv mohl zůstat v clipboardu neomezeně.

**Dotčený soubor:** `Views/Chat/MessageBubbleView.swift`

**Náprava:** Přidán automatický clear clipboardu po 30 sekundách s kontrolou, že obsah nebyl mezitím uživatelem přepsán.

#### 3.3.2 Komentované vývojové IP adresy

**Popis:** `Constants.swift` obsahoval komentované dev server adresy (`192.168.88.65`, `85.71.71.188`), které odhalovaly interní síťovou infrastrukturu.

**Dotčený soubor:** `Utilities/Constants.swift`

**Náprava:** Komentované IP adresy odstraněny.

---

### 3.4 STŘEDNÍ — Neřešeno (doporučení)

#### 3.4.1 Chybějící certificate pinning

**Popis:** Aplikace se spoléhá výhradně na systémovou validaci TLS certifikátů. Neimplementuje certificate pinning ani SPKI pinning.

**Riziko:** Při kompromitaci certifikační autority, na enterprise-managed zařízeních s vlastním root CA, nebo při state-level útoku může útočník provést MitM. Dopady jsou omezené díky E2EE (obsah zpráv zůstává chráněn), ale metadata (kdo s kým komunikuje, timing) by byla vystavena.

**Doporučení:** Implementovat SPKI pinning pro produkční server `chat.ai-tech.news` pomocí Network.framework `sec_protocol_options_set_verify_block` s vlastní validací veřejného klíče serveru.

#### 3.4.2 Chybějící jailbreak detekce

**Popis:** Aplikace nedetekuje jailbreaknutá zařízení a nevaruje uživatele.

**Riziko:** Na jailbreaknutém zařízení jsou oslabeny iOS sandbox protekce — jiné aplikace mohou přistupovat k souborům aplikace, Keychain items mohou být extrahovány, a iOS file protection je částečně neúčinná.

**Doporučení:** Implementovat detekci (existence `/Applications/Cydia.app`, zápis mimo sandbox, dynamické knihovny) a zobrazit varování uživateli. Neblokovat použití — pouze informovat o riziku.

---

## 4. Pozitivní bezpečnostní nálezy

### 4.1 Keychain

Implementace v `KeychainService.swift` je správná:

- Přístupnost: `kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly`
- Biometrická ochrana: `.biometryAny` (Face ID / Touch ID)
- Credentials nejsou exportovatelné na jiná zařízení
- Správné error handling pro biometrické selhání

### 4.2 File protection

Všechny soubory na disku používají `.completeFileProtection` — jsou šifrované iOS file protection a přístupné pouze když je zařízení odemčené.

### 4.3 Šifrování lokálních dat

Všechny persistentní soubory (sessions, sender keys, message cache, conversation cache, avatary, TOFU registry) jsou šifrované AES-256-GCM s klíčem derivovaným přes HKDF z identity private key.

### 4.4 Žádné externí závislosti

Aplikace nepoužívá žádné third-party knihovny (CocoaPods, SPM, Carthage). Veškerá kryptografie běží přes nativní Apple frameworky (CryptoKit, Security, CommonCrypto). To eliminuje supply chain rizika.

### 4.5 Žádné WebView

Celé UI je nativní SwiftUI/UIKit. Absence WebView eliminuje kategorii XSS a JavaScript injection zranitelností.

### 4.6 Brute-force ochrana

Login implementuje exponenciální backoff (2^n sekund, max 300s) při neúspěšných pokusech. Server může vyžadovat PoW challenge při registračních surge.

### 4.7 Bezpečná registrace

Registrační flow zahrnuje email verifikaci a volitelný SHA-256 Proof-of-Work challenge jako ochranu proti automatizovaným registracím.

### 4.8 Actor isolation

`ChatClient` je implementován jako Swift actor, což garantuje thread-safe přístup ke kryptografickému stavu bez možnosti race conditions.

---

## 5. Shrnutí změn

| # | Závažnost | Nález | Stav |
|---|---|---|---|
| 3.1.1 | Kritická | Debug výpisy kryptografických klíčů (160×) | **Opraveno** |
| 3.1.2 | Kritická | TLS insecure bypass + volitelné TLS | **Opraveno** |
| 3.2.1 | Vysoká | Heslo zůstává v paměti po loginu | **Opraveno** |
| 3.3.1 | Střední | Clipboard bez auto-clear | **Opraveno** |
| 3.3.2 | Střední | Dev IP adresy v kódu | **Opraveno** |
| 3.4.1 | Střední | Chybějící certificate pinning | Doporučení |
| 3.4.2 | Střední | Chybějící jailbreak detekce | Doporučení |

**Celkové hodnocení po opravách:** Aplikace splňuje vysoké bezpečnostní standardy pro E2EE messaging. Kryptografická architektura je solidní a odpovídá Signal Protocol specifikaci. Zbývající doporučení se týkají defense-in-depth opatření.
