- La combinaison des Boosts du navigateur Arc et de règles Firestore problématiques permettait à un attaquant d’associer au compte d’une victime un Boost contenant du JavaScript arbitraire
- L’utilisation de Firebase Authentication et de Firestore a été confirmée par hooking Frida, révélant le flux d’accès aux collections
preferences,users,user_referralsetboosts - La faille venait du fait que la cible d’application d’un Boost était déterminée par
creatorID, alors même qu’un attaquant pouvait remplacer lecreatorIDde son propre document Boost par l’ID d’un autre utilisateur - L’ID de la victime pouvait être obtenu via
user_referrals, lesboostSnapshotsde Boosts publics, des Easels partagés, etc. ; lorsque la victime visitait le site ciblé, le Boost malveillant pouvait s’exécuter - The Browser Company a publié un correctif et versé une récompense de 2 000 $ ; après l’attribution de CVE-2024-45489, l’entreprise a décidé de réduire son usage de Firebase, de mener des audits de sécurité et de lancer un programme de bug bounty
Les fonctionnalités cloud d’Arc et l’utilisation de Firestore
- Arc nécessitait un compte pour être utilisé, et le processus d’inscription a confirmé l’usage de Firebase Authentication
- Les premières observations réseau ne montraient pas d’autres requêtes, mais l’examen de la fonction de partage des Easels a révélé une possible utilisation de Firestore
- Les Easels sont une interface de type tableau blanc qui peut être consultée sur le web lorsqu’elle est partagée avec d’autres personnes
- Firestore est un service de database-as-a-backend permettant de créer des fonctionnalités sans backend distinct, grâce à des règles de sécurité de base de données et à un accès direct depuis le client
- Un cas précédent de règles de sécurité Firestore insuffisantes est lié à Firewreck
Comment les appels Firebase ont été confirmés
- Comme le SDK Swift de Firebase a tendance à ne pas respecter les paramètres de proxy système, les appels associés ont été dumpés avec un script Frida plutôt qu’avec mitmproxy
- Le script hookait les appels Firestore de classes Objective-C
FIRCollectionReference["- documentWithPath:"]FIRQuery["- queryWhereField:isEqualTo:"]FIRFirestore["- collectionWithPath:"]- des méthodes d’exécution comme
getDocuments,addSnapshotListener:,getDocument - des méthodes d’écriture de documents de la famille
updateDataetsetData
- Pendant l’exécution d’Arc, les types de chemins et de requêtes Firestore suivants ont été observés
preferences/{userID}preferences/{userID}/stringValues/...users/{userID}- requête sur
user_referralsavecinviter_id == {userID} - requête sur
boostsaveccreatorID == {userID}
- Cette structure montrait qu’Arc stockait dans Firestore certains paramètres, l’objet utilisateur de base, les informations de parrainage et les Boosts
Pourquoi les Boosts sont devenus le vecteur d’attaque
- Les Arc Boosts sont une fonctionnalité permettant aux utilisateurs de personnaliser des sites web
- blocage d’éléments
- changement de police
- changement de couleurs
- CSS personnalisé
- JavaScript personnalisé
- Les Boosts sont stockés dans Firestore, et le navigateur Arc recherche les Boosts à appliquer via le champ
creatorID - L’attaquant a créé, depuis son propre compte, un Boost pour Google.com, puis a modifié certains paramètres du document Firestore pour faire des tests
- À cause de la requête basée sur
creatorID, il n’était pas possible de consulter directement les Boosts d’un autre utilisateur, mais il était possible de remplacer lecreatorIDde son propre document Boost par l’ID utilisateur d’un autre compte - Un test avec un autre compte a montré que, lorsque la machine de la victime accédait à Google.com, le Boost créé par l’attaquant était appliqué
Chaîne d’attaque et obtention de l’ID utilisateur
- Le déroulé final de l’attaque était le suivant
- obtenir l’ID utilisateur de la victime
- créer sur le compte de l’attaquant un Boost malveillant contenant le payload voulu
- remplacer le champ
creatorIDdu document Boost par l’ID de la victime - lorsque la victime visite le site web ciblé, le Boost malveillant s’exécute
- Cette vulnérabilité existait parce que les Arc Boosts peuvent contenir du JavaScript arbitraire, sont stockés dans Firestore et que la cible d’application est déterminée par le champ
creatorID - Il existait plusieurs moyens d’obtenir l’ID utilisateur d’une victime
user_referrals: lorsqu’une personne invite quelqu’un sur Arc ou reçoit une invitation/recommandation, l’ID utilisateur de l’autre personne peut être obtenu dans la tableuser_referrals- Boosts publics : les Boosts sans JavaScript peuvent être partagés, et les
boostSnapshotsdu site public Arc Boosts contiennent l’ID utilisateur du créateur - Easels : l’ID utilisateur pouvait aussi être obtenu via la fonctionnalité de tableau blanc partageable
Correctif et calendrier de divulgation
- The Browser Company ne proposait généralement pas de bug bounty, mais a versé 2 000 USD pour cette vulnérabilité
- La chronologie de la faille est la suivante
- 25 août, 17 h 48 : premier contact via Signal avec Hursh, cofondateur d’Arc
- 25 août, 18 h 02 : exécution d’une PoC de la vulnérabilité sur le compte Arc de Hursh
- 25 août, 18 h 13 : partage des détails sous forme chiffrée, puis ajout à un canal Slack
- 26 août, 21 h 41 : correction de la vulnérabilité et versement de la récompense
- 6 septembre, 19 h 49 : attribution de CVE-2024-45489
- Arc a ensuite publié son propre billet sur le sujet, CVE-2024-45489 incident response
Exécution sur des pages privilégiées et conflit avec la confidentialité
- Même si les Boosts ne pouvaient pas être créés côté client, ils pouvaient s’exécuter dans d’autres protocoles
- En créant un Boost ciblant la page
settings, il s’exécutait surchrome://settings, ce qui pouvait entraîner une élévation de privilèges - Lors de la visite d’un site, la requête Firestore suivante était déclenchée
- recherche dans la collection
boostsavec les conditionscreatorID == {userID}ethostPattern == "www.google.com"
- recherche dans la collection
- Ici,
hostPatterndésigne le site visité, ce qui entre en contradiction avec la politique de confidentialité d’Arc, selon laquelle Arc affirme ne pas savoir quels sites sont visités
Mesures prises ensuite par Arc
- À la suite de cette vulnérabilité et de l’introduction de nouvelles fonctionnalités, Arc a choisi de s’éloigner de Firebase
- Le résumé publié par Arc inclut les mesures suivantes
- confirmation de la correction du problème
- ajout d’une fonction permettant de désactiver les Boosts côté client
- audit interne des règles ACL Firebase actuelles
- mise en place d’un protocole de réponse aux incidents de sécurité
- Les mesures supplémentaires partagées dans les discussions internes d’Arc étaient les suivantes
- correction du problème de confidentialité dans la mise à jour v1.61.1
- arrêt de l’utilisation de Firebase dans les nouvelles fonctionnalités et les nouveaux produits
- audit de sécurité externe pour cette version
- lancement d’un programme de bug bounty pour les futures vulnérabilités
1 commentaires
Avis sur Hacker News
Je suis Hursh, cofondateur et CTO de The Browser Company, qui développe Arc. Aucun utilisateur n’a effectivement été touché et nous avons corrigé immédiatement, mais nous estimons que la gravité potentielle de cette vulnérabilité est inacceptable.
Nous avons détaillé ici les aspects techniques, nos plans d’amélioration à venir, notre sortie de Firebase et la mise en place d’un vrai programme de bug bounty : https://arc.net/blog/CVE-2024-45489-incident-response
Nous sommes vraiment désolés, à la fois pour la vulnérabilité elle-même et pour la communication tardive. Vos retours — déception, colère, encouragements compris — nous obligent à faire mieux.
Toute la réponse donne l’impression qu’ils ne réagissent que lorsqu’il y a suffisamment de bruit.
Je n’ai pas envie d’utiliser un navigateur conçu par une entreprise qui prend la sécurité de ses utilisateurs aussi à la légère. Je n’en suis pas certain, mais une faille d’une telle gravité se serait probablement vendue bien plus cher sur le marché noir.
Des vulnérabilités peuvent arriver, mais envoyer les données de navigation ressemble à un choix de conception délibéré.
À mon avis, c’est le genre d’affaire qui devrait entraîner la démission du CTO.
C’est une occasion en or de prendre la bonne direction.
Beaucoup de commentaires ici accusent Firebase, mais on dirait surtout que les gens répètent des choses qu’ils ne connaissent pas vraiment. Je n’utilise pas Firebase aujourd’hui, mais pour l’avoir déjà utilisé, ce n’est ni un cas limite ni un problème difficile à résoudre : c’est vraiment la base de la base.
Le vrai problème, c’est que l’API a été conçue pour faire confiance à une valeur par laquelle le client dit « voilà qui je suis ». Au final, c’est une erreur d’amateur, probablement corrigeable avec une modification d’une ligne. Rien qu’en lisant la documentation, https://firebase.google.com/docs/rules/rules-and-auth#cloud-... montre que
request.authfournit l’ID utilisateur nécessaire (request.auth.uid).Les règles de sécurité doivent être prises au sérieux : ce sont, en pratique, la seule ligne de défense.
Qu’on fasse l’authentification soi-même ou non, le principe clé reste le même : ne jamais faire confiance au client.
matchdefirestore.rules. C’est exactement le genre de chose qu’on trouve dans la documentation d’introduction à la sécurité de Firebase Firestore.J’ai beaucoup aimé le petit chat en pixel art qui accourt là où l’on clique. C’était un petit dispositif amusant et malin, comme on en voit rarement de nos jours, et ça rappelait que, si on le voulait, Internet pourrait aussi être ce genre d’endroit joyeux.
prefers-reduced-motionet ne l’affiche pas quand ce réglage est activé. C’est une excellente approche : du plaisir pour ceux qui en veulent, et pas de nuisance pour ceux qui n’en veulent pas.https://en.wikipedia.org/wiki/Neko_(software)
sudo apt install onekooneko &Parfait à offrir sur l’ordinateur d’un collègue absent.
D’après cet article, Arc exige un compte et envoie à Google Firebase le nom d’hôte de toutes les pages visitées ainsi que l’ID utilisateur. Dans ce cas, Arc ne devient-il pas le navigateur le moins respectueux de la vie privée parmi ceux utilisés aujourd’hui ?
C’est vraiment un bug magnifique. Les règles de sécurité des services backend comme Firebase ont des valeurs par défaut étranges, difficiles à expliquer. Si je concevais une API moi-même, le
userIdd’un enregistrement commeboostdans cet exemple ne viendrait pas du payload de la requête, mais serait défini à partir de l’ID utilisateur de la session.Un développeur d’un certain niveau n’aurait généralement même pas l’idée de laisser un client transmettre, sur une route d’API protégée, une valeur qu’il prétend être son propre
userId. En revanche, avec les règles de sécurité, il faut imaginer toutes les façons dont le système peut être détourné, indépendamment de la manière dont il a effectivement été programmé pour être utilisé.La bonne solution consiste probablement à appliquer des droits refusés par défaut à tous les champs. Ainsi, il faut au minimum déclarer explicitement que le champ propriétaire est modifiable, ce qui force aussi à réfléchir aux conséquences du transfert de cet objet à un autre utilisateur.
Je suis sidéré par le niveau d’absurdité de cette faille. Pour exécuter du code arbitraire, il suffisait littéralement d’envoyer l’ID utilisateur de quelqu’un d’autre, et cet ID était apparemment assez facile à obtenir.
Je ne travaille pas chez une FAANG, mais dans une entreprise qui fabrique un produit médiocre dont personne n’a vraiment besoin, et même moi je ne créerais pas un bug pareil. Et ces gens veulent fabriquer un navigateur, avec toute l’expertise sécurité et la responsabilité morale que cela implique ?
Il faudrait mettre Arc dans le titre du post, pour que les personnes qui l’utilisent ou qui connaissent des utilisateurs d’Arc puissent le repérer plus facilement.
Honnêtement, je pense vraiment que le titre devrait être du genre « Bug fondamental dans le navigateur Arc (CVE 123-4567) ».
Il existe beaucoup de failles de sécurité graves qui peuvent se comprendre, et qu’on peut pardonner si elles sont traitées et corrigées de manière responsable.
Mais ce n’est pas le cas ici. Personnellement, cela démontre un niveau d’incompétence capable de ruiner une réputation, au point de me convaincre de ne plus jamais utiliser Arc.
aug 25 5:48pm: premier contact avec Hursh, cofondateur d’Arc, via un canal chiffré Signalaug 25 6:02pm: exécution de la preuve de concept de la faille sur le compte Arc de Hurshaug 25 6:13pm: divulgation des détails sous forme chiffrée, puis ajout à un canal Slackaug 26 9:41pm: faille corrigée, prime verséesep 6 7:49pm: CVE attribuée (CVE-2024-45489)Quatre heures entre le premier contact inattendu et le déploiement du correctif, c’est plutôt bon, même en tenant compte du fait que la correction était probablement simple. Correction : la date a changé, donc c’était en réalité 28 heures. Cela reste correct, et la réaction « rejoins notre canal Slack » 30 minutes après le premier contact est très rapide.
Pour un produit aussi important et personnel qu’un navigateur, lever 50 à 60 millions de dollars et obtenir une valorisation de 500 millions sans modèle économique est un gros signal d’alerte. Ce n’est pas une œuvre caritative : quelqu’un finira par payer, d’une manière ou d’une autre.
C’est aussi dommage que Firebase ne rende pas ça un peu plus à l’épreuve des erreurs idiotes. Et vraiment, seulement 2 500 $ ? On pouvait littéralement prendre le contrôle de tous les utilisateurs d’Arc ; la NSA aurait sans doute ajouté quelques zéros.
Surtout quand des concurrents fonctionnels comme Supabase enveloppent un SGBD classique et un modèle d’authentification.
Merci pour le partage. J’utilise Arc depuis la première semaine de la bêta.
Mais le fait qu’ils n’aient mentionné ce bug et sa correction nulle part sur les réseaux sociaux est assez inquiétant. J’ai apprécié mon temps avec Arc, mais vu cette manière de gérer les choses, je ne pense pas pouvoir continuer à l’utiliser.
2 000 $ pour une faille aussi énorme, c’est insultant.
C’est peut-être parce qu’elles ne sont pas sanctionnées par les régulateurs en cas d’incident de sécurité.