CVE-2023-52879
tracing: Have trace_event_file have ref counters
Severity Score
Exploit Likelihood
Affected Versions
Public Exploits
0Exploited in Wild
-Decision
Descriptions
In the Linux kernel, the following vulnerability has been resolved:
tracing: Have trace_event_file have ref counters
The following can crash the kernel:
# cd /sys/kernel/tracing
# echo 'p:sched schedule' > kprobe_events
# exec 5>>events/kprobes/sched/enable
# > kprobe_events
# exec 5>&-
The above commands:
1. Change directory to the tracefs directory
2. Create a kprobe event (doesn't matter what one)
3. Open bash file descriptor 5 on the enable file of the kprobe event
4. Delete the kprobe event (removes the files too)
5. Close the bash file descriptor 5
The above causes a crash!
BUG: kernel NULL pointer dereference, address: 0000000000000028
#PF: supervisor read access in kernel mode
#PF: error_code(0x0000) - not-present page
PGD 0 P4D 0
Oops: 0000 [#1] PREEMPT SMP PTI
CPU: 6 PID: 877 Comm: bash Not tainted 6.5.0-rc4-test-00008-g2c6b6b1029d4-dirty #186
Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.16.2-debian-1.16.2-1 04/01/2014
RIP: 0010:tracing_release_file_tr+0xc/0x50
What happens here is that the kprobe event creates a trace_event_file
"file" descriptor that represents the file in tracefs to the event. It
maintains state of the event (is it enabled for the given instance?).
Opening the "enable" file gets a reference to the event "file" descriptor
via the open file descriptor. When the kprobe event is deleted, the file is
also deleted from the tracefs system which also frees the event "file"
descriptor.
But as the tracefs file is still opened by user space, it will not be
totally removed until the final dput() is called on it. But this is not
true with the event "file" descriptor that is already freed. If the user
does a write to or simply closes the file descriptor it will reference the
event "file" descriptor that was just freed, causing a use-after-free bug.
To solve this, add a ref count to the event "file" descriptor as well as a
new flag called "FREED". The "file" will not be freed until the last
reference is released. But the FREE flag will be set when the event is
removed to prevent any more modifications to that event from happening,
even if there's still a reference to the event "file" descriptor.
En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad: rastreo: Tener trace_event_file tiene contadores de referencia. Lo siguiente puede bloquear el kernel: # cd /sys/kernel/tracing # echo 'p:sched Schedule' > kprobe_events # exec 5>>events /kprobes/sched/enable # > kprobe_events # exec 5>&- Los comandos anteriores: 1. Cambie el directorio al directorio tracefs 2. Cree un evento kprobe (no importa cuál) 3. Abra el descriptor de archivo bash 5 en el habilitar el archivo del evento kprobe 4. Eliminar el evento kprobe (también elimina los archivos) 5. Cerrar el descriptor del archivo bash 5 ¡Lo anterior provoca un bloqueo! BUG: desreferencia del puntero NULL del kernel, dirección: 0000000000000028 #PF: acceso de lectura del supervisor en modo kernel #PF: código_error(0x0000) - página no presente PGD 0 P4D 0 Ups: 0000 [#1] PREEMPT SMP PTI CPU: 6 PID: 877 Comm: bash Not tainted 6.5.0-rc4-test-00008-g2c6b6b1029d4-dirty #186 Nombre del hardware: PC estándar QEMU (Q35 + ICH9, 2009), BIOS 1.16.2-debian-1.16.2-1 04/01 /2014 RIP: 0010:tracing_release_file_tr+0xc/0x50. Lo que sucede aquí es que el evento kprobe crea un descriptor de "archivo" trace_event_file que representa el archivo en tracefs hasta el evento. Mantiene el estado del evento (¿está habilitado para la instancia dada?). Al abrir el archivo "habilitar" se obtiene una referencia al descriptor de "archivo" del evento a través del descriptor de archivo abierto. Cuando se elimina el evento kprobe, el archivo también se elimina del sistema tracefs, lo que también libera el descriptor de "archivo" del evento. Pero como el espacio del usuario todavía abre el archivo tracefs, no se eliminará por completo hasta que se llame al dput() final. Pero esto no es cierto con el descriptor de "archivo" de evento que ya está liberado. Si el usuario escribe o simplemente cierra el descriptor de archivo, hará referencia al descriptor de "archivo" del evento que acaba de liberarse, lo que provocará un error de uso después de la liberación. Para resolver esto, agregue un recuento de referencias al descriptor de "archivo" del evento, así como una nueva bandera llamada "FREED". El "archivo" no se liberará hasta que se publique la última referencia. Pero el indicador FREE se establecerá cuando se elimine el evento para evitar que se realicen más modificaciones en ese evento, incluso si todavía hay una referencia al descriptor de "archivo" del evento.
CVSS Scores
SSVC
- Decision:Track
Timeline
- 2024-05-21 CVE Reserved
- 2024-05-21 CVE Published
- 2024-05-22 EPSS Updated
- 2024-12-19 CVE Updated
- ---------- Exploited in Wild
- ---------- KEV Due Date
- ---------- First Exploit
CWE
CAPEC
References (13)
URL | Tag | Source |
---|---|---|
https://git.kernel.org/stable/c/e6807c873d8791ae5a5186ad05ec66cab926539a | Vuln. Introduced | |
https://git.kernel.org/stable/c/407bf1c140f0757706c0b28604bcc90837d45ce2 | Vuln. Introduced | |
https://git.kernel.org/stable/c/fa6d449e4d024d8c17f4288e0567d28ace69415c | Vuln. Introduced | |
https://git.kernel.org/stable/c/a46bf337a20f9edd3c8041b025639842280d0575 | Vuln. Introduced | |
https://git.kernel.org/stable/c/9beec04370132a7a6cd1aa9897f6fffc6262ff28 | Vuln. Introduced | |
https://git.kernel.org/stable/c/f5ca233e2e66dc1c249bf07eefa37e34a6c9346a | Vuln. Introduced |
URL | Date | SRC |
---|
URL | Date | SRC |
---|
Affected Vendors, Products, and Versions
Vendor | Product | Version | Other | Status | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Vendor | Product | Version | Other | Status | <-- --> | Vendor | Product | Version | Other | Status |
Linux Search vendor "Linux" | Linux Kernel Search vendor "Linux" for product "Linux Kernel" | >= 5.4.258 < 5.4.262 Search vendor "Linux" for product "Linux Kernel" and version " >= 5.4.258 < 5.4.262" | en |
Affected
| ||||||
Linux Search vendor "Linux" | Linux Kernel Search vendor "Linux" for product "Linux Kernel" | >= 5.10.198 < 5.10.202 Search vendor "Linux" for product "Linux Kernel" and version " >= 5.10.198 < 5.10.202" | en |
Affected
| ||||||
Linux Search vendor "Linux" | Linux Kernel Search vendor "Linux" for product "Linux Kernel" | >= 5.15.134 < 5.15.140 Search vendor "Linux" for product "Linux Kernel" and version " >= 5.15.134 < 5.15.140" | en |
Affected
| ||||||
Linux Search vendor "Linux" | Linux Kernel Search vendor "Linux" for product "Linux Kernel" | >= 6.1.55 < 6.1.64 Search vendor "Linux" for product "Linux Kernel" and version " >= 6.1.55 < 6.1.64" | en |
Affected
| ||||||
Linux Search vendor "Linux" | Linux Kernel Search vendor "Linux" for product "Linux Kernel" | >= 6.5.5 < 6.5.13 Search vendor "Linux" for product "Linux Kernel" and version " >= 6.5.5 < 6.5.13" | en |
Affected
| ||||||
Linux Search vendor "Linux" | Linux Kernel Search vendor "Linux" for product "Linux Kernel" | >= 6.6 < 6.6.1 Search vendor "Linux" for product "Linux Kernel" and version " >= 6.6 < 6.6.1" | en |
Affected
| ||||||
Linux Search vendor "Linux" | Linux Kernel Search vendor "Linux" for product "Linux Kernel" | >= 6.6 < 6.7 Search vendor "Linux" for product "Linux Kernel" and version " >= 6.6 < 6.7" | en |
Affected
|