10 KiB
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ýskytyViewModels/ChatViewModel.swift— 2 výskytyViewModels/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.swiftCore/ChatClient.swiftViewModels/AuthViewModel.swiftViews/Auth/LoginView.swiftViews/Auth/PairingView.swiftCore/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í.