--- tags: K8S資安 --- # CVE-2022-0492 Containers Escape Linux kernel出現了一個新的 cgroups 漏洞,代號為 CVE-2022-0492 ,該漏洞可能被濫用以跳脫容器,進而在主機上執行任意命令 ## 什麼是cgroups? cgroups 的全名叫做 Control Groups,是 Linux Kernel 中的功能,可以用來限制,控制與隔離 Process 所使用到的系統資源 Allow processes to be organized into hierarchical groups whose usage of various types of resources can then be limited and monitored ![](https://i.imgur.com/rX2RQhF.png) 參考 [第一千零一篇的 cgroups 介紹](https://medium.com/starbugs/%E7%AC%AC%E4%B8%80%E5%8D%83%E9%9B%B6%E4%B8%80%E7%AF%87%E7%9A%84-cgroups-%E4%BB%8B%E7%B4%B9-a1c5005be88c) Linux 支持兩種 cgroup 架構,稱為 v1 和 v2。此漏洞僅影響 cgroup v1,目前大多使用v1的架構 ## cgroups背景 Cgroups 通過 cgroupfs 進行管理,這是一個作為文件系統公開的管理 API,通常安裝在/sys/fs/cgroup下。通過在掛載的 cgroupfs 中創建和寫入文件和目錄,管理員可以創建 cgroup、控制對 cgroup 施加的約束、將process添加到某個 cgroup 等等 ## Root Cause Analysis – CVE-2022-0492 cgroups v1 的特性之一是release_agent文件。它允許administrators配置一個“release agent” program,該program將在 cgroup 中的進程終止時運行。這是通過將所需的發布代理路徑寫入release_agent文件來完成的,如下所示: `$ echo /bin/my-release-agent > /sys/fs/cgroup/memory/release_agent` 但由於 cgroups 內部缺少對 release_agent 文件的驗證,未能正確檢查設置 release_agent 文件的process是否具有管理權限,攻擊者可以利用該 cgroups v1 release_agent 功能來提升權限並意外繞過 Namespace隔離. 也就是說,如果這個 release_agent 文件被攻擊者掌握,那麼該 Linux kernel可以被強制調用在release_agent 中配置具有最高權限的任意二進位文件 —這意味著攻擊者可以完全接管機器。 因為 Linux 將release_agent文件的所有者設置為 root,所以只有 root 可以寫入它(或者可以通過CAP_DAC_OVERRIDE功能繞過文件權限檢查的進程)。因此,該漏洞僅允許 root 進程提升權限。 乍看之下,一個只能被 root 用戶利用的提權漏洞可能看起來很奇怪。在過去,這不會被視為安全問題。但今天以 root 身份運行並不一定意味著對機器的完全控制:在 root 用戶和包括功能、 Namespace和容器的完整權限之間存在一個灰色區域。在root process無法完全控制機器的這些場景中,CVE-2022-0492 成為一個嚴重的漏洞。 ## Am I Affected? In conclusion, a container can escape if it runs: 1. As the **root user**, or without the no_new_privs flag; and 2. Without AppArmor or SELinux; and 3. Without [Seccomp](https://szlin.me/2017/08/23/kernel_seccomp/); and 4. On a host that enables unprivileged user namespaces; and 5. In a root **v1 cgroup**.