Comment un bogue de pilote graphique sur le Samsung Galaxy S6 a fui les données de l'onglet Google Chrome

Vers la fin du mois de mars, une start-up basée au Royaume-Uni, spécialisée dans les tests de fiabilité du processeur graphique, nous a contacté avec un bogue du processeur graphique qui a provoqué le redémarrage du Qualcomm Snapdragon 845 Samsung Galaxy S9 / S9 + lors de la consultation d'une page Web. La société, GraphicsFuzz, a collaboré avec nous pour signaler le problème à Qualcomm et à Samsung. Certains de nos lecteurs souhaitaient savoir comment une entreprise telle que GraphicsFuzz parvient à détecter ces vulnérabilités. Nous avons donc collaboré avec l'entreprise pour montrer comment elle avait découvert une vulnérabilité plus ancienne du processeur graphique. Cette vulnérabilité déjà corrigée permettait à un attaquant de "surveiller" à distance le contenu des onglets du navigateur Google Chrome sur le Samsung Galaxy S6.

Cet utilisateur consultait le site Web de sa banque avant de consulter la page Web malveillante. Le contenu a été capturé et téléchargé sur un serveur distant. Source: GraphicsFuzz.

Comment GraphicsFuzz trouve les bugs du GPU

Un pilote graphique fonctionne en prenant un programme de shader et en l'envoyant au GPU pour qu'il soit exécuté et restitue ainsi l'image. Avant d'envoyer le shader au GPU, le pilote graphique le traduit en une forme que le GPU peut comprendre. une traduction incorrecte peut entraîner un échec du rendu, des blocages de programmes ou de périphériques, des images erronées et même des problèmes de sécurité. GraphicsFuzz dispose d'une suite de tests automatisés qui leur permet de trouver ces bogues sur la base d'un ensemble de shaders de référence. Lorsqu'un utilisateur exécute son test, toutes les images résultantes doivent être identiques. Toute image qui semble différente signifie qu'il y avait un bug.

Résultats de plusieurs appareils populaires exécutant la suite de tests GraphicsFuzz. Le Samsung Galaxy S6, le Samsung Galaxy S7 et le Samsung Galaxy S8 sont inclus dans ces graphiques. Source: GraphicsFuzz.

