В ядре Linux устранена следующая уязвимость: bpf: Обнаружение IP == ksym.end как части программы BPF Теперь, когда bpf_throw kfunc является…
В ядре Linux устранена следующая уязвимость: bpf: Обнаружение IP == ksym.end как части программы BPF Теперь, когда bpf_throw kfunc является первой такой инструкцией вызова, которая имеет семантику noreturn в верификаторе, это также запускает устранение мертвого кода беспрецедентными способами. Во-первых, любая инструкция, следующая за вызовом bpf_throw, никогда не будет помечена как просмотренная. Более того, если цепочка вызовов заканчивается генерацией исключения, любые инструкции после инструкции вызова в конечном итоге генерирующей исключение подпрограммы в вызывающих абонентах также никогда не будут помечены как просмотренные. Заманчивый способ исправить это - сгенерировать дополнительные инструкции '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 Здесь, если мы все же сгенерируем исключение, трассировка стека будет следующей: bpf_throw foo bar main В bar последней выданной инструкцией будет вызов foo, как таковой, обратный адрес будет следующей инструкцией (которую JIT выдает как int3 на x86). Это окажется за пределами jited_len программы, таким образом, при раскрутке мы не сможем обнаружить, что обратный адрес принадлежит какой-либо программе, и в конечном итоге запаникуем из-за ненадежной раскрутки стека программ BPF, чего мы никогда не ожидаем. Чтобы исправить этот случай, заставьте bpf_prog_ksym_find рассматривать IP == ksym.end как часть программы BPF, чтобы is_bpf_text_address возвращала true, когда происходит такой случай, и мы могли надежно раскручиваться, когда последняя инструкция оказывается инструкцией вызова.
Продукт содержит мёртвый код, который никогда не может быть выполнен.
https://cwe.mitre.org/data/definitions/561.html →Открыть в коллекции CWE →| Продукт | Вендор | Статус |
|---|---|---|
| linux | Отслеживается | |
| linux | Отслеживается | |
| linux | Отслеживается | |
| linux | Отслеживается | |
| linux | Отслеживается | |
| linux | Отслеживается | |
| linux | Отслеживается | |
| linux | Отслеживается | |
| linux | Отслеживается | |
| linux | Отслеживается | |
| linux | Отслеживается | |
| linux | Отслеживается | |
| linux | Отслеживается | |
| linux-5.10 | Отслеживается | |
| linux-5.10 | Отслеживается | |
| linux-5.10 | Отслеживается | |
| linux-5.15 | Отслеживается | |
| linux-6.1 | Отслеживается | |
| linux-6.1 | Отслеживается | |
| linux-allwinner-5.19 | Отслеживается |