В ядре Linux устранена следующая уязвимость:
perf/core: исправлена ошибка счетчика ссылок и потенциальный UAF в perf_mmap. Syzkaller сообщил о добавлении refcount_t: на 0; предупреждение об использовании после бесплатного использования
в perf_mmap. Проблема вызвана состоянием гонки между неудачной настройкой mmap().
и одновременный вызов mmap() для зависимого события (например, с использованием вывода
перенаправление).
В perf_mmap() кольцевой буфер (rb) выделяется и назначается
event->rb с удержанным mmap_mutex. Затем мьютекс освобождается
выполните map_range(). Если функция map_range() завершается неудачно, для очистки вызывается perf_mmap_close().
Однако, поскольку мьютекс был удален, к нему присоединился другой поток.
это событие (через унаследованные события или перенаправление вывода) может получить
мьютекс, обратите внимание на действительный указатель event->rb и попытайтесь
увеличить счетчик ссылок. Если путь очистки уже
dropped the reference count to zero, this results in a
предупреждение об использовании после освобождения или насыщении счетчика ссылок. Исправьте это, расширив область действия mmap_mutex, чтобы охватить
вызов map_range().
Это гарантирует, что инициализация кольцевого буфера и отображение (или очистка в случае сбоя) происходит атомарно эффективно, предотвращение доступа других потоков к наполовину инициализированному или умирающий кольцевой буфер.
Показать оригинальное описание (EN)
In the Linux kernel, the following vulnerability has been resolved: perf/core: Fix refcount bug and potential UAF in perf_mmap Syzkaller reported a refcount_t: addition on 0; use-after-free warning in perf_mmap. The issue is caused by a race condition between a failing mmap() setup and a concurrent mmap() on a dependent event (e.g., using output redirection). In perf_mmap(), the ring_buffer (rb) is allocated and assigned to event->rb with the mmap_mutex held. The mutex is then released to perform map_range(). If map_range() fails, perf_mmap_close() is called to clean up. However, since the mutex was dropped, another thread attaching to this event (via inherited events or output redirection) can acquire the mutex, observe the valid event->rb pointer, and attempt to increment its reference count. If the cleanup path has already dropped the reference count to zero, this results in a use-after-free or refcount saturation warning. Fix this by extending the scope of mmap_mutex to cover the map_range() call. This ensures that the ring buffer initialization and mapping (or cleanup on failure) happens atomically effectively, preventing other threads from accessing a half-initialized or dying ring buffer.
Характеристики атаки
Последствия
Строка CVSS v3.1