¡Hola, Habr!
Hoy les contaré sobre lo que mis colegas y yo hemos estado trabajando durante varios meses: las notificaciones push para mensajeros móviles. Como he mencionado antes, en nuestra aplicación la principal prioridad es la seguridad. Por lo tanto, investigamos si hay "puntos débiles" en las notificaciones push y, si es así, cómo podemos mitigarlos para añadir esta útil opción a nuestro servicio.
Publico la traducción de nuestro con algunos añadidos de mi parte. En él se encuentran los resultados de la "investigación" y la historia de cómo resolvimos el problema.
Investigamos el material relacionado
En el modelo clásico, las notificaciones push hacen que los mensajeros sean vulnerables a ataques MITM (Man-in-the-middle, 'Hombre en el medio'). Por ejemplo, en Google, Microsoft y en la versión antigua de iMessage, la aplicación envía claves de cifrado a los servidores de Apple; en el servidor se realiza la autenticación de los usuarios y la descifrado del encabezado del mensaje (o de su contenido).

Como resultado, existe la posibilidad de leer la conversación al obtener acceso al servidor de notificaciones push. Esto significa que cualquier cifrado de la conversación es inútil: las notificaciones push seguirán permitiendo que terceros lean el contenido. Los autores del artículo en Xaker.ru, dedicado a los métodos de cifrado de mensajes, discuten esta posibilidad en profundidad.
Si piensas que los servidores de Apple y Google no permitirán 100% la filtración de claves de cifrado de los usuarios, piensa en el hecho de que sus empleados tienen acceso a ellos. Y los empleados son personas.
A pesar de todas las vulnerabilidades de las notificaciones push, muchos mensajeros "seguros", incluidos Signal y Telegram, las utilizan. Porque de lo contrario, los usuarios tendrían que "monitorear manualmente" los nuevos mensajes, ingresando constantemente a la aplicación. Lo cual es bastante inconveniente, y los mensajeros competidores obtendrán una ventaja.
Paranoia y sentido común
En nuestro proyecto, nos enfocamos en esta cuestión hace varios meses. Necesitábamos implementar la opción de notificaciones push para ser competitivos. Pero al mismo tiempo, no queríamos dejar abierta una brecha de seguridad, ya que cualquier fuga de datos socavaría la confianza en el proyecto.
Sin embargo, ya tenemos una ventaja importante: nuestro mensajero es descentralizado (los datos se almacenan en la blockchain), y los empleados no tienen acceso a las cuentas. Las claves de cifrado pertenecen únicamente a los usuarios, y las claves públicas de los interlocutores están disponibles en la blockchain para proteger contra ataques MITM.
En la primera versión de las notificaciones, decidimos ser extremadamente cautelosos y no transmitir el texto del mensaje en absoluto. El servicio de notificaciones solo recibía de la nodo una señal sobre la recepción del mensaje, sin el texto. Por lo tanto, el usuario solo veía la notificación "Ha llegado un nuevo mensaje". Solo se podía leer en el mensajero.

.
Después de eso, supimos que en la última versión de las notificaciones de Apple hay nuevos elementos de protección. Ellos UNNotificationServiceExtension, que permite a los desarrolladores enviar datos de notificación completamente cifrados a través de APNS. Luego, la aplicación en el dispositivo del usuario final descifra (o carga datos adicionales) y muestra la notificación. Esta fue la base de la segunda versión de las notificaciones.
Ahora hemos desarrollado la segunda versión de las notificaciones push para iOS, que permite mostrar el texto del mensaje sin comprometer la seguridad. En el nuevo concepto, la lógica es la siguiente:
- El servicio push envía una notificación push con el número de transacción (el mensaje cifrado puede ser muy grande, y el tamaño de las notificaciones está muy limitado)
- El dispositivo, al recibir la notificación, inicia nuestro NotificationServiceExtension, una microaplicación que solicita a la nodo la transacción por id, descifra usando la frase de paso guardada y entrega un nuevo aviso al sistema. La frase de paso se almacena de forma segura.
- El sistema muestra la notificación con el mensaje descifrado o su traducción.
- Las claves no se envían a ningún lado, al igual que el mensaje en texto plano. El servicio de notificaciones no tiene la capacidad de descifrar el mensaje.

Esta versión la consideramos funcional y la implementamos en la última actualización de la aplicación para iOS.
Los interesados en el aspecto técnico pueden ver el código fuente: .
Fuente: habr.com
