Une petite expérience de vulgarisation sur le bug Meltdown, d’après
l’excellent résumé et le bout de code publiés
là.
Extrait de la page ci-dessus, pour les informaticiens :
; rcx = a protected kernel memory address
; rbx = address of a large array in user space
mov al, byte [rcx] ; read from forbidden kernel address
shl rax, 0xc ; multiply the result from the read operation with 4096
mov rbx, qword [rbx + rax] ; touch the user space array at the offset that we just calculated
Pour les non informaticiens :
Imaginez que vous êtes dans un grand bâtiment, vous avez quelques pièces à vous, et quelqu’un de puissant occupe les autres pièces. Chaque pièce est remplie de grandes étagères, chaque étagère est remplie de cartons, qui contiennent chacun un petit bout de papier où est noté un numéro secret dans l’intervalle [0, 42]. De plus tous les cartons du bâtiment sont numérotés sur les rabats supérieurs. Vous avez le droit de jouer avec les cartons qui sont dans vos pièces du bâtiment, de déplacer et regarder les petits bouts de papier, voire de les montrer à la fenêtre si ça vous amuse. Mais comme les étagères sont hautes, et que vous risquez de vous coincer les doigts en déplaçant les échelles, il y a un petit robot qui permet d’attraper les cartons et de déplacer leur contenu, il suffit de lui indiquer précisément ce que vous voulez faire, par exemple : recopier le bout de papier du carton numéro X et le mettre dans le carton numéro Y.
Vous jouez tranquillement avec vos cartons et vos petits bouts de papier, et puis un jour vous demandez au robot un numéro de carton qui n’est pas à vous. Comme il est parfaitement interdit que vous regardiez le contenu des cartons de l’autre occupant puissant du bâtiment, le petit robot qui vous apporte les cartons consulte toujours un gardien pour savoir si vous avez le droit de demander ce carton. Le gardien a une grande écritoire où sont notés les numéros des cartons et leur propriétaire. Il peut donc donner ou non l’autorisation. S’il dit non, le petit robot revient vous faire une remontée de bretelles. Mais il y a eu des compressions de personnel, et le gardien est très occupé. Pour ne pas tout ralentir, il s’est mis d’accord avec le robot : le robot commence le boulot sans savoir si vous avez le droit à ce carton ou pas, va chercher le carton de toute façon, et commence à faire ce que vous lui avez demandé avec son contenu. Pendant ce temps, et avant que vous puissiez faire quoi que soit d’autre, si jamais vous n’aviez pas le droit de regarder ce carton, le gardien a finalement eu le temps de consulter son écritoire, il prévient le robot, qui remet tout en place comme si de rien n’était… et vous fait une remontée de bretelles. Ça a l’air un peu bête (bien que “faire et défaire, c’est toujours travailler !”, comme disait ma grand-mère), mais la plupart du temps vous ne demandez que des cartons qui sont bien à vous, alors en général ça fait gagner du temps à tout le monde de commencer le boulot avant d’avoir vraiment l’autorisation.
Mais vous avez vraiment envie de connaître un secret de l’autre occupant puissant, écrit sur un petit bout de papier dans un de ses cartons auxquels vous n’avez pas accès. Et vous êtes très maligne ou malin. Vous avez aussi un petit nombre de cartons tout neufs un peu difficiles à ouvrir, ils sont encore très raides. Dès qu’ils auront été ouverts une fois, vous savez que ce sera plus facile. Vous les numérotez avec un gros marqueur, de 0 à 42. Vous imaginez l’expérience suivante : considérons un carton de numéro X
qui n’est pas à vous. Vous demandez au robot d’aller chercher le petit bout de papier dans ce carton de numéro X
, de regarder le secret qui y est inscrit (disons alpha
), et de mettre un bout de papier absolument quelconque dans le carton tout neuf numéroté alpha
. Comme vous n’avez pas le droit de demander le carton X
, à la fin le gardien ne donne pas l’autorisation, le petit robot remet tout en ordre et vous avez droit à une remontée de bretelles. Tant pis pour vous, raté ! Sauf que maintenant vous allez demander au robot de vous rapporter le contenu de chaque carton neuf, et vous le chronométrez soigneusement. Il y a un carton qui sera plus facile à ouvrir que les autres, parce que le robot y aura déjà eu accès. Et donc le robot mettra moins de temps à rapporter ce contenu que pour les autres cartons. En regardant le numéro que vous aviez écrit au marqueur sur ce carton, vous aurez le secret alpha
qui était écrit sur le petit bout de papier du carton de numéro X
qui n’était pas à vous ! Gagné !
Mise à jour pour continuer à filer la métaphore…
Quand je disais “vous” ci-dessus, c’était une manière d’incarner un logiciel de bas niveau, qui parle directement au matériel (le robot, le gardien…). Maintenant il faut imaginer que l’utilisateur le plus commun du grand-bâtiment-rempli-d’étagères-remplies-de-cartons-qui-contiennent-des-petits-papiers n’est pas du tout cet individu qui doit penser à tout et donner des ordres au robot.
Imaginons donc une autre personne A confortablement installée dans une de vos pièces, et qui vous donne des ordres plus abstraits. Par exemple : s’il vous plait, faites-moi la somme de tous les nombres écrits sur les papiers des cartons de l’étagère en haut à gauche. C’est à vous de donner tous les ordres de base nécessaires au robot (soit vous les inventez tout seul, soit vous les confiez à un autre bâtiment où les gens s’occupent de traduire ça en ordres de base, vous récupérez un bout de papier que vous exécutez fidèlement).
On peut même imaginer une autre personne, B, encore plus confortablement installée, et qui donne des ordres encore plus abstraits à A. Par exemple : apportez-moi le budget réalisé de cette année. A se débrouille pour traduire ça en calculs de sommes, et vous demande de faire ces sommes. Et ainsi de suite…
On peut aussi imaginer que le travail à réaliser arrive sous forme d’un livre que la personne Z se fait livrer. Z ouvre le livre, lit le contenu et donne des ordres à Y, qui donne des ordres à X, …., qui donne des ordres à A, qui vous en donne. Quand il récupère des résultats, il les envoie au livreur initial. Il faut être très très très malin pour arriver à provoquer l’expérience décrite plus haut, et à récupérer les résultats, grâce à un travail décrit dans un tel livre livré à Z qui ne se doute de rien. Mais il existe des gens comme ça.
On peut essayer de se protéger en demandant à Z de faire bien attention à ce qu’il lit et transmet à Y et indirectement à X, …, A, vous et le robot. On peut espérer qu’en faisant bien attention, il ne renverra jamais au livreur le fameux secret alpha
dont on parlait plus haut et qu’il ne devrait pas connaître. Mais tout le monde, de A jusqu’à Z, plus vous, a toujours considéré que le gardien ferait son boulot, tout au bout de la chaîne. Pour le moment, on peut déjà envisager de confisquer la montre de Z.