# 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í.