Notificações push seguras: da teoria à prática

Olá Habr!

Hoje vou falar sobre o que meus colegas e eu fazemos há vários meses: sobre notificações por push para mensageiros instantâneos móveis. Como eu disse, em nossa aplicação, a ênfase principal está na segurança. Portanto, descobrimos se as notificações por push têm "pontos fracos" e, em caso afirmativo, como podemos nivelá-las para adicionar essa opção útil ao nosso serviço.

Estou publicando uma tradução de nosso artigo no Medium com algumas adições de mim mesmo. Ele contém os resultados da “investigação” e uma história sobre como o problema foi resolvido.

Explore o material


No modelo clássico, as notificações por push tornam os mensageiros vulneráveis ​​a ataques MITM (Man-in-the-middle, Man in the Middle). Por exemplo, com o Google, Microsoft e na versão antiga do iMessage, o aplicativo envia chaves de criptografia aos servidores da Apple - os usuários são autenticados no servidor e o cabeçalho da mensagem (ou seu conteúdo) é descriptografado.



Como resultado, há uma chance de ler a correspondência obtendo acesso ao servidor de notificação por push. E isso significa que qualquer criptografia de correspondência é inútil: as notificações por push ainda deixarão uma oportunidade para a leitura por terceiros. Os autores do artigo “Criptografar com sabedoria” no Xaker.ru, dedicado aos métodos de criptografia de mensagens, discutiram essa possibilidade com mais detalhes.

Se você acha que os servidores da Apple e do Google não permitem vazamento de 100% das chaves de criptografia do usuário, considere que seus funcionários tenham acesso a elas. E os funcionários são pessoas.
Com todas as vulnerabilidades de envio, muitos mensageiros "seguros", incluindo Sinal e Telegrama, os usam. Caso contrário, os usuários terão que "manualmente" monitorar novas mensagens entrando constantemente no aplicativo. O que é muito inconveniente e os mensageiros concorrentes obterão uma vantagem.

Paranóia e bom senso


Em nosso projeto, nos deparamos com esse problema há vários meses. Precisávamos fazer das notificações push uma opção para sermos competitivos. Mas, ao mesmo tempo, não faça um buraco na segurança, porque qualquer vazamento de dados prejudicará a credibilidade do projeto.

No entanto, já temos uma vantagem importante: nosso messenger é descentralizado (os dados são armazenados no blockchain), enquanto os funcionários não têm acesso às contas. Apenas os usuários têm chaves de criptografia e as chaves públicas do interlocutor estão disponíveis no blockchain para proteger contra ataques MITM.

Na primeira versão do push, decidimos mantê-lo o mais seguro possível e não transmitir o texto da mensagem. O serviço de push recebido do nó não é o texto da mensagem, mas apenas um sinal sobre o fato de seu recebimento. Portanto, o usuário viu a notificação "Uma nova mensagem chegou". Era possível lê-lo apenas no messenger.


Como funcionou: vídeo .

Depois disso, descobrimos que a versão mais recente de notificações da Apple possui novos recursos de segurança. Eles lançaram o UNNotificationServiceExtension, que permite que os desenvolvedores enviem dados de notificação totalmente criptografados por meio do APNS. Em seguida, o aplicativo no dispositivo do usuário final descriptografa (ou baixa dados adicionais) e exibe uma notificação. Tomamos como base da segunda versão do push.

Agora, desenvolvemos a segunda versão das notificações por push para iOS, que permite exibir o texto da mensagem sem risco de segurança. No novo conceito, a lógica é assim:

  • O serviço de envio envia uma notificação por push com um número de transação (a mensagem criptografada pode ser muito grande e o tamanho das notificações é muito limitado)
  • Após o recebimento da notificação, o dispositivo lança nosso NotificationServiceExtension - um micro aplicativo que solicita uma transação do nó por ID, descriptografa-a usando a senha salva e envia ao sistema uma nova notificação. A senha é armazenada em um depósito seguro.
  • O sistema exibe uma notificação com uma mensagem ou tradução descriptografada.
  • As teclas não vão a lugar algum, assim como uma mensagem de texto sem formatação. O serviço de envio não tem a capacidade de descriptografar a mensagem.



Tomamos essa versão como funcionando e a implementamos na atualização mais recente do aplicativo iOS.
Os interessados ​​no lado técnico podem ver o código fonte: github.com/Adamant-im/adamant-notificationService .

Source: https://habr.com/ru/post/pt456902/


All Articles