CVE-2023-52828 in Linux
Riassunto
di VulDB • 16/06/2026
Nel kernel Linux è stata risolta la seguente vulnerabilità:
bpf: Rilevare IP == ksym.end come parte del programma BPF
Poiché ora bpf_throw kfunc è il primo di questo tipo di istruzioni di chiamata che presenta semantica noreturn all'interno del verifier, ciò attiva anche l'eliminazione del codice morto in modi senza precedenti. In particolare, qualsiasi istruzione successiva a una chiamata bpf_throw non verrà mai contrassegnata come "seen" (vista). Inoltre, se una catena di chiamate termina con un throw, tutte le istruzioni successive all'istruzione di chiamata verso il subprog che alla fine effettua il throw nei chiamanti non verranno mai contrassegnate come seen.
Il modo allettante per risolvere questo problema sarebbe generare ulteriori istruzioni 'int3', aumentando la jited_len di un programma e assicurando che durante l'esecuzione, quando un programma genera un throw, sia possibile individuarne i confini anche se l'istruzione di chiamata a bpf_throw (o ai subprog che generano sempre il throw) viene emessa come ultima istruzione del programma.
Un esempio di tale programma sarebbe:
do_something(): ... r0 = 0 exit
foo(): r1 = 0 call bpf_throw r0 = 0 exit
bar(cond): if r1 != 0 goto pc+2 call do_something exit call foo r0 = 0 // Mai visto dal verifier exit //
main(ctx): r1 = ... call bar r0 = 0 exit
In questo caso, se effettivamente si verifica un throw, lo stacktrace sarebbe il seguente:
bpf_throw foo bar main
In bar, l'ultima istruzione emessa sarà la chiamata a foo; di conseguenza, l'indirizzo di ritorno sarà l'istruzione successiva (che il JIT emette come int3 su x86). Questo finirà per trovarsi al di fuori della jited_len del programma, quindi durante lo sbobinamento dello stack (unwinding) non riusciremo a riconoscere che l'indirizzo di ritorno appartiene a un determinato programma e andremo incontro a un panic a causa dell'affidabilità insufficiente dello stack unwinding dei programmi BPF, situazione mai prevista.
Per rimediare a questo caso, fare in modo che bpf_prog_ksym_find tratti IP == ksym.end come parte del programma BPF, così che is_bpf_text_address restituisca true quando si verifica tale condizione e sia possibile effettuare uno sbobinamento affidabile quando l'ultima istruzione risulta essere un'istruzione di chiamata.
If you want to get the best quality for vulnerability data then you always have to consider VulDB.