Chyba zabezpečení v cgroups v1 umožňující opuštění izolovaného kontejneru

Byly zveřejněny podrobnosti o zranitelnosti (CVE-2022-0492) v implementaci mechanismu omezení prostředků cgroups v1 v jádře Linuxu, kterou lze použít k úniku z izolovaných kontejnerů. Problém se vyskytuje od jádra Linuxu 2.6.24 a byl opraven ve vydáních jádra 5.16.12, 5.15.26, 5.10.97, 5.4.177, 4.19.229, 4.14.266 a 4.9.301. Publikace aktualizací balíčků v distribucích můžete sledovat na těchto stránkách: Debian, SUSE, Ubuntu, RHEL, Fedora, Gentoo, Arch Linux.

Tato chyba zabezpečení je způsobena logickou chybou v obslužné rutině souboru release_agent, která neprovádí řádné kontroly při spuštění obslužné rutiny s úplnými oprávněními. Soubor release_agent se používá k definování programu, který má být spuštěn jádrem při ukončení procesu v cgroup. Tento program běží jako root a se všemi „schopnostmi“ v kořenovém jmenném prostoru. Předpokládalo se, že k nastavení release_agent má přístup pouze administrátor, ale ve skutečnosti byly kontroly omezeny na udělení přístupu uživateli root, což nevylučovalo změnu nastavení z kontejneru nebo uživatele root bez administrátorských práv (CAP_SYS_ADMIN ).

Dříve by taková funkce nebyla vnímána jako zranitelnost, ale situace se změnila s příchodem uživatelských jmenných prostorů (user namespace), které umožňují vytvářet samostatné uživatele root v kontejnerech, které se nepřekrývají s uživatelem root hlavní prostředí. V souladu s tím pro útok stačí připojit váš handler release_agent v kontejneru, který má svého vlastního uživatele root v samostatném prostoru ID uživatele, který bude po dokončení procesu spuštěn s plnými právy hlavního prostředí.

Ve výchozím nastavení je cgroupfs připojen do kontejneru v režimu pouze pro čtení, ale není problém znovu připojit tento pseudofs v režimu zápisu, pokud máte práva CAP_SYS_ADMIN nebo vytvořením vnořeného kontejneru se samostatným uživatelským jmenným prostorem pomocí systémového volání unshare, ve kterém Pro vytvořený kontejner jsou k dispozici práva CAP_SYS_ADMIN.

Chyba zabezpečení v cgroups v1 umožňující opuštění izolovaného kontejneru

Útok lze provést, pokud máte oprávnění root v izolovaném kontejneru nebo při spuštění kontejneru bez příznaku no_new_privs, který zakazuje získání dalších oprávnění. Systém musí mít povolenou podporu pro uživatelské jmenné prostory (ve výchozím nastavení povolenou v Ubuntu a Fedoře, ale neaktivovanou v Debianu a RHEL) a musí mít přístup ke kořenové cgroup v1 (například Docker spouští kontejnery v kořenové cgroup RDMA). Útok je také možný, pokud máte oprávnění CAP_SYS_ADMIN, v takovém případě není vyžadována podpora pro uživatelské jmenné prostory a přístup ke kořenové hierarchii cgroup v1.

Kromě úniku z izolovaného kontejneru umožňuje zranitelnost také procesy spouštěné uživatelem root bez „schopností“ nebo jakýmkoli uživatelem s právy CAP_DAC_OVERRIDE (útok vyžaduje přístup k souboru /sys/fs/cgroup/*/release_agent, což je vlastněné rootem), abyste získali přístup ke všem systémovým „schopnostem“.

Je třeba poznamenat, že tuto chybu zabezpečení nelze zneužít při použití ochranných mechanismů Seccomp, AppArmor nebo SELinux pro další izolaci kontejnerů, protože Seccomp blokuje přístup k systémovému volání unshare() a AppArmor a SELinux neumožňují připojení cgroupfs v režimu zápisu.

Zdroj: opennet.ru

Přidat komentář