Diferencia entre revisiones de «Meltdown (vulnerabilidad)»

Contenido eliminado Contenido añadido
Tactica (discusión · contribs.)
m Erratas.
Tactica (discusión · contribs.)
m s/encolamiento/segmentación
Línea 28:
 
== Base de funcionamiento ==
Meltdown explota una [[condición de carrera]] inherente al diseño de muchas [[CPU]] actuales. Esta condición se da entre los accesos a la memoria y la comprobación de privilegios durante el procesamiento de [[ciclo de instrucción|instrucciones]]. Además, en combinación con un [[ataque de canal lateral]] al caché de la CPU, esta vulnerabilidad permite que un [[proceso (informática)|proceso]] se salte las comprobaciones habituales de nivel de privilegio que normalmente aislarían al proceso maligno e impedirían que accediese a datos que pertenecen al [[sistema operativo]] y otros procesos concurrentes. La vulnerabilidad permite que un proceso no autorizado lea información de cualquier dirección mapeada al espacio de [[memoria virtual|memoria]] del proceso actual. Dado que ella [[encolamientosegmentación de instrucciones]] reside en los procesadores afectados, la información de una dirección no autorizada casi siempre se cargará temporalmente en el [[caché de CPU|caché de la CPU]] durante la [[ejecución especulativa]], pudiendo posteriormente leerse desde el caché. Esto puede suceder incluso cuando la instrucción de lectura original falla debido a una comprobación de privilegios que da negativo, y/o cuando no produce un resultado legible.
 
Dado que muchos [[sistemas operativos]] [[memoria virtual|mapean]] la memoria física, los procesos del [[núcleo (informática)|núcleo]] y otros procesos del [[espacio de usuario]] en el espacio de direcciones de cada proceso, Meltdown permite que un proceso maligno pueda leer cualquier memoria mapeada física, del núcleo o de otro proceso, con independencia de si debería o no poder hacerlo. Las defensas contra Meltdown exigirían evitar el uso del mapeo de memoria de un modo que resultase vulnerable a tales amenazas (una solución basada en software), o bien evitar la condición de carrera subyacente (una modificación del [[microcódigo]] de la CPU y/o la ruta de ejecución).
Línea 92:
:* '''[[Anillo de protección|Los dominios de protección]] o anillos de protección''' - proporcionan un medio por el cual el [[sistema operativo]] puede controlar qué procesos están autorizados a leer determinadas áreas de la memoria virtual.<br />Puesto que la memoria virtual permite a un ordenador hacer referencia a una cantidad de memoria muy superior a la que puede contener físicamente, el sistema puede gozar de un aumento de velocidad considerable "mapeando" cada proceso y la memoria que utilizan &mdash;esto es, ''toda'' la memoria de ''todos'' los procesos activos&mdash; a la memoria virtual de ''cada'' proceso. En algunos sistemas toda la memoria física está también mapeada para ganar así todavía más velocidad y eficiencia. Normalmente esto se considera algo seguro, dado que el sistema operativo puede confiar en que los [[anillo de protección|dominios de protección]] de los que consta el propio procesador limitarán las áreas de la memoria a las que se permite acceder a cada proceso. Un intento de acceder a memoria autorizada tendrá éxito inmediatamente, mientras que un intento de acceder a memoria no autorizada causará una [[manejo de excepciones|excepción]] y declarará nula la instrucción de lectura, que devolverá un fallo. Tanto el proceso llamante como el sistema operativo pueden decidir lo que ocurre cuando se realiza un intento de leer de memoria no autorizada; lo habitual es que esto cause una condición de error y que se ponga fin al proceso que intentó llevar a cabo dicha lectura. Dado que las lecturas no autorizadas no suelen formar parte de la ejecución normal de un programa, resulta mucho más rápido usar este método en lugar de pausar el proceso cada vez que ejecute alguna función que requiera acceso a memoria privilegiada, para permitir que esa memoria se mapee a un espacio de direcciones legible.
 
:* '''[[EncolamientoSegmentación de instrucciones]] y [[ejecución especulativa]]''' - se utilizan para permitir que las instrucciones se ejecuten del modo más eficiente posible &mdash;si es necesario, permitiéndoles correr fuera de orden o en paralelo a través de las múltiples unidades de procesamiento de la [[CPU]]&mdash; siempre que el resultado final sea correcto.<br />Los procesadores modernos suelen contener múltiples [[unidad de ejecución|unidades de ejecución]] separadas, y un [[planificador]] que decodifica las instrucciones y decide, en el momento de ejecutarlas, la forma más eficiente de hacerlo. Esto puede suponer decidir que dos instrucciones pueden ejecutarse al mismo tiempo, o incluso fuera de orden, en unidades de ejecución diferentes (algo conocido como "encolamientosegmentación de instrucciones"). Mientras el resultado final sea el correcto, esto maximiza la eficiencia al hacer que se usen al máximo todas las unidades de ejecución del procesador. Algunas instrucciones, como los [[salto (informática)|saltos condicionales]], conducen a uno de dos resultados posibles dependiendo de una determinada condición; por ejemplo, podría realizarse determinada operación dependiendo de si un valor es 0, u otra si el valor es distinto. En ciertos casos la CPU puede no saber todavía qué ruta de ejecución (rama) tomar, y esto puede deberse a un valor que está sin cachear. En lugar de esperar a conocer la opción correcta, la CPU puede continuar su trabajo inmediatamente (ejecución especulativa), y para ello puede o bien adivinar la opción correcta (ejecución predictiva) o incluso tomar ''ambas'' (ejecución ansiosa). En caso de ejecutar la opción incorrecta, la CPU intentará descartar todos los efectos debidos a la suposición errónea. ''Véase también: [[predictor de saltos]]''
 
:* '''[[Caché de CPU|El caché de la CPU]]''' es una pequeña cantidad de memoria alojada en la CPU que se utiliza para garantizar el alto rendimiento del procesador, acelerar los accesos a memoria y facilitar la ejecución "inteligente" de instrucciones de un modo eficiente.<br />Desde el punto de vista de una CPU, el acceso a la memoria física del ordenador es muy lento. Además, las instrucciones que ejecuta una CPU suelen ser repetitivas, o se accede muchas veces a las mismas o similares direcciones de memoria. Para maximizar el uso eficiente de los recursos de la CPU, las CPUs modernas albergan en su interior una modesta cantidad de memoria conocida como "[[caché de CPU]]", de acceso muy rápido. Cuando se accede a información o cuando se lee una instrucción de la memoria física, una copia de esa información se guarda también en la caché de la CPU, de forma sistemática. Si posteriormente la CPU necesita acceder de nuevo a la misma instrucción o al mismo contenido de la memoria, puede obtener esa información en un tiempo mínimo de su propia memoria caché en lugar de tener que esperar a obtenerla de la memoria física, una operación que en comparación resulta mucho más lenta.