Olá, Habr!
Hoje vou falar sobre o que eu e meus colegas temos trabalhado nos últimos meses: sobre notificações push para mensageiros móveis. Como já mencionei, nosso aplicativo tem um grande foco na segurança. Portanto, investigamos se as notificações push têm "pontos fracos" e, se sim, como podemos mitigá-los para adicionar essa função útil ao nosso serviço.
Estou publicando a tradução do nosso com algumas adições pessoais. Nele, estão as conclusões da "investigação" e a explicação de como resolvemos o problema.
Explorando a base técnica
Na modelagem clássica, as notificações push tornam os mensageiros vulneráveis a ataques MITM (Man-in-the-middle). Por exemplo, no Google, Microsoft e na versão antiga do iMessage, o aplicativo envia as chaves de criptografia para os servidores da Apple — no servidor, ocorre a autenticação dos usuários e a descriptografia do cabeçalho da mensagem (ou de seu conteúdo).

Assim, existe a possibilidade de ler a conversa, tendo acesso ao servidor de notificações push. Isso significa que qualquer criptografia das conversas se torna inútil: as notificações push ainda permitirão que terceiros leiam as mensagens. Os autores do artigo no Xaker.ru, discutiram mais detalhadamente essa possibilidade, dedicada aos métodos de criptografia de mensagens.
Se você acha que os servidores da Apple e do Google 100% impedirão a filtragem das chaves de criptografia dos usuários, pense que seus funcionários têm acesso a elas. E os funcionários são pessoas.
Apesar das vulnerabilidades das notificações push, muitos mensageiros "seguros", incluindo o Signal e o Telegram, as utilizam. Caso contrário, os usuários teriam que monitorar manualmente novas mensagens, acessando constantemente o aplicativo. Isso é bastante inconveniente, e mensageiros concorrentes teriam uma vantagem.
Paranoia e senso comum
No nosso projeto, nós focamos nesse tema há alguns meses. Precisávamos implementar a opção de notificações push para sermos competitivos. Mas, ao mesmo tempo, não podíamos deixar uma brecha na segurança, pois qualquer vazamento de dados comprometeria a confiança no projeto.
Entretanto, já temos uma importante vantagem: nosso mensageiro é descentralizado (os dados são armazenados na blockchain), e os funcionários não têm acesso às contas. As chaves de criptografia estão apenas com os usuários, e as chaves públicas dos interlocutores estão disponíveis na blockchain, protegendo contra ataques MITM.
Na primeira versão dos push, decidimos nos precaver ao máximo e não transmitimos o texto da mensagem. O serviço de push recebia da node apenas um sinal indicando o recebimento, não o texto da mensagem. Portanto, o usuário via o aviso ‘Uma nova mensagem chegou’. A leitura só era possível no mensageiro.

.
Depois disso, descobrimos que na última versão das notificações da Apple existem novos elementos de proteção. Eles UNNotificationServiceExtension, que permite aos desenvolvedores enviar dados de notificações totalmente criptografados pelo APNS. Então, o aplicativo no dispositivo do usuário final realiza a descriptografia (ou carrega dados adicionais) e exibe a notificação. Esta baseamos na segunda versão dos push.
Atualmente, desenvolvemos a segunda versão das notificações push para iOS, que permite exibir o texto da mensagem sem comprometer a segurança. Na nova abordagem, a lógica é a seguinte:
- O serviço de push envia uma notificação com o número da transação (a mensagem criptografada pode ser muito grande, e o tamanho das notificações é severamente limitado)
- O dispositivo, ao receber a notificação, inicia nossa NotificationServiceExtension — um microaplicativo que solicita à node a transação por ID, descriptografa usando a passphrase armazenada e entrega ao sistema uma nova notificação. A passphrase é mantida em um armazenamento seguro.
- O sistema exibe a notificação com a mensagem descriptografada ou sua tradução.
- As chaves não saem de lugar algum, assim como a mensagem em texto simples. O serviço de push não tem a capacidade de descriptografar a mensagem.

Aceitamos esta versão como funcional e a implementamos na última atualização do aplicativo para iOS.
Os interessados na parte técnica podem olhar o código-fonte: .
Fonte: habr.com
