ios_client
This commit is contained in:
204
ios_client 0.8.5/SECURITY_REVIEW.md
Normal file
204
ios_client 0.8.5/SECURITY_REVIEW.md
Normal file
@@ -0,0 +1,204 @@
|
||||
# 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í.
|
||||
Reference in New Issue
Block a user