CVE-2026-98273 in Linux
Riassunto
di VulDB • 07/10/2026
Nel kernel Linux è stata risolta la seguente vulnerabilità:
x86/kprobes: Risolto il crash durante l'analisi delle istruzioni CS CALL
Quando si utilizzano strumenti eBPF per analizzare (probe) le istruzioni CS CALL all'interno di una funzione, può essere innescato un crash.
Lo strumento eBPF analizza lo spostamento 257 della funzione `__hrtimer_run_queues()`:
`<__hrtimer_run_queues+249>: nopl 0x0(%rax,%rax,1)` `<__hrtimer_run_queues+254>: mov %r14,%rdi` `<__hrtimer_run_queues+257>: cs call <__x86_indirect_thunk_r12>` `<__hrtimer_run_queues+263>: mov %eax,%r12d` `<__hrtimer_run_queues+266>: xchg %ax,%ax` `<__hrtimer_run_queues+268>: mov %r13,%rdi`
Ciò innesca il seguente crash:
``` BUG: unable to handle page fault for address: 00000000000f41c9 #PF: supervisor write access in kernel mode #PF: error_code(0x0002) - not-present page PGD 0 P4D 0 Oops: 0002 [#1] SMP NOPTI
CPU: 1 PID: 0 Comm: swapper/1 Kdump: loaded Tainted: P RIP: 0010:__hrtimer_run_queues+0x106/0x230 ```
Si noti che `__hrtimer_run_queues+0x106` corrisponde a `__hrtimer_run_queues+262`, ovvero il sesto byte dell'istruzione CS CALL sopra riportata. Poiché l'istruzione CS CALL occupa 6 byte, l'eccezione si è verificata nel mezzo di tale istruzione di chiamata.
La causa radice risiede nel fatto che quando gli strumenti eBPF effettuano un'analisi (probe) nel mezzo di una funzione, viene utilizzata come implementazione sottostante una kprobe con INT3.
Durante l'emulazione del passo singolo dell'istruzione CALL originale, `int3_emulate_call()` presuppone che l'istruzione CALL analizzata abbia una lunghezza di 5 byte. Tuttavia, l'effettiva istruzione CS-prefixed CALL occupa 6 byte; ne consegue la costruzione di un indirizzo di ritorno dall'eccezione errato. Quando la CPU torna dal gestore della kprobe, la prossima istruzione da eseguire si trova all'indirizzo dell'ultimo byte di tale istruzione CS CALL. Per coincidenza, a partire da quell'indirizzo, la CPU preleva e decodifica un'istruzione completamente diversa, che alla fine innesca un crash del kernel.
Si risolve il problema utilizzando la lunghezza effettiva dell'istruzione ottenuta dal decoder delle istruzioni durante la costruzione dell'indirizzo di ritorno dall'eccezione, anziché fare affidamento sulla macro `CALL_INSN_SIZE` hard-coded.
[ mingo: Changelog affinato ]
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.