Критические уязвимости в подсистеме eBPF ядра Linux

В подсистеме eBPF, позволяющей запускать обработчики для трассировки, анализа работы подсистем и управления трафиком, выполняемые внутри ядра в специальной виртуальной машине с JIT, выявлена серия уязвимостей, которые могут быть использованы локальным атакующим для запуска кода с правами ядра через загрузку специально оформленного eBPF-приложения.

Выявленные уязвимости проявляются в ядрах Linux 4.9+ и 4.14+, но в общем виде проблемы в eBPF представляют опасность начиная с ядра 4.4, в котором появилась возможность загрузки программ eBPF непривилегированными пользователями.

Так как помимо опубликованных исследователями прототипов эксплоитов в сети выявлено наличие публично доступного рабочего эксплоита для получения root-доступа через данные уязвимости, рекомендуется срочно отключить поддержку запуска eBPF непривилегированными пользователями при помощи «sysctl kernel.unprivileged_bpf_disabled=1», что приведёт к невозможности использования обычными пользователями средств трассировки и анализа производительности на базе eBPF.

Исправление пока доступно только в виде патчей, которые ещё не включены в основной состав ядра. Дистрибутивы пока не выпустили обновления: Debian, openSUSE, Fedora и Ubuntu. Проблемы не затрагивают ядро из состава SUSE Linux Enterprise и Red Hat Enterprise Linux 5, 6 и 7. Отмечается, что публично доступные эксплоиты корректно не работают в Debian 9 с ядром 4.9 (eBPF включен по умолчанию для обычных пользователей), но, по мнению разработчиков Debian, могут быть легко адаптированы для атаки.

Уязвимости вызваны семью ошибками (CVE-2017-16996), появившимися в ядре 4.14, и одной ошибкой в ядре 4.9 (CVE-2017-16995). Проблемы вызваны некорректным преобразованием типов и отсутствием должных проверок в коде верификации eBPF-приложений (bpf/verifier.c), что позволяет осуществлять управляемое чтение и запись в произвольные области памяти ядра. Ряд проблем вызван тем, что в проверочном вызове check_alu_op() не осуществляется разделение между операциями BPF_ALU64|BPF_MOV|BPF_K (знаковое заполнение при чтение 32-разрядных значений в 64-разрядные ячейки) и BPF_ALU|BPF_MOV|BPF_K (добавочное заполнение нулями). Другие проблемы связаны с некорректным обрезанием значений регистров при преобразовании в значения меньшего размера, отсутствием проверки выхода за границы и выравнивания указателя стека.

Источник: opennet.ru




(Visited 25 times, 1 visits today)

Добавить комментарий

Войти с помощью: