Una vulnerabilidad en eBPF permite eludir la protección contra ataques de Spectre

junio 26, 2021 , 0 Comments

El día de ayer publicamos aquí en el blog la noticia sobre Aya, una biblioteca para crear controladores eBPF en Rust y es que la finalidad de esta es el crear controladores más seguros o del proyecto Prossimo para asegurar la memoria del kernel de Linux con Rust (dos grandes proyecto que darán mucho de que hablar en los siguientes meses).

Y es que en cuestión de poco tiempo se ha reportado diversas vulnerabilidades en las cuales se aprovechan de los fallos en eBPF y que es un tema en el cual los desarrolladores del Kernel no han dejado de trabajar y tal vez Rust sea la solución.

La razón de tocar este tema, es que hace poco se dio conocer la noticia de que han identificado «otra» vulnerabilidad en el kernel de Linux (CVE-2021-33624) para eludir la protección contra vulnerabilidades de clase Spectre, ya que esta permite utilizar el subsistema eBPF para poder determinar el contenido de la memoria como resultado de la creación de condiciones para especulaciones de ejecución de determinadas operaciones.

Se menciona que la vulnerabilidad es causada por fallas en el verificador, que se utiliza para detectar errores y actividad no válida en los programas BPF. El verificador enumera las posibles rutas de ejecución del código, pero omite las opciones de ramificación que no son válidas desde el punto de vista de la semántica de la arquitectura del conjunto de instrucciones.

Al ejecutar un programa BPF, las opciones de ramificación que no fueron tomadas en cuenta por el verificador pueden ser predichas incorrectamente por el procesador y ejecutadas en un modo especulativo.

En los sistemas afectados, un programa BPF sin privilegios puede aprovechar esta vulnerabilidad para filtrar el contenido de la memoria del kernel arbitraria (y por lo tanto, de toda la memoria física) a través de un canal lateral.

Por ejemplo, al analizar la operación de «carga», el verificador asume que la instrucción usa un registro con una dirección cuyo valor está siempre dentro de los límites especificados, pero un atacante puede crear condiciones bajo las cuales el procesador intentará realizar especulativamente una operación con una dirección que no cumpla con las condiciones de verificación.

El ataque Spectre requiere la presencia de una secuencia específica de comandos en el código privilegiado, lo que lleva a la ejecución especulativa de instrucciones. Al manipular los programas BPF que se pasan para su ejecución, es posible generar tales instrucciones en eBPF y filtrar el contenido de la memoria del núcleo y áreas arbitrarias de la memoria física a través de canales laterales.

Además, se puede marcar una nota sobre el impacto en el rendimiento de los activos para proteger contra la clase de vulnerabilidades Spectre.

Esta nota resume los resultados de optimización del depurador rr (Record and Replay), una vez creado por Mozilla para depurar errores difíciles de repetir en Firefox. El almacenamiento en caché de las llamadas del sistema utilizadas para verificar la existencia de directorios redujo la operación de «fuentes rr» para el proyecto de prueba de 3 minutos 19 segundos a 36 segundos.

El autor de la optimización decidió comprobar cuánto cambiará el rendimiento después de desactivar la protección de Spectre. Después de arrancar el sistema con el parámetro «mitigations=off», el tiempo de ejecución de «rr sources» sin optimización fue de 2 minutos 5 segundos (1.6 veces más rápido) y con optimización 33 segundos (9% más rápido).

Curiosamente, deshabilitar la protección de Spectre no solo redujo el tiempo de ejecución del código a nivel del kernel en 1.4 veces (de 2 min 9s a 1 min 32s), sino que también redujo a la mitad el tiempo de ejecución en el espacio de usuario (de 1 min 9s a 33s), presumiblemente debido a una disminución en La caché de CPU de eficiencia y el TLB se restablecen cuando la protección Spectre está habilitada.

El problema ha aparecido desde el lanzamiento del kernel 4.15 y se ha solucionado en forma de parches, los cuales en estos momentos todavía no llegan a todas las distribuciones, por lo que se recomienda a los usuarios que en estos dias estén realizando las actualizaciones pertinentes en cuanto reciban las notificaciones.

Si quieres conocer más al respecto, puedes consultar los detalles en el siguiente enlace.


Some say he’s half man half fish, others say he’s more of a seventy/thirty split. Either way he’s a fishy bastard.