Ahoj, Habr!
Dnes vám povím o tom, čemu se s kolegy věnujeme už několik měsíců: o push notifikacích pro mobilní messenger. Jak už jsem zmínil, v naší aplikaci je kladen důraz na bezpečnost. Proto jsme zjišťovali, zda mají push notifikace nějaké „slabé stránky“, a pokud ano, jak je můžeme eliminovat, abychom tuto užitečnou funkci mohli přidat do našeho servisu.
Publikuji překlad našeho s drobnými přídavky od sebe. Obsahuje závěry z našeho „vyšetřování“ a popis, jak jsme vyřešili problém.
Zkoumáme technické základy
V klasickém modelu push notifikací se messengery stávají zranitelnými vůči útokům MITM (Man-in-the-middle, „Člověk uprostřed“). Například u Googlu, Microsoftu a ve staré verzi iMessage aplikace posílá šifrovací klíče na servery Apple — na serveru dochází k autentizaci uživatelů a dešifrování hlavičky zprávy (nebo jejího obsahu).

V důsledku toho existuje šance přečíst si konverzaci, pokud získáte přístup k serveru push notifikací. To znamená, že jakékoli šifrování konverzace je zbytečné: push notifikace i tak ponechávají možnost pro čtení třetími stranami. Tuto možnost podrobněji probírali autoři článku na Xaker.ru, který je věnován způsobům šifrování zpráv.
Pokud máte pocit, že servery Apple a Google 100% zajistí, že nedojde k úniku šifrovacích klíčů uživatelů, zamyslete se nad tím, že k nim mají přístup jejich zaměstnanci. A zaměstnanci jsou lidé.
Navzdory všem zranitelnostem push notifikací mnoho „bezpečných“ messengerů, včetně Signal a Telegram, je používá. Jinak by uživatelé museli „ručně“ sledovat nové zprávy, neustále otevírat aplikaci. Což je velmi nepohodlné a konkurenční messengery by získaly výhodu.
Paranoia a zdravý rozum
V našem projektu se tímto problémem intenzivně zabýváme už několik měsíců. Potřebovali jsme vytvořit možnost push notifikací, abychom byli konkurenceschopní. Ale zároveň jsme nechtěli udělat díru do bezpečnosti, protože jakýkoli únik dat podkope důvěru v projekt.
Naše aplikace má však již jednu důležitou výhodu: je decentralizovaná (data jsou uložena v blockchainu) a zaměstnanci nemají přístup k účtům. Šifrovací klíče mají pouze uživatelé, zatímco veřejné klíče konverzací jsou dostupné v blockchainu, aby byla chráněna před útoky typu MITM.
V první verzi notifikací jsme se rozhodli maximálně pojistit a vůbec nepředávat text zprávy. Push služba dostávala od uzlu pouze signál ohledně přijetí zprávy, nikoli samotný text. Uživatel tak viděl oznámení "Přijata nová zpráva". Přečíst si ji bylo možné pouze v messengeru.

.
Poté jsme se dozvěděli, že v poslední verzi notifikací od Apple jsou nové bezpečnostní prvky. Ty UNNotificationServiceExtension, který umožňuje vývojářům posílat zcela šifrovaná data notifikací přes APNS. Aplikace na zařízení koncového uživatele pak provádí dešifrování (nebo načítá další data) a zobrazuje notifikaci. Tuto funkci jsme vzali jako základ pro druhou verzi notifikací.
Nyní jsme vyvinuli druhou verzi push notifikací pro iOS, která umožňuje zobrazit text zprávy bez ohrožení bezpečnosti. Nová logika konceptu vypadá takto:
- Push služba posílá push notifikaci s číslem transakce (šifrovaná zpráva může být velmi velká a velikost notifikací je značně omezena)
- Zařízení po přijetí notifikace spouští náš NotificationServiceExtension — mikroaplikaci, která žádá u uzlu o transakci podle id, dešifruje pomocí uložené fráze a posílá systému novou notifikaci. Fráze je uchována v zabezpečeném úložišti.
- Systém zobrazuje notifikaci s dešifrovanou zprávou nebo překladem.
- Klíče nikam neodchází, stejně jako plain text zpráva. Push služba nemá možnost dešifrovat zprávu.

Tuto verzi jsme schválili jako funkční a implementovali ji v poslední aktualizaci aplikace pro iOS.
Zájemci o technickou stránku mohou nahlédnout do zdrojového kódu: .
Zdroj: habr.com
