CVE-2024-26706
parisc: Fix random data corruption from exception handler
Severity Score
Exploit Likelihood
Affected Versions
Public Exploits
0Exploited in Wild
-Decision
Descriptions
In the Linux kernel, the following vulnerability has been resolved:
parisc: Fix random data corruption from exception handler
The current exception handler implementation, which assists when accessing
user space memory, may exhibit random data corruption if the compiler decides
to use a different register than the specified register %r29 (defined in
ASM_EXCEPTIONTABLE_REG) for the error code. If the compiler choose another
register, the fault handler will nevertheless store -EFAULT into %r29 and thus
trash whatever this register is used for.
Looking at the assembly I found that this happens sometimes in emulate_ldd().
To solve the issue, the easiest solution would be if it somehow is
possible to tell the fault handler which register is used to hold the error
code. Using %0 or %1 in the inline assembly is not posssible as it will show
up as e.g. %r29 (with the "%r" prefix), which the GNU assembler can not
convert to an integer.
This patch takes another, better and more flexible approach:
We extend the __ex_table (which is out of the execution path) by one 32-word.
In this word we tell the compiler to insert the assembler instruction
"or %r0,%r0,%reg", where %reg references the register which the compiler
choosed for the error return code.
In case of an access failure, the fault handler finds the __ex_table entry and
can examine the opcode. The used register is encoded in the lowest 5 bits, and
the fault handler can then store -EFAULT into this register.
Since we extend the __ex_table to 3 words we can't use the BUILDTIME_TABLE_SORT
config option any longer.
En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad: parisc: corrige la corrupción aleatoria de datos del controlador de excepciones La implementación actual del controlador de excepciones, que ayuda al acceder a la memoria del espacio del usuario, puede exhibir corrupción aleatoria de datos si el compilador decide usar un registro diferente al el registro especificado %r29 (definido en ASM_EXCEPTIONTABLE_REG) para el código de error. Si el compilador elige otro registro, el manejador de fallas almacenará -EFAULT en %r29 y, por lo tanto, eliminará cualquier cosa para la que se utilice este registro. Al observar el ensamblaje, encontré que esto sucede a veces en emulate_ldd(). Para resolver el problema, la solución más sencilla sería si de alguna manera fuera posible decirle al manejador de fallas qué registro se utiliza para contener el código de error. No es posible usar %0 o %1 en el ensamblador en línea ya que aparecerá, por ejemplo, como %r29 (con el prefijo "%r"), que el ensamblador GNU no puede convertir a un número entero. Este parche adopta otro enfoque mejor y más flexible: ampliamos el __ex_table (que está fuera de la ruta de ejecución) en 32 palabras. En esta palabra le decimos al compilador que inserte la instrucción ensambladora "o %r0,%r0,%reg", donde %reg hace referencia al registro que el compilador eligió para el código de retorno de error. En caso de un error de acceso, el controlador de fallas encuentra la entrada __ex_table y puede examinar el código de operación. El registro utilizado está codificado en los 5 bits más bajos y el manejador de fallas puede almacenar -EFAULT en este registro. Dado que ampliamos __ex_table a 3 palabras, ya no podemos usar la opción de configuración BUILDTIME_TABLE_SORT.
CVSS Scores
SSVC
- Decision:Track
Timeline
- 2024-02-19 CVE Reserved
- 2024-04-03 CVE Published
- 2024-04-04 EPSS Updated
- 2024-12-19 CVE Updated
- ---------- Exploited in Wild
- ---------- KEV Due Date
- ---------- First Exploit
CWE
CAPEC
References (4)
URL | Tag | Source |
---|
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" | < 6.1.79 Search vendor "Linux" for product "Linux Kernel" and version " < 6.1.79" | en |
Affected
| ||||||
Linux Search vendor "Linux" | Linux Kernel Search vendor "Linux" for product "Linux Kernel" | < 6.6.18 Search vendor "Linux" for product "Linux Kernel" and version " < 6.6.18" | en |
Affected
| ||||||
Linux Search vendor "Linux" | Linux Kernel Search vendor "Linux" for product "Linux Kernel" | < 6.7.6 Search vendor "Linux" for product "Linux Kernel" and version " < 6.7.6" | en |
Affected
| ||||||
Linux Search vendor "Linux" | Linux Kernel Search vendor "Linux" for product "Linux Kernel" | < 6.8 Search vendor "Linux" for product "Linux Kernel" and version " < 6.8" | en |
Affected
|