CVE-2024-43891CWE-416

CVE-2024-43891

High · published August 26, 2024

CVSS v3.1
7.8
EPSS
0%
Percentile
13.9
In the wild
Unconfirmed
What it is

In the Linux kernel, the following vulnerability has been resolved:

tracing: Have format file honor EVENT_FILE_FL_FREED

When eventfs was introduced, special care had to be done to coordinate the

freeing of the file meta data with the files that are exposed to user

space. The file meta data would have a ref count that is set when the file

is created and would be decremented and freed after the last user that

opened the file closed it. When the file meta data was to be freed, it

would set a flag (EVENT_FILE_FL_FREED) to denote that the file is freed,

and any new references made (like new opens or reads) would fail as it is

marked freed. This allowed other meta data to be freed after this flag was

set (under the event_mutex).

All the files that were dynamically created in the events directory had a

pointer to the file meta data and would call event_release() when the last

reference to the user space file was closed. This would be the time that it

is safe to free the file meta data.

A shortcut was made for the "format" file. It's i_private would point to

the "call" entry directly and not point to the file's meta data. This is

because all format files are the same for the same "call", so it was

thought there was no reason to differentiate them. The other files

maintain state (like the "enable", "trigger", etc). But this meant if the

file were to disappear, the "format" file would be unaware of it.

This caused a race that could be trigger via the user_events test (that

would create dynamic events and free them), and running a loop that would

read the user_events format files:

In one console run:

# cd tools/testing/selftests/user_events

# while true; do ./ftrace_test; done

And in another console run:

# cd /sys/kernel/tracing/

# while true; do cat events/user_events/__test_event/format; done 2>/dev/null

With KASAN memory checking, it would trigger a use-after-free bug report

(which was a real bug). This was because the format file was not checking

the file's meta data flag "EVENT_FILE_FL_FREED", so it would access the

event that the file meta data pointed to after the event was freed.

After inspection, there are other locations that were found to not check

the EVENT_FILE_FL_FREED flag when accessing the trace_event_file. Add a

new helper function: event_file_file() that will make sure that the

event_mutex is held, and will return NULL if the trace_event_file has the

EVENT_FILE_FL_FREED flag set. Have the first reference of the struct file

pointer use event_file_file() and check for NULL. Later uses can still use

the event_file_data() helper function if the event_mutex is still held and

was not released since the event_file_file() call.

The record
Technical detail
CVSS v3.1
7.8 · HIGH
Vector
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
CVSS v4.0
Not supplied
EPSS
0.00237 · 13.9th percentile
Weakness
CWE-416 · Use After Free
Published
2024-08-26T15:15Z
Affected products (4)
ProductVersionsFixed in
linux/linux_kernel≥ 6.6.33, < 6.6.496.6.49
linux/linux_kernel≥ 6.9, < 6.10.56.10.5
linux/linux_kernelall versions—
linux/linux_kernelall versions—
References (3)
EPSS history
Timeline
  • 26 AUG 10:10Z
    tracing: Have format file honor EVENT_FILE_FL_FREED
    cvelistv5