CVE-2023-52828 in Linux
Сводка
по VulDB • 20.05.2026
В ядре Linux устранена следующая уязвимость:
bpf: Обнаружение IP == ksym.end как части программы BPF
Теперь, когда kfunc bpf_throw является первой такой инструкцией вызова, имеющей семантику noreturn (без возврата) внутри верификатора, это также запускает удаление мертвого кода (dead code elimination) беспрецедентными способами. Во-первых, любая инструкция, следующая за вызовом bpf_throw, никогда не будет помечена как просмотренная (seen). Более того, если цепочка вызовов (callchain) в итоге приводит к выбросу исключения, любые инструкции после инструкции вызова в подпрограмме, которая в конечном итоге выбрасывает исключение, у вызывающих функций, также никогда не будут помечены как просмотренные.
Соблазнительным способом исправления этой ситуации было бы генерация дополнительных инструкций 'int3', которые увеличивают jited_len программы и гарантируют, что во время выполнения, когда программа выбрасывает исключение, мы сможем определить её границы, даже если инструкция вызова bpf_throw (или подпрограмм, которые всегда выбрасывают исключение) сгенерирована как последняя инструкция в программе.
Примером такой программы может служить следующая:
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 // Никогда не просматривается верификатором exit //
main(ctx): r1 = ... call bar r0 = 0 exit
Здесь, если мы действительно выбрасываем исключение, трассировка стека (stacktrace) будет следующей:
bpf_throw foo bar main
В функции bar последней сгенерированной инструкцией будет вызов foo, поэтому адрес возврата будет следующей инструкцией (которая JIT-компилятор генерирует как int3 на архитектуре x86). Это окажется за пределами jited_len программы, поэтому при разворачивании стека (unwinding) мы не сможем определить, что адрес возврата принадлежит какой-либо программе, и в итоге получим панику из-за ненадежного разворачивания стека программ BPF, которое мы никогда не ожидаем.
Чтобы устранить эту проблему, необходимо заставить bpf_prog_ksym_find рассматривать IP == ksym.end как часть программы BPF, так что is_bpf_text_address возвращает true в таких случаях, и мы можем надежно выполнять разворачивание стека, когда последней инструкцией оказывается инструкция вызова.
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.