Files
Kecalek_python/ios_client 0.8.5/SECURITY_REVIEW.md
2026-03-14 12:43:56 +01:00

10 KiB
Raw Blame History

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 (64B64KB) 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í.