В подсистемата 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 се проявява само ако администраторът е задал параметъра kernel.unprivileged_bpf_disabled на стойност 0. Като обходен път за блокиране на уязвимостта може да се забрани изпълнението на BPF-програми от непривилегировани потребители с командата „sysctl -w kernel.unprivileged_bpf_disabled=1“.
Източник: opennet.ru
