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.

Раскрытие

21.05.2024

Модерация

принято

Вход

VDB-265551

EPSS

0.00246

KEV

Нет

Деятельности

Очень низкий

Источники

Interested in the pricing of exploits?

See the underground prices here!