Hola Habr!
Hoy hablaré sobre lo que mis colegas y yo hemos estado haciendo durante varios meses: sobre notificaciones push para mensajería instantánea móvil. Como dije, en nuestra aplicación el énfasis principal está en la seguridad. Por lo tanto, descubrimos si las notificaciones push tienen "debilidades" y, de ser así, cómo podemos nivelarlas para agregar esta útil opción a nuestro servicio.
Estoy publicando una traducción de nuestro
artículo con Medium con algunas adiciones mías. Contiene los resultados de la "investigación" y una historia sobre cómo se resolvió el problema.
Explora el material
En el modelo clásico, las notificaciones push hacen que los mensajeros sean vulnerables a los ataques MITM (Man-in-the-middle, Man in the Middle). Por ejemplo, con Google, Microsoft y en la versión anterior de iMessage, la aplicación envía claves de cifrado a los servidores de Apple: los usuarios se autentican en el servidor y el encabezado del mensaje (o su contenido) se descifra.

Como resultado, existe la posibilidad de leer la correspondencia al obtener acceso al servidor de notificaciones push. Y esto significa que cualquier cifrado de correspondencia es inútil: las notificaciones automáticas seguirán brindando la oportunidad de ser leídas por terceros. Los autores del artículo
"Cifrar sabiamente" en Xaker.ru, dedicado a los métodos de cifrado de mensajes, discutieron esta posibilidad con más detalle.
Si cree que los servidores de Apple y Google no permitirán la filtración del 100% de las claves de cifrado de los usuarios, considere que sus empleados tienen acceso a ellas. Y los empleados son personas.
Con todas las vulnerabilidades de empujar, muchos mensajeros "seguros", incluidos Signal y Telegram, los usan. De lo contrario, los usuarios tendrán que monitorear "manualmente" los nuevos mensajes ingresando constantemente la aplicación. Lo cual es muy inconveniente, y los mensajeros competidores obtendrán una ventaja.
Paranoia y sentido común
En nuestro proyecto, nos enfrentamos con este problema hace varios meses. Necesitábamos hacer que las notificaciones push fueran una opción para ser competitivos. Pero al mismo tiempo, no haga un agujero en la seguridad, porque cualquier fuga de datos socavará la credibilidad del proyecto.
Sin embargo, ya tenemos una ventaja importante: nuestro mensajero está descentralizado (los datos se almacenan en la cadena de bloques), mientras que los empleados no tienen acceso a las cuentas. Solo los usuarios tienen claves de cifrado, y las claves públicas del interlocutor están disponibles en la cadena de bloques para proteger contra ataques MITM.
En la primera versión del push, decidimos jugar lo más seguro posible y no transmitir el texto del mensaje. El servicio push recibido del nodo no es el texto del mensaje, sino solo una señal sobre el hecho de su recepción. Por lo tanto, el usuario vio la notificación "Ha llegado un nuevo mensaje". Era posible leerlo solo en el messenger.
Cómo funcionó: video .
Después de eso, supimos que la última versión de notificaciones de Apple tiene nuevas características de seguridad. Lanzaron UNNotificationServiceExtension, que permite a los desarrolladores enviar datos de notificación totalmente encriptados a través de APNS. Luego, la aplicación en el dispositivo del usuario final descifra (o descarga datos adicionales) y muestra una notificación. Lo tomamos como la base de la segunda versión del empuje.
Ahora hemos desarrollado la segunda versión de notificaciones push para iOS, que le permite mostrar el texto del mensaje sin riesgo de seguridad. En el nuevo concepto, la lógica se ve así:
- El servicio push envía una notificación push con un número de transacción (el mensaje cifrado puede ser muy grande y el tamaño de las notificaciones es muy limitado)
- Al recibir una notificación, el dispositivo inicia nuestra NotificationServiceExtension, una micro aplicación que solicita una transacción del nodo por id, la descifra usando la frase de contraseña guardada y le da al sistema una nueva notificación. La frase de contraseña se almacena en un almacén seguro.
- El sistema muestra una notificación con un mensaje descifrado o traducción.
- Las teclas no van a ningún lado, como lo hace un mensaje de texto sin formato. El servicio push no tiene la capacidad de descifrar el mensaje.

Tomamos esta versión como funcional y la implementamos en la última actualización de la aplicación iOS.
Los interesados en el
aspecto técnico pueden ver el código fuente:
github.com/Adamant-im/adamant-notificationService .