Feltehetjük, hogy a Linux kernel cgroups v1 erőforrás-korlátozó mechanizmusának (CVE-2022-0492) sebezhetőségének részletei kiderültek, amely felhasználható az izolált konténerekből való kilépéshez. A probléma a Linux kernel 2.6.24-től kezdődően lép fel, és a 5.16.12, 5.15.26, 5.10.97, 5.4.177, 4.19.229, 4.14.266 és 4.9.301 verziókban javították. Az egyes disztribúciók frissítéseiről az alábbi oldalakon lehet tájékozódni: Debian, SUSE, Ubuntu, RHEL, Fedora, Gentoo, Arch Linux.
A sebezhetőség egy logikai hibából ered, amely a release_agent fájl kezelőjében jelentkezik, mivel nem végeztek el megfelelő ellenőrzéseket a teljes jogosultságokkal rendelkező kezelő elindításakor. A release_agent fájl azt a programot határozza meg, amelyet a kernel a cgroup folyamatának befejezésekor végrehajt. Ez a program root jogosultságokkal és az összes „capability”-val a gyökér névtérben fut. Úgy volt, hogy a release_agent beállításához való hozzáférés csak az adminisztrátor részéről lehetséges, de a gyakorlatban az ellenőrzések a root felhasználó hozzáférésére korlátozódtak, ami lehetővé tette a beállítások konténerből vagy root felhasználóval történő módosítását adminisztrátori jogok nélküli (CAP_SYS_ADMIN) felhasználó által.
Korábban egy ilyen tulajdonság nem lett volna sebezhetőségként értékelhető, de a helyzet megváltozott a felhasználói névterek (user namespaces) megjelenésével, amelyek lehetővé teszik az egyedi root felhasználók létrehozását a konténerekben, a fő környezeti root felhasználóval való ütközés nélkül. Ennek megfelelően egy támadáshoz elegendő, ha egy konténerben, amely külön felhasználói névtérben rendelkezik saját root felhasználóval, csatlakoztatják a saját release_agent kezelőjüket, amely a folyamat befejezése után teljes jogosultságokkal fog futni a fő környezetben.
Alapértelmezés szerint a cgroupfs csak olvasható módban van csatolva a konténerben, de nincsenek problémák a pszeudo fájl rendszer írási módban való vissza-újracsatolásával, ha van CAP_SYS_ADMIN jogkör vagy a unshare rendszerhívás segítségével egy beágyazott konténert hoznak létre egy külön user namespace-szel, ahol az adott konténer számára elérhetők a CAP_SYS_ADMIN jogok.

A támadást a root jogosultságok birtokában, elszigetelt tartályban, vagy a no_new_privs jelző nélküli futtatáskor lehet végrehajtani, amely megakadályozza a további jogosultságok megszerzését. A rendszerben engedélyezve kell lennie a felhasználói névtartományok támogatásának (alapértelmezés szerint engedélyezve van az Ubuntu és a Fedora rendszerekben, de nem aktiválva a Debian és RHEL rendszerekben) és hozzáférés a gyökér cgroup v1-hez (például a Docker gyökér RDMA cgroup-ban indítja a tartályokat). A támadás akkor is lehetséges, ha rendelkezésre áll a CAP_SYS_ADMIN jogosultság, ebben az esetben a felhasználói névtartományok támogatása és a gyökér cgroup v1 hierarchiához való hozzáférés nem szükséges.
A zárt tartályból való kilépés mellett a sérülékenység lehetővé teszi a root felhasználó által 'capabilities' nélküli folyamatoknak, vagy bármely felhasználónak a CAP_DAC_OVERRIDE jogosultságokkal, hogy hozzáférjenek az összes rendszer 'capabilities'-hez (a támadáshoz hozzáférés szükséges a /sys/fs/cgroup/*/release_agent fájlhoz, amely a root birtokában van).
Megjegyzendő, hogy a sérülékenység nem használható ki, ha Seccomp, AppArmor vagy SELinux védelmi mechanizmusokat alkalmaznak a tartályok további elszigetelésére, mivel a Seccomp blokkolja az unshare() rendszerhívás elérését, míg az AppArmor és az SELinux nem engedi a cgroupfs írásbeli csatolását.
Forrás: opennet.ru
