Уразливість у підсистемі eBPF, що дозволяє виконати код на рівні ядра Linux

У підсистемі 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, openSUSE 15.3, RHEL 8.5, SUSE 15-SP4 і Fedora 33 виявляється лише якщо на значення 0. Як обхідний шлях блокування вразливості можна заборонити виконання BPF-програм непривілейованим користувачам командою "sysctl -w kernel.unprivileged_bpf_disabled=1".

Джерело: opennet.ru

Додати коментар або відгук