Prueba de vulnerabilidad de la CPU de Spectre y Meltdown y actualización del microcódigo en Linux
Introducción a las vulnerabilidades de Spectre y Meltdown en la CPU
Una forma de bloquear estos ataques es vaciar las cachés de memoria en determinados momentos, eliminando la información exfiltrada antes de que el atacante pueda acceder a ella. Vaciar la caché después de cada llamada al sistema probablemente bloquearía una amplia gama de ataques especulativos, pero también ralentizaría el sistema hasta el punto de que los usuarios buscarían la forma de desactivar el mecanismo. La seguridad de la información es muy importante, pero los costes son demasiado altos cuando el vaciado de las cachés de memoria reduce el precioso tiempo de producción.
Los ataques que utilizan la ejecución especulativa implican convencer al procesador para que especule en una ruta que la ejecución no especulativa no seguirá. Por ejemplo, una función del kernel puede contener una comprobación de límites que impedirá que el código acceda más allá del final de una matriz, lo que hará que se devuelva un error. Un ataque que utilice la vulnerabilidad Spectre se saltará esa comprobación de forma especulativa, accediendo a datos a los que el código fue escrito específicamente para no acceder. El retorno del error es una pista de que quizá esté ocurriendo algo inapropiado, pero para entonces, el daño ya estará hecho.
Cómo comprobar si tu servidor Linux es vulnerable a los fallos Spectre de la CPU
Spectre & Meltdown Checker es un script de shell que comprueba las siguientes CPUs Intel/AMD/ARM y otras en busca de fallos:
- CVE-2017-5753: evasión de la comprobación de límites (variante 1 de Spectre). Es necesario recompilar el software y el kernel con un compilador modificado que introduzca el opcode LFENCE en las posiciones adecuadas del código resultante. El impacto en el rendimiento de la mitigación es insignificante.
- CVE-2017-5715: inyección en el objetivo de la rama (variante 2 de Spectre). El impacto en el rendimiento de la mitigación depende de tu CPU.
- CVE-2017-5754: carga de la caché de datos falsa (Meltdown). Debes instalar la versión actualizada del kernel con los parches PTI/KPTI. Actualizar el kernel es suficiente. El impacto en el rendimiento de la mitigación es de bajo a medio.
spectre-meltdown-checker.sh es un sencillo script de shell para averiguar si tu kernel Linux (instalación) es vulnerable frente a los 3 CVE de «ejecución especulativa».
Instalación
El script debe ejecutarse como root como usuario root. Puedes ver el código fuente más abajo. Utiliza el programa wget o curl para obtener el código fuente en tu equipo Linux:
$ cd /tmp/
$ wget https://raw.githubusercontent.com/speed47/spectre-meltdown-checker/master/spectre-meltdown-checker.sh
O
$ git clone https://github.com/speed47/spectre-meltdown-checker.git
Resultados de ejemplo:
Clonando en ‘spectre-meltdown-checker’…
remoto: Contando objetos: 155, hecho.
remoto: Comprimiendo objetos: 100% (20/20), hecho.
remoto: Total 155 (delta 18), reutilizados 21 (delta 10), paquete reutilizado 125
Recibiendo objetos: 100% (155/155), 49,78 KiB | 145,00 KiB/s, hecho.
Resolviendo deltas: 100% (88/88), hecho.
Cómo comprobar la vulnerabilidad de Spectre y Meltdown en Linux
Ejecuta el script como usuario root utilizando sudo o su para comprobar la vulnerabilidad:
$ sudo sh spectre-meltdown-checker.sh
Ejemplos de salidas del escritorio de Ubuntu Linux:
Otra salida de mi servidor CentOS 7.x donde se parcheó Meltdown/Spectre v1 con el Kernel:
$ sudo sh spectre-meltdown-checker.sh
¿Cómo instalar/actualizar el microcódigo del firmware de Intel en Linux?
Un microcódigo no es más que el firmware de la CPU proporcionado por Intel o AMD. El kernel de Linux puede actualizar el firmware de la CPU sin necesidad de actualizar la BIOS en el momento del arranque. El microcódigo del procesador se almacena en la RAM y el núcleo actualiza el microcódigo durante cada arranque. Estas actualizaciones de microcódigo de Intel/AMD son necesarias para corregir errores o aplicar erratas para evitar fallos en la CPU. Esta página muestra cómo instalar la actualización del microcódigo de AMD o Intel mediante el gestor de paquetes o las actualizaciones del microcódigo del procesador suministradas por Intel en Linux.
Cómo averiguar el estado actual del microcódigo
Ejecuta el siguiente comando como root usuario:
# dmesg | grep microcode
Ejemplos de resultados:
Cómo instalar el firmware de microcódigo de Intel en Linux mediante un gestor de paquetes
La herramienta para transformar y desplegar la actualización del microcódigo de la CPU para x86/amd64 viene con Linux. El procedimiento para instalar el firmware de microcódigo de AMD o Intel en Linux es el siguiente
- Abre la aplicación terminal
- Usuario de Debian/Ubuntu Linux escribe: sudo apt install intel-microcode
- Usuario de Linux CentOS/RHEL escribe: sudo yum install microcode_ctl
Los nombres de los paquetes son los siguientes para las distros Linux más populares
- microcode_ctl y linux-firmware – Paquete de actualización de microcódigo de CentOS/RHEL
- intel-microcode – Paquete de actualización del microcódigo para Intel CPUS en Debian/Ubuntu y clones
- amd64-microcode – Paquete de actualización de microcódigo de Debian/Ubuntu y clones para CPUs AMD
- linux-firmware – Firmware de microcódigo de Arch Linux para CPUs AMD (se instala por defecto y no es necesaria ninguna acción por tu parte)
- intel-ucode – Firmware de microcódigo de Arch Linux para CPUs Intel
- microcode_ctl, linux-firmware y ucode-intel – Paquete de actualización del microcódigo de Suse/OpenSUSE Linux
Advertencia: En algunos casos, la actualización del microcódigo puede causar problemas de arranque, como que el servidor se cuelgue o se reinicie automáticamente en el momento del arranque. Hazlo bajo tu propio riesgo.
Ejemplos
Escribe lo siguiente comando apt/apt-get en un Linux Debian/Ubuntu para CPU Intel:
$ sudo apt-get install intel-microcode
Ejemplos de resultados:
Debes reiniciar la caja para activar la actualización del microcódigo:
$ sudo reboot
Verifícalo tras el reinicio:
# dmesg | grep 'microcode'
Si utilizas RHEL/CentOS intenta instalar o actualizar los dos paquetes siguientes mediante el comando yum:
$ sudo yum install linux-firmware microcode_ctl
$ sudo reboot
$ sudo dmesg | grep 'microcode'
¿Cómo actualizar/instalar el microcódigo descargado del sitio de Intel?
Utiliza el siguiente método sólo cuando te lo recomiende tu proveedor; de lo contrario, sigue los paquetes de Linux descritos anteriormente. La mayoría de los mantenedores de las distribuciones de Linux actualizan el microcódigo a través del gestor de paquetes. El método del gestor de paquetes es seguro, como han comprobado muchos usuarios.
¿Cómo instalar el blob de microcódigo del procesador Intel para Linux (versión 20180108)?
Visita el sitio de AMD o Intel para obtener el último microcódigo del firmware. Primero extráelo utilizando el comando tar:
$ mkdir firmware
$ cd firmware
$ tar xvf ~/path/to/file/microcode-20180108.tgz
$ ls –l
Muestra los resultados:
Asegúrate de que /sys/devices/system/cpu/microcode/reload sale:
$ ls -l /sys/devices/system/cpu/microcode/reload
Debes copiar todos los archivos de intel-ucode a /lib/firmware/intel-ucode/ utilizando el comando cp:
$ sudo cp -v intel-ucode/* /lib/firmware/intel-ucode/
Acabas de copiar el directorio intel-ucode a /lib/firmware/. Escribe la interfaz de recarga a 1 para recargar los archivos de microcódigo:
# echo 1 > /sys/devices/system/cpu/microcode/reload
Actualiza un initramfs existente para que la próxima vez se cargue a través del kernel:
$ sudo update-initramfs -u
$ sudo reboot
Verificar que el microcódigo se ha actualizado en el arranque o se ha recargado mediante el comando echo:
# dmesg | grep microcode
Eso es todo. Acabas de actualizar el firmware de tu CPU Intel.