CVE-2024-42096

In the Linux kernel, the following vulnerability has been resolved: x86: stop playing stack games in profile_pc() The 'profile_pc()' function is used for timer-based profiling, which isn't really all that relevant any more to begin with, but it also ends up making assumptions based on the stack layout that aren't necessarily valid. Basically, the code tries to account the time spent in spinlocks to the caller rather than the spinlock, and while I support that as a concept, it's not worth the code complexity or the KASAN warnings when no serious profiling is done using timers anyway these days. And the code really does depend on stack layout that is only true in the simplest of cases. We've lost the comment at some point (I think when the 32-bit and 64-bit code was unified), but it used to say: Assume the lock function has either no stack frame or a copy of eflags from PUSHF. which explains why it just blindly loads a word or two straight off the stack pointer and then takes a minimal look at the values to just check if they might be eflags or the return pc: Eflags always has bits 22 and up cleared unlike kernel addresses but that basic stack layout assumption assumes that there isn't any lock debugging etc going on that would complicate the code and cause a stack frame. It causes KASAN unhappiness reported for years by syzkaller [1] and others [2]. With no real practical reason for this any more, just remove the code. Just for historical interest, here's some background commits relating to this code from 2006: 0cb91a229364 ("i386: Account spinlocks to the caller during profiling for !FP kernels") 31679f38d886 ("Simplify profile_pc on x86-64") and a code unification from 2009: ef4512882dbe ("x86: time_32/64.c unify profile_pc") but the basics of this thing actually goes back to before the git tree.
CVSS

No CVSS.

Configurations

No configuration.

History

30 Jul 2024, 13:33

Type Values Removed Values Added
Summary
  • (es) En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad: x86: deja de jugar juegos de pila en perfil_pc() La función 'profile_pc()' se utiliza para la creación de perfiles basada en temporizador, lo cual ya no es tan relevante para empezar. , pero también termina haciendo suposiciones basadas en el diseño de la pila que no son necesariamente válidas. Básicamente, el código intenta contabilizar el tiempo invertido en bloqueos de giro para la persona que llama en lugar del bloqueo de giro, y si bien apoyo eso como concepto, no vale la pena la complejidad del código o las advertencias de KASAN cuando de todos modos no se realiza una creación de perfiles seria usando temporizadores en estos días. . Y el código realmente depende del diseño de la pila, lo que solo es cierto en los casos más simples. Perdimos el comentario en algún momento (creo que cuando se unificó el código de 32 y 64 bits), pero solía decir: Supongamos que la función de bloqueo no tiene marco de pila o tiene una copia de eflags de PUSHF. lo que explica por qué simplemente carga ciegamente una o dos palabras directamente desde el puntero de la pila y luego echa un vistazo mínimo a los valores para comprobar si podrían ser eflags o la PC de retorno: Eflags siempre tiene los bits 22 y superiores limpios, a diferencia de las direcciones del kernel, pero Esa suposición básica del diseño de la pila supone que no hay ninguna depuración de bloqueo, etc., que complicaría el código y provocaría un marco de pila. Provoca la infelicidad de KASAN que Syzkaller [1] y otros [2] han informado durante años. Sin ninguna razón práctica real para esto, simplemente elimine el código. Solo por interés histórico, aquí hay algunas confirmaciones de antecedentes relacionadas con este código de 2006: 0cb91a229364 ("i386: La cuenta se bloquea en la persona que llama durante la creación de perfiles para los núcleos !FP") 31679f38d886 ("Simplificar perfil_pc en x86-64") y una unificación de código de 2009: ef4512882dbe ("x86: time_32/64.c unify perfil_pc") pero los conceptos básicos de esto en realidad se remontan a antes del árbol git.

29 Jul 2024, 18:15

Type Values Removed Values Added
New CVE

Information

Published : 2024-07-29 18:15

Updated : 2024-07-30 13:33


NVD link : CVE-2024-42096

Mitre link : CVE-2024-42096

CVE.ORG link : CVE-2024-42096


JSON object : View

Products Affected

No product.

CWE

No CWE.