---
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

參考 [第一千零一篇的 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**.