Уразлівасць у 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_

Уразлівасць у 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

Дадаць каментар