Вразливість у підсистемі ядра Linux Netfilter

У Netfilter, підсистемі ядра Linux, що використовується для фільтрації та модифікації мережевих пакетів, виявлено вразливість (CVE-2021-22555), що дозволяє локальному користувачеві отримати привілеї root в системі, у тому числі перебуваючи в ізольованому контейнері. Для тестування підготовлений робочий прототип експлоїту, що обходить механізми захисту KASLR, SMAP та SMEP. Дослідник, який виявив уразливість, отримав від Google винагороду, розміром 20 тисяч доларів, за виявлення методу обходу ізоляції контейнерів Kubernetes у кластері kCTF.

Проблема проявляється починаючи з ядра 2.6.19, випущеного 15 років тому, і викликана помилкою в обробниках IPT_SO_SET_REPLACE та IP6T_SO_SET_REPLACE, що призводить до переповнення буфера при надсиланні спеціально оформлених параметрів через виклик setsockopt в режимі compat. У звичайних умовах виклик compat_setsockopt() може виконати тільки користувач root, але необхідні для здійснення атаки повноваження також можуть бути отримані непривілейованим користувачем у системах із включеною підтримкою простору імен ідентифікаторів користувачів (user namespaces).

Користувач може створити контейнер з окремим користувачем root та з нього експлуатувати вразливість. Наприклад, user namespaces за замовчуванням включений до Ubuntu та Fedora, але не активований у Debian та RHEL. Патч із виправленням уразливості прийнято до складу ядра Linux 13 квітня. Оновлення пакетів вже сформовані проектами Debian, Arch Linux та Fedora. У Ubuntu, RHEL та SUSE оновлення на стадії підготовки.

Проблема виникає у функції xt_compat_target_from_user() через некоректний розрахунок розміру пам'яті при збереженні структур ядра після перетворення з 32-64-розрядне уявлення. Помилка дозволяє записати чотири нульові байти в будь-яку позицію за кордоном виділеного буфера, обмежену зсувом 0x4C. Зазначеної можливості виявилося достатньо створення експлоїту, що дозволяє домогтися отримання прав root — через очищення покажчика m_list->next у структурі msg_msg створювалися умови для звернення до даних після звільнення пам'яті (use-after-free), що потім використовувалося для отримання відомостей про адреси і зміни інших структур через маніпуляцію із системним викликом msgsnd().

Джерело: opennet.ru

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