В подсистеме eBPF, позволяющей запускать обработчики внутри ядра Linux в специальной виртуальной машине с JIT, выявлена уязвимость (CVE-2021-4204), дающая возможность локальному непривилегированному пользователю добиться повышения привилегий и выполнения своего кода на уровне ядра Linux. Проблема проявляется начиная с ядра Linux 5.8 и пока остаётся неисправленной (затрагивает в том числе выпуск 5.16). Состояние формирования обновлений с устранением проблемы в дистрибутивах можно отследить на данных страницах: Debian, RHEL, SUSE, Fedora, Ubuntu, Arch. Заявлено о создании рабочего эксплоита, который планируют опубликовать 18 января (пользователям и разработчикам дана неделя на устранение уязвимости).
Уязвимость вызвана некорректной проверкой передаваемых для выполнения eBPF-программ. Подсистема eBPF предоставляет вспомогательные функции, корректность использования которых проверяет специальный верификатор. Некоторые функции требуют передачи значения PTR_TO_MEM в качестве аргумента и для предотвращения возможных переполнений буфера верификатор должен знать размер связанной с аргументом памяти. Для функций bpf_ringbuf_submit и bpf_ringbuf_discard данные о размере передаваемой памяти не сообщались верификатору, что могло использоваться для перезаписи областей памяти за границей буфера при выполнении специально оформленного eBPF-кода.
Для проведения атаки пользователь должен иметь возможность загрузки своей BPF-программы, а многие свежие дистрибутивы Linux по умолчанию блокируют такую возможность (в том числе непривилегрированный доступ к eBPF теперь запрещён по умолчанию и в самом ядре, начиная с выпуска 5.16). Например, уязвимость может быть эксплуатирована в конфигурации по умолчанию в Ubuntu 20.04 LTS, но в окружениях Ubuntu 22.04-dev, Debian 11 и Fedora 33 проявляется только если администратор выставил параметр kernel.unprivileged_bpf_disabled в значение 0. В качестве обходного пути блокирования уязвимости можно запретить выполнение BPF-программ непривилегированным пользователям командой “sysctl -w kernel.unprivileged_bpf_disabled=1”.