Вразливість у cgroups v1, що дозволяє вийти із ізольованого контейнера

Розкрито деталі вразливості (CVE-2022-0492) у реалізації механізму обмеження ресурсів cgroups v1 у ядрі Linux, яка може використовуватися для виходу із ізольованих контейнерів. Проблема проявляється починаючи з ядра Linux 2.6.24 і усунена у випусках ядра 5.16.12, 5.15.26, 5.10.97, 5.4.177, 4.19.229, 4.14.266 та 4.9.301. Простежити за публікаціями оновлення пакетів у дистрибутивах можна на цих сторінках: Debian, SUSE, Ubuntu, RHEL, Fedora, Gentoo, Arch Linux.

Уразливість викликана логічною помилкою в обробнику файлів release_agent, через яку не виконувались належні перевірки під час запуску обробника з повним набором повноважень. Файл release_agent використовується для визначення програми, яку виконує ядро ​​при завершенні процесу в cgroup. Ця програма запускається з правами root та з усіма «capabilities» у кореневому просторі імен. Передбачалося, що доступ до налаштування release_agent має тільки адміністратор, але насправді перевірки обмежувалися наданням доступу користувачеві root, що не виключало змін налаштування з контейнера або користувачем root без прав адміністратора (CAP_SYS_ADMIN).

Раніше подібна особливість не була сприйнята як вразливість, але ситуація змінилася з появою просторів імен ідентифікаторів користувачів (user namespaces), які дозволяють створювати в контейнерах окремих користувачів root, які не перетинаються з користувачем root основного оточення. Відповідно для атаки достатньо в контейнері, що має свого користувача root в окремому просторі ідентифікаторів користувачів, підключити свій обробник release_agent, який після завершення процесу буде виконаний з повними привілеями основного оточення.

За умовчанням cgroupfs монтується в контейнері в режимі тільки для читання, але немає проблем перемонтувати цю псевдофс в режимі запису за наявності прав CAP_SYS_ADMIN або через створення за допомогою системного виклику unshare вкладеного контейнера з окремим user namespace, в якому для створеного контейнера доступні права CAP_SYS_AD.

Вразливість у cgroups v1, що дозволяє вийти із ізольованого контейнера

Атака може бути здійснена за наявності root-повноважень в ізольованому контейнері або запуску контейнера без прапора no_new_privs, що забороняє отримання додаткових привілеїв. У системі повинна бути включена підтримка user namespaces (за замовчуванням включена в Ubuntu і Fedora, але не активована в Debian і RHEL) і бути доступний до кореневого cgroup v1 (наприклад Docker запускає контейнери в кореневому RDMA cgroup). Атака також можлива за наявності привілеїв CAP_SYS_ADMIN, в цьому випадку підтримка user namespaces і доступ до кореневої ієрархії cgroup v1 не потрібний.

Крім виходу з ізольованого контейнера вразливість також дозволяє процесам, запущеним користувачем root без capabilities або будь-яким користувачем з правами CAP_DAC_OVERRIDE (для атаки потрібен доступ до файлу /sys/fs/cgroup/*/release_agent, який належить root), отримати доступ до всіх системним "capabilities".

Зазначається, що вразливість не може бути експлуатована при застосуванні механізмів захисту Seccomp, AppArmor або SELinux для додаткової ізоляції контейнерів, тому що Seccomp блокує звернення до системного виклику unshare(), а AppArmor та SELinux не дозволяють вмонтувати cgroupfs у режимі запису.

Джерело: opennet.ru

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