В ядре Linux устранена следующая уязвимость:
bpf: сброс границ регистра перед сужением диапазона повторных значений в check_mem_access(). Когда верификатор BPF обрабатывает контекстную загрузку возврата ловушки LSM.
значение, он вызывает __mark_reg_s32_range(), чтобы сузить регистр до
Допустимый диапазон хука. Однако __mark_reg_s32_range() пересекает новый
диапазон с существующими границами регистра, используя max_t()/min_t(), а не
чем заменить их.
Если регистр назначения содержит устаревшие границы из предыдущей инструкции
(например, BPF_MOV64_IMM), пересечение может создать диапазон уже, чем
реальность. Затем верификатор полагает, что знает точное значение регистра.
в то время как во время выполнения загружается фактическое возвращаемое значение перехватчика, создавая
несоответствие верификатора и времени выполнения, которое можно использовать для обхода безопасности памяти BPF
чеки. Ветка else уже вызывает mark_reg_unknown() для сброса состояния регистра.
до любого сужения.
Примените тот же сброс в пути is_retval, чтобы
устаревшие границы очищаются до пересечения __mark_reg_s32_range().
Показать оригинальное описание (EN)
In the Linux kernel, the following vulnerability has been resolved: bpf: Reset register bounds before narrowing retval range in check_mem_access() When the BPF verifier processes a context load of an LSM hook return value, it calls __mark_reg_s32_range() to narrow the register to the hook's valid range. However, __mark_reg_s32_range() intersects the new range with the register's existing bounds using max_t()/min_t() rather than replacing them. If the destination register carries stale bounds from a prior instruction (e.g. BPF_MOV64_IMM), the intersection can produce a range narrower than reality. The verifier then believes it knows the register's exact value, while at runtime the actual hook return value is loaded, creating a verifier/runtime mismatch that can be used to bypass BPF memory safety checks. The else branch already calls mark_reg_unknown() to reset register state before any narrowing. Apply the same reset in the is_retval path so stale bounds are cleared before __mark_reg_s32_range() intersects.
Характеристики атаки
Последствия
Строка CVSS v3.1