
Análisis educativo de CVE-2024-9680, una vulnerabilidad de use-after-free en la línea de tiempo de animación CSS de Firefox, con mecanismos de explotación detallados y ejemplos de código conceptuales.
Un atacante logró ejecutar código en el proceso de contenido explotando un use-after-free en las líneas de tiempo de animación CSS. Hemos recibido informes de que esta vulnerabilidad está siendo explotada activamente. Esta vulnerabilidad afecta a Firefox < 131.0.2, Firefox ESR < 128.3.1, Firefox ESR < 115.16.1, Thunderbird < 131.0.1, Thunderbird < 128.3.1 y Thunderbird < 115.16.0.
Crédito: Fireship
Una vulnerabilidad de "use-after-free" es un tipo de problema de corrupción de memoria que ocurre cuando un programa continúa usando un puntero (o referencia) a memoria después de que esta ha sido liberada (desasignada). Esta es una condición peligrosa porque la memoria en cuestión ya no pertenece al programa, lo que significa que podría ser reasignada para otro propósito o alterada por otras partes del programa. Si el programa continúa usando esta memoria liberada, puede provocar comportamientos impredecibles, como fallos, corrupción de datos o explotación por parte de atacantes.
Asignación y Desasignación de Memoria:
malloc() o new) y la liberan cuando terminan con ella (por ejemplo, con free() o delete).El Problema:
Consecuencias:
Considere un ejemplo simplificado en C:
#include <stdlib.h>
#include <stdio.h>
int main() {
int *ptr = (int *)malloc(sizeof(int)); // Asignar memoria
*ptr = 42; // Usar la memoria asignada
free(ptr); // Liberar la memoria
// Usar el puntero después de liberar la memoria (use-after-free)
printf("%d\n", *ptr); // Comportamiento indefinido, posible fallo o explotación
return 0;
}
En el ejemplo:
free(ptr).ptr todavía se está usando (desreferenciado en la sentencia printf()), lo que lleva a un comportamiento indefinido. La memoria puede haber sido reasignada, y acceder a ella podría causar un fallo o, en un escenario más peligroso, la explotación del programa.Los atacantes pueden explotar las vulnerabilidades de use-after-free manipulando cuidadosamente la gestión de memoria. Así es como un atacante podría potencialmente usar esta vulnerabilidad:
Para prevenir vulnerabilidades de use-after-free, los desarrolladores pueden:
NULL después de liberarlos: Esto asegura que si un puntero se usa accidentalmente después de ser liberado, el programa falle de manera más predecible o se comporte de forma controlada, en lugar de acceder a memoria inválida.std::shared_ptr, std::unique_ptr) puede ayudar a gestionar la memoria automáticamente, reduciendo las posibilidades de una mala gestión manual de la memoria.En este caso específico, la CSS Animation Timeline (la línea de tiempo de animación CSS) —que es responsable de controlar la temporización de las animaciones en una página web— interactuaba con otros componentes del navegador de tal manera que un objeto vinculado a la línea de tiempo de la animación se liberaba, pero el navegador continuaba usándolo.