- WhatsApp, con más de 3 mil millones de usuarios, introdujo una capa de seguridad basada en Rust para reforzar su defensa frente a amenazas de malware
- Reescribió en Rust la biblioteca de consistencia de medios y la desplegó en miles de millones de dispositivos y navegadores, completando su validación en uso real a escala global
- Sustituyó 160 mil líneas de código existentes en C++ por 90 mil líneas en Rust, mejorando tanto el rendimiento como la eficiencia de memoria
- Desde la vulnerabilidad Stagefright de 2015, había impulsado la adopción de lenguajes con seguridad de memoria como Rust para aumentar la seguridad en el procesamiento de archivos multimedia
- Este cambio marca un punto de inflexión en la estrategia de seguridad de WhatsApp, Messenger e Instagram, ampliando el peso de los lenguajes con seguridad de memoria
Estrategia de procesamiento de medios de WhatsApp
- WhatsApp es un servicio de mensajería con cifrado de extremo a extremo usado por más de 3 mil millones de personas, y ha ido evolucionando su estrategia para responder a amenazas de seguridad constantes
- Cuando los usuarios comparten imágenes, videos y otros medios, existe la posibilidad de que incluyan malware
- Algunos archivos pueden explotar vulnerabilidades sin parchear del sistema operativo o de la app
- Para prevenirlo, incorporó el lenguaje Rust en la función de compartir medios para garantizar la seguridad de memoria
- Se menciona como uno de los mayores despliegues de una biblioteca basada en Rust a nivel mundial
La vulnerabilidad Android Stagefright de 2015 y la respuesta
- La vulnerabilidad Stagefright de Android en 2015 existía en una biblioteca de procesamiento multimedia a nivel del sistema operativo, por lo que no podía corregirse desde la app
- WhatsApp mejoró su propia biblioteca en C++ “wamedia” para detectar archivos que no cumplen con el estándar MP4
- Con esto, pudo proteger a los usuarios sin depender de una actualización del sistema operativo
- Sin embargo, dado que wamedia procesa automáticamente entradas no confiables, surgió la necesidad de migrar a un lenguaje con seguridad de memoria
Transición a Rust: reescritura a gran escala y resultados
- WhatsApp desarrolló una versión en Rust de wamedia en paralelo con la versión existente en C++
- Verificó la compatibilidad entre ambas implementaciones mediante differential fuzzing, pruebas de integración y pruebas unitarias
- Al principio hubo problemas por el aumento del tamaño del binario causado por la biblioteca estándar de Rust y por la compatibilidad con el sistema de compilación, pero se estableció una estructura de soporte a largo plazo
- Como resultado, se reemplazaron 160 mil líneas en C++ → 90 mil líneas en Rust, mejorando tanto el rendimiento como la eficiencia en el uso de memoria
- Se completó el despliegue total de la versión en Rust en Android, iOS, Mac, Web, wearables y todas las demás plataformas
- Después se introdujo el sistema “Kaleidoscope” para detectar tipos de archivos riesgosos como PDF o ejecutables, e identificar falsificación de extensiones o spoofing de MIME
Enfoque de seguridad de WhatsApp
- WhatsApp opera múltiples capas de seguridad, como cifrado de extremo a extremo, copias de seguridad cifradas, transparencia de claves y funciones de protección de llamadas
- Identifica riesgos mediante publicación de CVE, auditorías de seguridad internas y externas, fuzzing y análisis estático, gestión de la cadena de suministro y análisis de superficie de ataque
- Amplió su programa de Bug Bounty para ofrecer un Research Proxy que permite a investigadores analizar el protocolo de red de WhatsApp
- Confirmó que muchas de las vulnerabilidades importantes provienen de problemas de seguridad de memoria en C/C++, y ejecuta tres estrategias en paralelo
- Minimizar la superficie de ataque innecesaria
- Reforzar las garantías de seguridad del código C/C++ restante
- Cambiar el lenguaje base del código nuevo a un lenguaje con seguridad de memoria
Aceleración de la adopción de Rust y dirección futura
- Rust hace posible desarrollar bibliotecas de seguridad de alto rendimiento y multiplataforma para WhatsApp
- Este cambio aporta una capa adicional de seguridad invisible para el usuario como parte de una estrategia de defensa en profundidad
- Los equipos de seguridad de WhatsApp y Meta están ampliando las áreas donde Rust tiene mayor impacto y planean acelerar su adopción en el futuro
1 comentarios
Comentarios de Hacker News
WhatsApp es un mensajero que usan 3 mil millones de personas al día
En Estados Unidos casi no se usa, pero a nivel global ya se convirtió en una infraestructura básica de comunicación
Si quieres crear un producto para el mercado global, tienes que entender la mentalidad y los hábitos de estos usuarios
Todavía quedamos al menos unas decenas de personas independientes así
Por favor, no participen en hacer que WhatsApp sea todavía más imposible de evitar
La mayoría de la gente casi no revisa su email
Dirijo una comunidad de desarrolladores y seguido chocamos con el límite de integrantes del grupo (1024)
Aunque intentamos movernos a Discord o Slack, al final siempre terminamos volviendo a WhatsApp
Porque gracias a los paquetes de datos de las operadoras, WhatsApp es prácticamente gratis
TechCrunch publicó varias notas sobre el spam de mensajes empresariales en WhatsApp, como esta, pero en la práctica casi nada ha cambiado
La UX de las funciones de comunidad tampoco es muy buena
Al final, creo que el problema es la creciente dependencia del ecosistema de Facebook
Yo llevo 10 años sin usar WhatsApp, y la mayoría de mis amigos y familiares se pasaron a Signal
En Europa todavía hay regiones donde se sigue usando Viber
Decían que era uno de los mayores despliegues de una biblioteca escrita en Rust, pero en realidad Fontations podría ser más grande
Está incluido en Chromium y, si se cuentan sus dependencias, su base instalada podría ser aún mayor
Por la cita, parece que WhatsApp no usa directamente libsignal
Por ejemplo: image-png, CrabbyAvif, qr_code, icu4x
Está bien que el código haya bajado de 160 mil líneas a 90 mil, pero lo más interesante es la estrategia de despliegue en paralelo
Ejecutar al mismo tiempo las versiones en Rust y C++ y verificar su equivalencia con differential fuzzing me parece algo muy realista
En clientes móviles, el tamaño del binario es importante, así que impresiona que hayan invertido en tooling de compilación
También podría tratarse de optimizaciones que solo están disponibles en builds nightly
En este tipo de reescrituras, la parte más difícil no es la implementación en Rust, sino mantener compatibilidad con los bugs del parser existente
En la práctica, muchos archivos multimedia están mal formados, y si los parseas con demasiada rigidez terminas rompiendo datos de usuario
El differential fuzzing es prácticamente el único enfoque realmente útil
Cuando dicen que WhatsApp hizo el mayor despliegue de Rust, probablemente se refieren a que corre en más dispositivos que Windows 11
Aun así, queda la duda de si WhatsApp usa libsignal directamente
Android en sí ya incluye bastante código basado en Rust, y también se usa ampliamente en dispositivos embebidos
Windows sigue estando centrado en C/C++
Se menciona que introducir la biblioteca estándar de Rust aumentó el tamaño del binario, pero no se explica cómo lo resolvieron
Commits relacionados: commit1, commit2
El problema no es tanto el tamaño en sí, sino las dependencias duplicadas de Rust
En builds mixtos de C++ y Rust, cada lado incluye su propia libstd, así que hace falta un sistema de compilación unificado como Bazel
Al principio aceptaron un sobrecosto de unos 200 KiB, pero con la migración a Buck2 redujeron tanto el tamaño como los tiempos de compilación
Fue gracias a las mejoras recientes en las optimizaciones de clang y en LTO
Me pregunto si Signal está intentando algo parecido
libsignal está implementado en Rust, pero del resto no sé mucho
Había una frase que decía que ofrecen cifrado de extremo a extremo por defecto a 3 mil millones de personas, pero también ha habido noticias de que sí pueden leer los mensajes
Skype también venía cifrado por defecto, pero según la configuración del servidor eso podía desactivarse
La cuestión es si se puede confiar en que Meta no esté husmeando los datos
Es irónico que Meta no detenga el phishing o las estafas con tarjetas prepagadas, pero sí se esfuerce tanto en otras cosas
Me impresionó que la adopción de Rust haya reducido tantos bugs
En C++ hay una enorme cantidad de comportamiento indefinido (UB), mientras que Rust lo bloquea de forma estructural
Gracias a su fuerte sistema de tipos, la confiabilidad mejora muchísimo