Se ha descubierto una vulnerabilidad en el núcleo de Linux (CVE-2021-33624), que permite utilizar la subestructura eBPF para eludir las protecciones contra vulnerabilidades de tipo Spectre, posibilitando así la determinación del contenido de la memoria como resultado de la creación de condiciones para la ejecución especulativa de ciertas operaciones. Para llevar a cabo un ataque Spectre, es necesario que en el código privilegiado exista una secuencia específica de instrucciones que lleve a la ejecución especulativa de instrucciones. A través de la manipulación de las instrucciones BPF que se pasan para su ejecución, es posible generar instrucciones similares en eBPF y provocar la fuga de contenido de la memoria del núcleo y de áreas arbitrarias de la memoria física por canales no autorizados.
La vulnerabilidad es ocasionada por deficiencias en el verificador que se utiliza para detectar errores y actividades inadecuadas en los programas BPF. El verificador explora los posibles caminos de ejecución del código, pero omite las bifurcaciones que son inadecuadas desde un punto de vista semántico de la arquitectura del conjunto de instrucciones. Sin embargo, al ejecutar un programa BPF, tales bifurcaciones, que no han sido consideradas por el verificador, pueden ser predichas incorrectamente por el procesador y ejecutadas en modo especulativo. Por ejemplo, al analizar una operación de «carga», el verificador asume que se utiliza un registro con una dirección cuyo valor siempre se encuentra dentro de los límites establecidos, pero un atacante puede crear condiciones que lleven al procesador a intentar ejecutar especulativamente una operación con una dirección que no cumple con las condiciones de verificación.
El problema se manifiesta a partir del lanzamiento del núcleo 4.15 y ha sido corregido a través de parches (1, 2, 3, 4). En las distribuciones, la vulnerabilidad aún permanece sin reparar (Debian, RHEL, Ubuntu, Fedora, SUSE, Arch).
Adicionalmente, se puede señalar una nota sobre el impacto en el rendimiento de las medidas de protección contra vulnerabilidades de tipo Spectre. En la nota se resumen los resultados de la optimización del depurador rr (Record and Replay), creado en su momento por Mozilla para depurar errores difíciles de reproducir en Firefox. La caché de las llamadas al sistema utilizadas para verificar la existencia de directorios permitió reducir el tiempo de ejecución de la operación «rr sources» de 3 minutos 19 segundos a 36 segundos para un proyecto de prueba.
El autor de la optimización decidió comprobar cómo cambiaría el rendimiento tras desactivar la protección contra Spectre. Después de iniciar el sistema con el parámetro «mitigations=off», el tiempo de ejecución de «rr sources» sin optimización fue de 2 minutos y 5 segundos (1.6 veces más rápido), y con optimización — 33 segundos (9% más rápido). Es interesante que desactivar la protección contra Spectre no solo redujo el tiempo de ejecución del código a nivel de núcleo en 1.4 veces (de 2m9s a 1m32s), sino que también disminuyó el tiempo de ejecución en el espacio de usuario en dos veces (de 1m9s a 0m33s), presumiblemente debido a la disminución de la eficacia del caché del CPU y de los reinicios del TLB con la protección contra Spectre activada.
Fuente: opennet.ru
