
Образовательный анализ CVE-2024-9680, уязвимости использования после освобождения (use-after-free) в CSS Animation Timeline браузера Firefox, с подробным описанием механики эксплуатации и концептуальными примерами кода.
Злоумышленник смог добиться выполнения кода в контентном процессе, используя уязвимость use-after-free в временных шкалах анимации. У нас есть сообщения об эксплуатации этой уязвимости в реальных условиях. Эта уязвимость затрагивает Firefox < 131.0.2, Firefox ESR < 128.3.1, Firefox ESR < 115.16.1, Thunderbird < 131.0.1, Thunderbird < 128.3.1 и Thunderbird < 115.16.0.
Автор: Fireship
Уязвимость типа «use-after-free» — это разновидность проблемы повреждения памяти, которая возникает, когда программа продолжает использовать указатель (или ссылку) на память после того, как она была освобождена (деаллоцирована). Это опасное состояние, поскольку память больше не принадлежит программе, то есть она может быть переназначена для других целей или изменена другими частями программы. Если программа продолжает использовать эту освобождённую память, это может привести к непредсказуемому поведению, включая сбои, повреждение данных или эксплуатацию злоумышленниками.
Выделение и освобождение памяти:
malloc() или new), и освобождают её, когда она больше не нужна (например, с помощью free() или delete).Проблема:
Последствия:
Рассмотрим упрощённый пример на C:
#include <stdlib.h>
#include <stdio.h>
int main() {
int *ptr = (int *)malloc(sizeof(int)); // Выделение памяти
*ptr = 42; // Использование выделенной памяти
free(ptr); // Освобождение памяти
// Использование указателя после освобождения памяти (use-after-free)
printf("%d\n", *ptr); // Неопределённое поведение, возможный сбой или эксплуатация
return 0;
}
В примере:
free(ptr).ptr всё ещё используется (разыменовывается в операторе printf()), что приводит к неопределённому поведению. Память могла быть перераспределена, и доступ к ней может привести к сбою или, в более опасном сценарии, к эксплуатации программы.Злоумышленники могут эксплуатировать уязвимости use-after-free, тщательно манипулируя управлением памятью. Вот как злоумышленник мог бы потенциально использовать эту уязвимость:
Чтобы предотвратить уязвимости use-after-free, разработчики могут:
NULL после освобождения: это гарантирует, что если указатель случайно будет использован после освобождения, программа более предсказуемо завершится или будет вести себя контролируемо, а не получит доступ к недействительной памяти.std::shared_ptr, std::unique_ptr) может помочь автоматически управлять памятью, снижая вероятность ошибок ручного управления памятью.В данном конкретном случае временная шкала CSS-анимации (CSS Animation Timeline), которая отвечает за управление временными параметрами анимации на веб-странице, взаимодействовала с другими компонентами браузера таким образом, что объект, связанный с временной шкалой анимации, был освобождён, но браузер продолжал его использовать.