Pour le Samsung Galaxy S6, GraphicsFuzz a découvert que les images de l'une des rangées montraient des images censées figurer dans une autre table. Cela signifie que les images des tests précédents se sont infiltrées dans les tests ultérieurs. L'équipe a ensuite relancé la suite de tests dans Google Chrome et a découvert que des parties de la page Web apparaissaient dans l'image. En outre, ils ont constaté que l’ouverture d’un autre onglet faisait que l’image montrait des parties d’autres onglets. Essentiellement, ce bogue a permis à un onglet Google Chrome de divulguer des informations sur un autre onglet Chrome! L'équipe derrière GraphicsFuzz ne cherchait pas intentionnellement des problèmes de sécurité, mais ils ont fini par en trouver un à la suite de leurs tests. (Il convient de noter que l'équipe a reproduit le bogue du navigateur Samsung sur le Galaxy S6 ainsi que de Mozilla Firefox.)

Comment fonctionne le bug

Image utilisée pour déclencher le bug de longue date sur le Samsung Galaxy S6. Source: GraphicsFuzz.

La page Web «malveillante» créée par GraphicsFuzz utilise WebGL pour tenter de dessiner une scène d'espace dans un canevas, comme indiqué ci-dessus. La couleur de chaque pixel est déterminée par un fragment shader, programme fourni par la page Web à exécuter sur le GPU. Le framework GraphicsFuzz a modifié le fragment shader, ce qui l’a fait fonctionner très longtemps. Lorsqu'un shader est exécuté trop longtemps, le navigateur ou le système d'exploitation interrompt généralement le rendu. Toutefois, bien que le GPU ait abandonné le rendu après avoir dessiné quelques pixels, le pilote du GPU n'en a pas informé Google Chrome. (Si vous regardez l'image en haut de l'article montrant la mémoire vidéo usée, vous pouvez réellement voir des parties de la scène spatiale en haut à gauche.) Cela signifie que les pixels qui ont été rendus avant l'abandon sont laissés intacts, ce qui signifie que l'image rendue finale est principalement une mémoire vidéo usée. Étant donné que la mémoire vidéo est utilisée en permanence pour restituer d'autres pages Web, les données «parasites» contiennent en réalité les rendus précédents d'autres pages Web. Ainsi, d’autres pages Web finissent par être affichées sur la page Web «malveillante». Fondamentalement, WebGL permet à la page Web de capturer le contenu de tout ce qui est rendu; cette image est ensuite téléchargée sur un serveur distant.

Schéma expliquant le bogue de longue date du GPU provoquant la «fuite» des données de l'onglet Chrome. Source: GraphicsFuzz.

Google Chrome utilise plusieurs processus, de sorte que différents onglets sont souvent isolés, ce qui rend cet exploit impossible en surface. Cependant, Chrome interagit avec le processeur graphique en utilisant un seul "processus GPU", ce qui signifie que tous les onglets partagent la même mémoire GPU, permettant ainsi à cet exploit de fonctionner. Le diagramme ci-dessus montre cela plus en détail.

Le bogue est démontré dans cette vidéo pendant les 22 premières secondes. D'autres problèmes de sécurité détectés par GraphicsFuzz sont également illustrés.

Leçons à apprendre

Un GPU défectueux peut contourner toutes les mesures de sécurité de Google Chrome et d'Android, car WebGL permet à toute page Web malveillante d'envoyer du code au GPU pour exécution. Google ne peut pas corriger les problèmes de GPU car la société ne contrôle pas le matériel et les pilotes. Dans ce cas, il appartient au fournisseur de GPU (dans ce cas, ARM) de corriger le bogue et au fabricant OEM dont les périphériques sont concernés (dans ce cas, Samsung) d’intégrer le correctif dans une mise à jour. Ajoutez des opérateurs à la combinaison et il est facile de voir comment un bogue comme celui-ci peut prendre un temps très long à résoudre - il a fallu au moins cinq mois à la plupart des utilisateurs de Samsung Galaxy S6 pour recevoir le correctif.

GraphicsFuzz aide les éditeurs de GPU à détecter les bogues difficiles à détecter, tels que les bogues de mauvaise compilation qui entraînent la génération et l’exécution du code erroné sur le GPU. Leur framework de test automatisé leur permet de trouver des bogues tels que celui présenté dans cet article. La longue boucle provoquée par la page Web «malveillante» s'est également avérée causer des problèmes sur d'autres appareils tels que le HTC One M7 et, plus récemment, le Samsung Galaxy S9. GraphicsFuzz teste les smartphones phares et publie un tableau de résultats qui classe ces périphériques en fonction de leurs performances sur un sous-ensemble de leurs tests. Des centaines de plantages et d'erreurs de rendu ont été constatés au cours de leurs tests, mais la plupart ne font pas l'objet d'une enquête pour déterminer s'ils constituent une menace pour la sécurité. Cependant, comme le montre cet exploit, un GPU défectueux constitue un risque pour la sécurité et il est possible qu'une ou plusieurs vulnérabilités de sécurité critiques attendent d'être découvertes. GraphicsFuzz espère que les fabricants de processeurs graphiques accordent la priorité à l'amélioration de la qualité des pilotes dans le futur.

Fiabilité comparative des pilotes graphiques, triée selon le nombre total de problèmes. Source: GraphicsFuzz.

Calendrier de divulgation

  • En décembre 2016, GraphicsFuzz a signalé le problème au gestionnaire de bogues de Google Chromium, car il était éligible au programme de récompense Chrome. Une fois que GraphicsFuzz a soumis le bogue au gestionnaire de bogues de Google Chromium, celui-ci a accepté le bogue et l'a transféré à ARM et à Samsung pour l'application de correctifs.
  • Google a transmis le rapport à des contacts chez ARM et Samsung.
  • Samsung a silencieusement corrigé le bogue et intégré le correctif dans la mise à jour Android 7.0 Nougat publiée entre mars et juin 2017. Bien qu'aucun Samsung CVE n'ait été créé par Samsung, Google ou ARM, ni Samsung ni ARM n'ont publié d'informations sur le correctif., notez que GraphicsFuzz n’a pas signalé le bogue via le processus approprié.
  • Plus tard, GraphicsFuzz a pu confirmer que Samsung et ARM avaient tous deux vu le rapport et qu'ARM pouvait résoudre le problème en raison du rapport.
  • En août 2017, GraphicsFuzz a été récompensé de 2 000 $ par Google pour le rapport de bogue.
  • En novembre 2017, le rapport de bug a été rendu public.