CVE-2026-31561

In the Linux kernel, the following vulnerability has been resolved: x86/cpu: Remove X86_CR4_FRED from the CR4 pinned bits mask Commit in Fixes added the FRED CR4 bit to the CR4 pinned bits mask so that whenever something else modifies CR4, that bit remains set. Which in itself is a perfectly fine idea. However, there's an issue when during boot FRED is initialized: first on the BSP and later on the APs. Thus, there's a window in time when exceptions cannot be handled. This becomes particularly nasty when running as SEV-{ES,SNP} or TDX guests which, when they manage to trigger exceptions during that short window described above, triple fault due to FRED MSRs not being set up yet. See Link tag below for a much more detailed explanation of the situation. So, as a result, the commit in that Link URL tried to address this shortcoming by temporarily disabling CR4 pinning when an AP is not online yet. However, that is a problem in itself because in this case, an attack on the kernel needs to only modify the online bit - a single bit in RW memory - and then disable CR4 pinning and then disable SM*P, leading to more and worse things to happen to the system. So, instead, remove the FRED bit from the CR4 pinning mask, thus obviating the need to temporarily disable CR4 pinning. If someone manages to disable FRED when poking at CR4, then idt_invalidate() would make sure the system would crash'n'burn on the first exception triggered, which is a much better outcome security-wise.
Configurations

Configuration 1 (hide)

OR cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.9:-:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:7.0:rc1:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:7.0:rc2:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:7.0:rc3:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:7.0:rc4:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:7.0:rc5:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:7.0:rc6:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:7.0:rc7:*:*:*:*:*:*

History

11 Nov 2026, 23:10

Type Values Removed Values Added
Summary
  • (es) En el kernel de Linux, la siguiente vulnerabilidad ha sido resuelta: x86/cpu: Eliminar X86_CR4_FRED de la máscara de bits fijados de CR4 El commit en Fixes añadió el bit FRED CR4 a la máscara de bits fijados de CR4 para que cada vez que algo más modifique CR4, ese bit permanezca establecido. Lo cual en sí mismo es una idea perfectamente válida. Sin embargo, hay un problema cuando durante el arranque FRED es inicializado: primero en el BSP y luego en los APs. Así, hay una ventana de tiempo cuando las excepciones no pueden ser manejadas. Esto se vuelve particularmente desagradable cuando se ejecuta como invitados SEV-{ES,SNP} o TDX los cuales, cuando logran disparar excepciones durante esa corta ventana descrita anteriormente, causan una triple falla debido a que los MSR de FRED aún no están configurados. Ver la etiqueta Link a continuación para una explicación mucho más detallada de la situación. Así, como resultado, el commit en esa URL de Link intentó abordar esta deficiencia deshabilitando temporalmente el fijado de CR4 cuando un AP aún no está en línea. Sin embargo, eso es un problema en sí mismo porque en este caso, un ataque al kernel solo necesita modificar el bit en línea - un solo bit en memoria RW - y luego deshabilitar el fijado de CR4 y luego deshabilitar SMP, lo que lleva a que ocurran cosas más y peores en el sistema. Así que, en su lugar, eliminar el bit FRED de la máscara de fijado de CR4, obviando así la necesidad de deshabilitar temporalmente el fijado de CR4. Si alguien logra deshabilitar FRED al manipular CR4, entonces idt_invalidate() se aseguraría de que el sistema se bloqueara y fallara con la primera excepción disparada, lo cual es un resultado mucho mejor en términos de seguridad.

Information

Published : 2026-04-24 15:16

Updated : 2026-11-11 23:10


NVD link : CVE-2026-31561

Mitre link : CVE-2026-31561

CVE.ORG link : CVE-2026-31561


JSON object : View

Products Affected

linux

  • linux_kernel