Un article récent a incité à la préparation de ce document "Un bug du pilote de la carte vidéo peut révéler ce qui a été vu en mode navigation privée ." Cet article est né après la publication de la manière triviale d'afficher une image appartenant à tout processus (y compris terminé), pouvant même prétendre à protéger des informations.Étant donné que je suis également impliqué dans le développement de pilotes graphiques, par hasard, j'essaierai d'expliquer brièvement en quoi l'auteur du rapport de bogue original a tort, la responsabilité de ce problème est liée à, et comment il peut être résolu.
Quel que soit le système d'exploitation, ses API système associées et les interfaces d'application pour développer des applications graphiques, un pilote de carte vidéo arbitraire résout les tâches suivantes à l'échelle du système:- Initialisation du contrôleur d'affichage ( paramétrage du mode vidéo, gestion des ports GPU, formation d'une / plusieurs images indépendantes, ... );
- Gestion de la mémoire adressable ( files d'attente de commandes, adressage linéaire / tuile, allocation de surface, tables de traduction d'adresses, extension d'ouverture PCI, ... );
- Accélération 2D ( curseur, couches matérielles, touches alpha / chroma, ROP, primitives, ... );
- Accélération 3D ( OpenGL, OpenGL ES / EGL, OpenVG / EGL, OpenCL, Open * );
- Décodage vidéo / lecture audio / soustraction EDID / compression du tampon d'image, ...
Les approches de la solution des tâches appliquées à chaque étape se sont longtemps réduites à des pratiques établies. Cela explique simplement la reproductibilité du problème indiqué sur les appareils de différents fabricants. Pour l'avenir, je peux dire que vous pouvez obtenir un effet similaire sur les contrôleurs Intel. L'auteur du rapport de bogue a été déterminé avec une précision absolue dans le cadre de la solution à laquelle le problème se pose - la gestion de la mémoire adressable.
Gestion de la mémoire
La principale entité que le conducteur exploite à ce stade est la surface. Une surface est généralement appelée un morceau continu de vidéo ou de RAM utilisé pour former une image par une application. Pour les contrôleurs qui n'ont pas leur propre mémoire, une ressource allouée à partir de la RAM peut devenir adressable via une table de traduction d'adresses (Graphics Translation Table, GTT). Sinon, l'image ne peut être affichée que lors de la copie de la surface dans la mémoire vidéo, soit au moyen du contrôleur DMA, le cas échéant, soit en raison des ressources du processeur.En fait, même les contrôleurs avec leur propre mémoire discrète dans la plupart des cas l'adressent également via GTT, car de cette façon, il est possible de créer un espace d'adressage virtuel par analogie avec le processeur central TLB pour fournir un adressage linéaire ou en mosaïque. La méthode d'adressage dans chaque cas détermine le pilote et il n'y a pas de différence fondamentale entre eux dans le cadre de cet article.Exemple d'adressage de tuiles dans la mémoire vidéo de l'article source Le pilote du contrôleur graphique est l'interface entre le système d'exploitation et la fonctionnalité GPU, rien de plus. Toutes les tâches visant à assurer la protection des informations sont attribuées à tout niveau supérieur responsable. Pour cela, les pilotes ont toutes les fonctionnalités disponibles, il y aurait un désir de l'utiliser.Ainsi, à la demande d'un pilote client, le système d'exploitation lui réserve (alloue) un ensemble de surfaces. Étant donné que, selon l'auteur, la fragmentation de l'image est relativement rare, nous pouvons affirmer que l'adressage de tuiles n'est pas souvent utilisé dans ces cas. Avec l'adressage linéaire, chaque surface est caractérisée principalement par un décalage par rapport au début de l'espace d'adressage virtuel de la mémoire du contrôleur. lors de l'allocation de mémoire, le pilote renvoie au SE exactement cet offset, ce qui correspond à un bloc de mémoire libre pouvant accueillir la surface avec les caractéristiques demandées par le logiciel d'application. Dans ce cas, le pilote effectue uniquement les actions suivantes: modifie GTT pour une utilisation ultérieure des pages de mémoire virtuelle, surveille la conformité aux exigences d'alignement des adresses physiques,définit le mécanisme d'accès des logiciels d'application à la surface (ouverture PCI / GPU, par adresse physique en dehors de l'ouverture, extension GTT à la volée), réserve une partie de la mémoire à ses propres besoins.Sur la base de ce qui précède, nous pouvons conclure que, ayant des informations sur la quantité totale de mémoire de contrôleur disponible et les caractéristiques de surface requises, la détermination du décalage pour tous les contrôleurs peut être résolue de manière uniforme. En pratique, c'est le cas (guidé par l'expérience avec divers systèmes d'exploitation de type Unix): le système d'exploitation fournit un service système / bibliothèque qui stocke une liste des blocs de mémoire déjà utilisés et vous permet de calculer rapidement le premier décalage disponible pour la sauvegarde logique dans cette bibliothèque. Dans le même temps, ayant des informations du pilote sur le mécanisme d'accès au bloc de mémoire, le système d'exploitation permet généralement de former un logiciel d'application aux mêmes adresses physiques de surfaces partagées / entrecroisées.Si le pilote ne contrôle pas explicitement les surfaces, comment l'accélération est-elle mise en œuvre?. - , , ( ), .
( ) , ( ), .
Revenir au problème d'origine
Certes, à ce stade, beaucoup ont déjà deviné à quoi se résume la critique. Lors de l'exécution de diverses applications, le système d'exploitation demande à leurs besoins des surfaces à partir du pilote vidéo et les réutilise lorsque la mémoire devient libre (arrêt du processus). Dans le même temps, le pilote ne peut pas savoir qu'un bloc de mémoire nécessite une réinitialisation immédiate, car il a certaines exigences de sécurité et n'a pas d'autres liens. La remise à zéro de la mémoire elle-même est une tâche triviale de matériel remplissant un rectangle.En fait, le test écrit pour publier le rapport de bogue est redondant. Dans le cas général (lorsque la mémoire vidéo s'insère dans une ouverture PCI / GPU), aucune API d'application n'est requise pour les systèmes de type Unix. Il suffit de contacter / dev / mem en utilisant l'offset connu de la sortie de l'utilitaire «lspci».Pour les contrôleurs Intel, la situation est différente, mais pas beaucoup. Étant donné que le contrôleur n'a pas sa propre mémoire, GTT est formé à la volée avec l'allocation de mémoire à partir de la RAM. Lors de la réallocation de la surface, il se peut qu'il ne soit pas chanceux avec l'emplacement réel du bloc RAM, étant donné que dans ce cas, le mécanisme d'adressage virtuel du système d'exploitation joue déjà un rôle décisif.Il existe plusieurs solutions, et je pense que les conclusions seront évidentes:- Tous les fabricants de pilotes doivent implémenter une fonctionnalité redondante pour stocker des informations sur les surfaces existantes (la question du contrôle des surfaces partagées reste ouverte );
- Le système d'exploitation doit surveiller la nécessité pour telle ou telle application de ranger ( c'est soit un certain marquage des surfaces protégées, soit une remise à zéro excessive de toutes les surfaces à la fois en RAM et en mémoire vidéo );
- Le logiciel d'application doit se nettoyer correctement après lui-même, car il prétend être impliqué dans la sécurité de l'information.
J'espère que la note était intéressante.