Utiliser Rust dans un service à grande échelle : une couche de sécurité supplémentaire pour WhatsApp
(engineering.fb.com)- WhatsApp, qui compte plus de 3 milliards d’utilisateurs, a introduit une couche de sécurité basée sur Rust afin de renforcer sa défense contre les menaces liées aux malwares
- La bibliothèque de cohérence des médias a été réécrite en Rust puis déployée sur des dizaines de milliards d’appareils et de navigateurs, validant son usage en conditions réelles à l’échelle mondiale
- 160 000 lignes de code C++ existant ont été remplacées par 90 000 lignes de Rust, avec des améliorations à la fois en performances et en efficacité mémoire
- Après la vulnérabilité Stagefright de 2015, l’entreprise a cherché à améliorer la sûreté du traitement des fichiers multimédias en adoptant des langages à sûreté mémoire comme Rust
- Ce changement marque un tournant dans la stratégie de sécurité de WhatsApp, Messenger et Instagram, avec une place croissante accordée aux langages à sûreté mémoire
Stratégie de traitement des médias de WhatsApp
- WhatsApp est un service de messagerie chiffrée de bout en bout utilisé par plus de 3 milliards de personnes, et fait évoluer sa stratégie pour répondre à des menaces de sécurité permanentes
- Lorsque les utilisateurs partagent des images, vidéos et autres médias, il existe un risque qu’ils contiennent des malwares
- Certains fichiers peuvent exploiter des vulnérabilités non corrigées du système d’exploitation ou de l’application
- Pour s’en prémunir, WhatsApp a introduit le langage Rust dans sa fonctionnalité de partage de médias afin d’assurer la sûreté mémoire
- Il s’agit, selon l’entreprise, de l’un des plus grands déploiements d’une bibliothèque basée sur Rust au monde
La vulnérabilité Android Stagefright de 2015 et la réponse apportée
- En 2015, la vulnérabilité Stagefright d’Android se trouvait dans une bibliothèque de traitement multimédia au niveau de l’OS, ce qui la rendait impossible à corriger au niveau applicatif
- WhatsApp a modifié sa propre bibliothèque C++ « wamedia » afin de détecter les fichiers non conformes au standard MP4
- Cela a permis de protéger les utilisateurs sans attendre une mise à jour du système d’exploitation
- Cependant, comme wamedia traite automatiquement des entrées non fiables, la nécessité d’une transition vers un langage à sûreté mémoire s’est imposée
Transition vers Rust : réécriture à grande échelle et résultats
- WhatsApp a développé une version Rust de wamedia en parallèle de la version C++ existante
- La compatibilité entre les deux implémentations a été vérifiée par differential fuzzing, des tests d’intégration et des tests unitaires
- Au départ, la taille accrue des binaires due à la bibliothèque standard de Rust et des problèmes de compatibilité avec le système de build se sont posés, mais un cadre de support à long terme a été mis en place
- Au final, le remplacement de 160 000 lignes de C++ par 90 000 lignes de Rust a amélioré à la fois les performances et l’efficacité de l’usage mémoire
- Le déploiement complet de la version Rust sur toutes les plateformes — Android, iOS, Mac, Web, wearables, etc. — a été mené à bien
- Ensuite, le système « Kaleidoscope » a été introduit pour détecter les types de fichiers à risque comme les PDF ou les exécutables, ainsi que l’usurpation d’extension ou le spoofing MIME
L’approche sécurité de WhatsApp
- WhatsApp opère plusieurs couches de sécurité, dont le chiffrement de bout en bout, les sauvegardes chiffrées, la transparence des clés et des protections pour les appels
- Les risques sont identifiés via la publication des CVE, des audits de sécurité internes et externes, le fuzzing et l’analyse statique, la gestion de la supply chain et l’analyse de la surface d’attaque
- Le programme Bug Bounty a été élargi, avec la mise à disposition d’un Research Proxy permettant aux chercheurs d’analyser le protocole réseau de WhatsApp
- Constatant qu’une grande partie des vulnérabilités majeures provient de problèmes de sûreté mémoire en C/C++, l’entreprise poursuit trois stratégies en parallèle
- Réduire au minimum la surface d’attaque inutile
- Renforcer les garanties de sécurité du code C/C++ restant
- Faire des langages à sûreté mémoire la langue par défaut pour le nouveau code
Accélération de l’adoption de Rust et orientation future
- Rust permet à WhatsApp de développer des bibliothèques de sécurité hautes performances et cross-platform
- Ce changement fournit une couche de sécurité supplémentaire invisible pour l’utilisateur, dans le cadre d’une stratégie de defense-in-depth
- Les équipes sécurité de WhatsApp et Meta étendent actuellement les domaines où Rust a le plus d’impact et prévoient d’accélérer son adoption à l’avenir
1 commentaires
Réactions sur Hacker News
WhatsApp est une messagerie utilisée par 3 milliards de personnes chaque jour
Aux États-Unis, elle est peu utilisée, mais à l’échelle mondiale, elle s’est imposée comme une infrastructure de communication de base
Si l’on veut créer un produit pour le marché mondial, il faut comprendre la façon de penser et les habitudes de ces utilisateurs
Il reste encore quelques dizaines de personnes indépendantes comme ça
S’il vous plaît, n’aidez pas à rendre WhatsApp encore plus incontournable
La plupart des gens consultent très peu leurs e-mails
Je gère une communauté de développeurs, et on atteint souvent la limite de taille des groupes (1024 personnes)
Même quand on essaie de basculer vers Discord ou Slack, on finit par revenir à WhatsApp
Parce qu’avec les forfaits data des opérateurs, WhatsApp est en pratique gratuit
TechCrunch a publié plusieurs articles sur le spam des messages d’entreprise, mais dans les faits, presque rien n’a changé
L’UX des fonctionnalités communautaires n’est pas terrible non plus
Au final, le vrai problème est selon moi l’aggravation de la dépendance à l’écosystème Facebook
Je n’utilise plus WhatsApp depuis 10 ans, et la plupart de mes amis et de ma famille sont passés à Signal
En Europe, il y a encore des régions où Viber est utilisé
Ils disent que c’est le plus gros déploiement d’une bibliothèque écrite en Rust, mais en réalité Fontations est peut-être plus gros
C’est inclus dans Chromium, et si l’on tient compte de ses dépendances, la base installée est peut-être plus large
À en juger par la citation, WhatsApp ne semble pas utiliser directement libsignal
Par exemple : image-png, CrabbyAvif, qr_code, icu4x
Le fait que le code soit passé de 160 000 à 90 000 lignes est bien, mais la stratégie de déploiement en parallèle est encore plus intéressante
Faire tourner en même temps les versions Rust et C++ et vérifier leur équivalence avec du differential fuzzing est une approche réaliste
Sur les clients mobiles, la taille du binaire est importante, donc l’investissement dans l’outillage de build est impressionnant
C’est peut-être une optimisation possible uniquement avec des builds nightly
Dans ce type de réécriture, la partie la plus difficile n’est pas tant l’implémentation Rust que le maintien de la compatibilité avec les bugs de l’ancien parseur
Les vrais fichiers multimédias sont souvent mal formés, et parser de manière trop stricte finit par casser les données des utilisateurs
Le differential fuzzing est pratiquement la seule approche vraiment praticable
Dire que WhatsApp a fait le plus gros déploiement en Rust signifie probablement que cela tourne sur plus d’appareils que Windows 11
En revanche, on peut se demander si WhatsApp utilise vraiment libsignal directement
Android lui-même inclut déjà beaucoup de code basé sur Rust, et Rust est aussi largement utilisé sur les appareils embarqués
tandis que Windows reste encore centré sur le C/C++
Il est dit que l’introduction de la bibliothèque standard Rust a entraîné une augmentation de la taille du binaire, mais il n’est pas précisé comment cela a été résolu
Commits liés : commit1, commit2
Le problème n’est pas tant la taille elle-même que les dépendances Rust dupliquées
Dans un build mêlant C++ et Rust, chacun embarque son propre libstd, d’où la nécessité d’un système de build unifié comme Bazel
Au départ, ils acceptaient un surcoût d’environ 200 KiB, mais la migration vers Buck2 a réduit à la fois la taille et les temps de build
Grâce aux optimisations récentes de clang et aux améliorations de la LTO
Je me demande si Signal tente quelque chose de similaire
libsignal est implémenté en Rust, mais je ne sais pas grand-chose du reste
Il y avait cette formule disant qu’ils fournissent par défaut du chiffrement de bout en bout à 3 milliards de personnes, mais il y a aussi eu des infos disant qu’ils pouvaient lire les messages
Skype aussi était chiffré par défaut, mais cela pouvait être désactivé selon la configuration du serveur
La vraie question est de savoir si l’on peut faire confiance à Meta pour ne pas regarder les données
Il est ironique que Meta soit si actif sur d’autres sujets tout en ne bloquant pas le phishing ni les arnaques aux cartes prépayées
Le fait que l’adoption de Rust ait fortement réduit le nombre de bugs est impressionnant
Le C++ comporte quantité de comportements indéfinis (UB), alors que Rust les bloque structurellement
Grâce à son système de types puissant, la fiabilité s’en trouve nettement améliorée