Уязвимости в подсистеме eBPF ядра Linux

В подсистеме eBPF, позволяющей запускать обработчики для трассировки, анализа работы подсистем и управления трафиком, выполняемые внутри ядра Linux в специальной виртуальной машине с JIT, выявлена уязвимость (CVE-2021-29154), позволяющая локальному пользователю добиться выполнения свого кода на уровне ядра. Проблема проявляется вплоть до выпуска 5.11.12 (включительно) и ещё не исправлена в дистрибутивах (Debian, Ubuntu, RHEL, Fedora, SUSE, Arch). Исправление доступно в виде патча.

По заявлению исследователей, выявивших уязвимость, им удалось разработать рабочий прототип эксплоита для 32- и 64-разрядных систем x86, который может быть использован непривилегированным пользователем. При этом компания Red Hat отмечает, что опасность проблемы зависит от доступности пользователю системного вызова eBPF. Например, в RHEL и большинстве других дистрибутивов Linux в конфигурации по умолчанию уязвимость может быть эксплуатирована при включении BPF JIT и наличии у пользователя прав CAP_SYS_ADMIN. В качестве обходной меры защиты рекомендуется отключить BPF JIT при помощи команды:

echo 0 > /proc/sys/net/core/bpf_jit_enable

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

Примечательно, что это не единственная уязвимость в подсистеме BPF за последнее время. В конце марта в ядре были выявлены ещё две уязвимости (CVE-2020-27170, CVE-2020-27171), позволяющие использовать BPF для обхода защиты от уязвимостей класса Spectre, позволяющих определять содержимое памяти ядра в результате создания условий для спекулятивного выполнения определённых операций. Указанные проблемы уже устранены в выпуске 5.11.8. Исследователями подготовлен протитип эксплоита, позволяющего непривилегированному пользователю извлечь данные из памяти ядра.

Первая уязвимость (CVE-2020-27170) вызвана наличием манипуляций с указателями, вызывающими спекулятивные операции обращения к области вне границ буфера. Вторая уязвимость (CVE-2020-27171) связана с ошибкой целочисленной арифметики (integer underflow), при работе с указателями, приводящей к спекулятивному обращению к данным вне буфера.

Release. Ссылка here.