Идентифицирани са две нови уязвимости в подсистемата eBPF, която позволява изпълнението на обработващи функции в ядрото на Linux в специализирана виртуална машина с JIT. И двете уязвимости дават възможност за изпълнение на собствен код с права на ядрото, извън изолираната виртуална машина eBPF. Информация за проблемите публикува екипът на Zero Day Initiative, който провежда състезанията Pwn2Own, по време на които тази година бяха демонстрирани три атаки на Ubuntu Linux, използващи преди това неизвестни уязвимости (дали уязвимостите в eBPF са свързани с тези атаки не се съобщава).
- CVE-2021-3490 — уязвимостта е причинена от липсата на проверка за излизане извън границите на 32-битовите стойности при изпълнение на битови операции AND, OR и XOR в eBPF ALU32. Нападателят може да използва този проблем, за да чете и записва данни извън границите на заделен буфер. Проблемът с операцията XOR се проявява от версия на ядрото 5.7-rc1, а AND и OR — от версия 5.10-rc1.
- CVE-2021-3489 — уязвимостта е причинена от грешка в реализацията на цикличния буфер и е свързана с факта, че функцията bpf_ringbuf_reserve не е проверявала дали заделената област памет може да е по-малка от действителния размер на цикличния буфер ringbuf. Проблемът се проявява от версия 5.8-rc1.
Статусът на поправките за уязвимостите в дистрибуциите може да се проследи на следните страници: Ubuntu, Debian, RHEL, Fedora, SUSE, Arch). Поправките са налични и под формата на пачове (CVE-2021-3489, CVE-2021-3490). Възможността за експлоатация на проблема зависи от наличието на системен повик eBPF за потребителя. Например, в конфигурацията по подразбиране в RHEL, за да се експлоатира уязвимостта, потребителят трябва да има права CAP_SYS_ADMIN.
Отделно може да се спомене още една уязвимост в ядрото на Linux — CVE-2021-32606, позволяваща на локален потребител да повиши правата си до ниво root. Проблемът се проявява от ядрото на Linux 5.11 и е причинен от състояние на състезание в реализацията на протокола CAN ISOTP, което дава възможност за промяна на параметрите на свързването в сокета поради липсата на задължителни блокировки в функцията isotp_setsockopt() при обработка на флага CAN_ISOTP_SF_BROADCAST.
След затварянето на сокета ISOTP, привързаността към сокета получател остава активна, което позволява продължаване на използването на свързаните с сокета структури дори след освобождаването на свързаната с тях памет (use-after-free, причинено от извикването на isotp_rcv() с вече освободената структура isotp_sock). Чрез манипулации с данни е възможно да се преопредели указателя към функцията sk_error_report() и да се изпълни собствен код на ядрото.
Източник: opennet.ru
