TEMES

Meltdown, Spectre i l’execució fora d’ordre

Durant aquest inici d’any ha saltat la notícia d’un nou error en els processadors d’Intel (i AMD, i ARM) que pot provocar que un usuari maliciós pugui robar dades d’un ordinador.

Durant aquest inici d’any ha saltat la notícia d’un nou error en els processadors d’Intel (i AMD, i ARM) que pot provocar que un usuari maliciós pugui robar dades d’un ordinador. Resumint i simplificant molt, es pot aprofitar que el processador s’avança a executar instruccions que potser després no caldran per injectar-hi codi maliciós i poder accedir a parts de la memòria que no hauria de poder. Aprofitaré aquesta vulnerabilitat per portar-vos aquí una petita explicació de què és l’execució fora d’ordre i l’execució especulativa dels processadors actuals.

La feina d’un processador és, bàsicament, anar executant les instruccions de les quals consta un programa, que no és més que una llista ordenada de totes les instruccions que s’han de fer. Aquestes instruccions són, de forma general i pel que ens interessa aquí, de dos tipus:

  • fer un càlcul o una acció simple: “suma 1 a la variable A”, “posa un 5 a la variable B”, etc.
  • compara una condició i salta a una altra instrucció: “Si A val 0, vés a la instrucció endavant que fa 6”, “Si B val 10, torna a la instrucció 5”

Agafem un exemple senzill. Mirem el programa a continuació:

1. C 

Aquest programa fa uns càlculs senzills sobre dues variables (A i B) i guarda els resultats a les variables C i D (línies 1 i 2). Si la variable D val 2 (línia 3) llavors la variable C passa a valer 2 (línia 6) i si no ho és, la multiplica per 2 (línia 4).

Ara cal tenir en compte que diferents instruccions requereixen temps diferents del processador per executar-les, així, i per exemple normalment una instrucció de resta costa menys que una divisió.

Què passa amb el codi que tenim? Doncs si ens ho mirem bé, veurem que la instrucció 1. no cal fer-la, ja que només si la variable D val cert valor caldrà fer el càlcul1. Els processadors moderns veuen aquests casos, i reorganitzarien el codi de manera que la instrucció 1. aniria després de la instrucció 3. i abans de la 4. (que és quan fa realment falta). D'això se'n diu execució fóra d'ordre, ja que com veiem, el processador executa les instruccions seguint un ordre diferent al que nosaltres hem escrit.

A més, els processadors actuals poden executar més d’una instrucció alhora, i n’hi diuen superescalars. Quan un processador pot fer diverses coses alhora, la cosa es complica, però bàsicament consisteix en el mateix: veure què es pot fer de les instruccions següents per “avançar feina” i ja tenir-la feta quan toqui executar-la.

Quina altra optimització es fa dins els processadors? Doncs, encara que soni estrany, aprofitar que es poden executar vàries instruccions alhora per executar les dues branques d’execució possible (en el nostre exemple s’intentaria executar les instruccions 4. i 6. abans de veure quina és la que cal fer). Després, quan la instrucció 5 ens digui quina de les dues branques s’havia d’agafar, s’elimina el resultat de l’altre. Això se’n diu execució especulativa i és present a moltíssims processadors actuals.

I aquí és on entren les vulnerabilitats Meltdown i Spectre: resulta que quan el processador fa aquesta optimització d’executar les dues branques alhora, en alguns casos i condicions, no es comprova que el codi que s’executa tingui els suficients permisos per poder-los fer.2 

L’error és molt subtil i ha passat desapercebut durant més de 20 anys, però és mot greu, ja que afecta molts processadors que estan arreu i que permet que un programa qualsevol pugui accedir les dades d’un altre programa (contrasenyes, claus de bancs, dades personals, dades bancàries, etc.) que estigui funcionant a l’ordinador. Per sort, els desenvolupadors dels sistemes operatius han trobat ben rapidament solucions per evitar que això pugui passar, fent que els processadors no puguin fer totes aquestes optimitzacions i, per tant, es perd un cert rendiment que encara s’està valorant.

Per acabar, aquesta mena d’optimitzacions permeten que els nostres ordinadors tinguin una potència molt superior a la que tenien ordinadors de fa pocs anys, mantenint uns preus econòmics, tot i que en aquesta ocasió ens ha jugat una mala passada en temes de seguretat. Un altre dia parlarem de fins a on poden arribar els processadors actuals i la Llei de Moore.

Per saber-ne més

Notes

  1. Aquest cas un compilador modern ho hagués detectat i canviat el codi, però estem fent un exemple senzill per entendre-ho tots.
  2. Altre cop simplificant perquè s’entengui

Contacta amb Divulcat