Red Hat es consciente de un nuevo problema de implementación de hardware de microprocesador (microarquitectura) similar a Spectre y Meltdown que afecta los microprocesadores x86 fabricados por Intel.
Atacantes sin privilegios pueden usar esta falla para eludir las restricciones de seguridad de la memoria a fin de obtener acceso a los datos almacenados en ella y que de otro modo serían inaccesibles. Hay tres piezas en esta vulnerabilidad. La primera afecta solo a los enclaves seguros de Intel «SGX» y se mitiga mediante actualizaciones de microcódigo independientemente del sistema operativo. Las otras dos piezas requieren mitigaciones a nivel de software realizadas por sistemas operativos e hipervisores. La mitigación completa del posible ataque de máquinas virtuales invitadas que no son de confianza en un entorno que utiliza la virtualización requerirá una acción específica por parte de un administrador del sistema.
CVE-2018-3620 es el identificador CVE asignado a la vulnerabilidad del sistema operativo para este problema. CVE-2018-3646 es el identificador CVE asignado al aspecto de virtualización de la falla. Este problema se conoce como L1 Terminal Fault (L1TF) por gran parte de la industria y como «Foreshadow» por los investigadores de seguridad.
La vulnerabilidad de L1 Terminal Fault (L1TF) permite a un atacante evitar los controles de seguridad de acceso a la memoria comúnmente impuestos y administrados por el sistema operativo o hipervisor. De esta manera, se puede leer cualquier posición de memoria física almacenada en el caché L1 del procesador. Normalmente, las «tablas de páginas» gestionadas por el sistema operativo y el hipervisor proporcionan información al procesador sobre qué posición de memoria deberían ser accesibles para una aplicación, el kernel del sistema operativo y las instancias de máquinas virtuales invitadas. Estas tablas de páginas están formadas por entradas de la tabla de páginas (PTEs) que incluyen un bit «presente» que indica la validez. Al explotar L1TF, un atacante abusa de la lógica del procesador Intel que reconoce PTE válidas.
La memoria caché de datos L1 (normalmente de 32 KB de tamaño) es el primer nivel de una jerarquía de memoria de procesador rápido que contiene copias de datos que también se guardan en los chips de memoria principal externos (al procesador). Los cachés son utilizados como memoria por los programas, y típicamente se separan en múltiples niveles. Un caché pequeño y rápido de nivel más alto (L1) está más cerca de las unidades funcionales del procesador que realizan los cálculos reales dentro de un programa, mientras que los cachés progresivamente más grandes y más lentos se encuentran conceptualmente más alejados. El L1 se comparte entre dos hyperthreads iguales dentro de un núcleo de procesador Intel. Cada núcleo también tiene un caché L2 ligeramente más grande. El L3 (también llamado LLC o Caché de último nivel) es compartido por todos los núcleos dentro del procesador y es mucho más grande (por ejemplo, 32 MB). Los datos se mueven desde la memoria, a la L3, y hacia la L1 cuando se usa.
Los accesos a la memoria caché dentro del chip del procesador están ordenados en función de la magnitud de velocidad que sale de la memoria principal, por lo que se utilizan para mejorar significativamente el rendimiento. La memoria caché también se rellena como un efecto secundario de las operaciones realizadas durante la ejecución especulativa o en la ejecución fuera de orden. Como resultado de esta diferencia relativa en el rendimiento de las memorias caché en comparación con la memoria, es posible que el código de software malicioso pueda deducir actividad de la memoria caché. Esto se conoce como análisis de canales laterales, y fue popularizado por Meltdown y Spectre. En esas vulnerabilidades, como en L1TF, se pueden crear secuencias de software específicas, conocidas como «gadgets» que explotan un procesador vulnerable para causar actividad de caché observable durante la especulación.
L1TF es similar a Meltdown, de modo que explota la forma en que los procesadores vulnerables implementan una forma de ejecución especulativa, en este caso durante la búsqueda de tablas de páginas. El procesador está diseñado para producir el rendimiento más agresivo posible, por lo que se especula que las entradas de la tabla de páginas son válidas y permiten el acceso a la ubicación de memoria subyacente antes de completar las comprobaciones de validez necesarias. El procesador buscará de manera preventiva su caché de datos L1 en busca de cualquier bit de coincidencia de direcciones físicas en la entrada de la tabla de páginas, reenviando cualquier coincidencia a operaciones especulativas dependientes. Después de un tiempo, el procesador detectará que la entrada de la tabla de páginas no es válida y señalará un «error de terminal» interno. El procesador arrojará los resultados especulados previamente, pero el impacto observable sobre la memoria caché permanece.
Hay dos patrones de ataque contra los cuales los usuarios finales necesitarán protegerse: un usuario malicioso en un sistema que lee datos en el sistema físico o un sistema operativo huésped malicioso o un contenedor que accede a la información de otros invitados o del servidor. Esta vulnerabilidad es similar a CVE-2017-5754 (también conocida como «Meltdown») pero aprovecha una interacción entre la Unidad de administración de memoria (MMU) y el caché de datos L1 bajo especulación al realizar una traducción de direcciones de memoria virtual a física. Las mitigaciones existentes para las vulnerabilidades microarquitecturales previas («Meltdown», también conocido como «Variant 3») no son suficientes para protegerse contra esta nueva vulnerabilidad.
Red Hat recomienda a los clientes que tomen medidas correctivas, incluida la habilitación manual de parámetros específicos del kernel o características potenciales de desactivación como Intel Hyper-Threading, después de que se hayan aplicado las actualizaciones disponibles. Se pueden encontrar más detalles en la sección Mitigaciones de este artículo.
Información de contexto
Los sistemas operativos modernos implementan un esquema de ‘memoria virtual’ para usar eficientemente la memoria principal disponible en múltiples tareas / procesos. Los sistemas físicos tienen cantidades fijas de memoria principal que forman el espacio de direcciones físicas. Este espacio de direcciones se divide en unidades administradas más pequeñas conocidas como páginas (por ejemplo, 4 KB). El sistema operativo crea espacios de direcciones virtuales para cada programa en ejecución (conocido como un proceso). Cada dirección virtual se traduce a una dirección física subyacente utilizando una pieza especial de hardware dentro del procesador, conocida como Unidad de administración de memoria (MMU). Cuando un procesador planifica un programa para su ejecución, sus instrucciones y datos se mapean en direcciones virtuales. Los programas usan direcciones virtuales para hacer referencia de posiciones de memoria. La MMU del procesador usa un concepto conocido como “Paging” para realizar la traducción entre direcciones virtuales y sus direcciones subyacentes de memoria física asignada.
La técnica “Paging” traduce cada dirección virtual a una dirección física mediante el uso de estructuras jerárquicas de “Paging” conocidas como tablas de páginas. Estas traducen partes de la dirección virtual utilizando bits de la dirección como índices en componentes de las tablas de página. Las tablas de páginas se crean a partir de registros / entradas de tamaño fijo que contienen una dirección física que apunta a otra entrada de estructura de “Paging” o a la página de memoria mapeada. Junto con la dirección física, una entrada de estructura de “Paging” también contiene varios bits de atributo sobre la dirección física. Estos incluyen un bit que indica si la página está presente (P flag) en la memoria física o no (intercambiada). La lógica MMU del procesador debe ignorar una entrada de tabla de páginas marcada como no presente.
Entrada de estructura de página
El Manual de desarrolladores de software de Intel (Volumen 3, Capítulo 4) define las estructuras de búsqueda de hardware utilizadas por los procesadores Intel, incluida la Entrada de tabla de páginas (PTE) de 64 bits utilizada para almacenar la dirección física durante una traducción de direcciones virtuales a físicas.
Durante la traducción de direcciones, el procesador recorrerá las estructuras de la tabla de páginas, llegando finalmente a una entrada de la tabla de páginas que contiene una posible traducción física para una dirección virtual en particular. Este proceso de traducción de dirección finaliza cuando la dirección virtual se resuelve en un marco de página mapeado en la memoria física o cuando una entrada de estructura de “Paging” indica que el marco de página requerido no está presente (P flag(bit zero) = 0) en la memoria principal o tiene bits reservados establecidos El acceso a la dirección física desde dicha entrada da como resultado la excepción de falla de página (también conocida como » Terminal Fault»).