Docker漏洞总结
容器逃逸漏洞是云原生安全领域的核心威胁,攻击者通过利用这些漏洞可突破容器隔离环境,获取宿主机或集群控制权。
可以使用这个进行检测。检测脚本
一、容器运行时自身漏洞
此类漏洞源于容器引擎或运行时组件的设计缺陷。
-
CVE-2019-5736(runc逃逸)
- 影响版本:Docker ≤18.09.2,runc ≤1.0-rc6。
- 原理:runc 进程在启动容器时未正确隔离自身文件描述符,导致容器内恶意进程可覆盖宿主机的 runc 二进制文件,最终实现容器逃逸并获取宿主机 root 权限。
- CVE-2019-5736(runc逃逸)
-
CVE-2020-15257(containerd逃逸)
- 影响版本:containerd <1.3.9 或 <1.4.3。
- 原理:通过恶意容器构造特殊进程,利用 containerd-shim 进程的文件描述符(FD)管理缺陷,获取宿主机的敏感文件描述符,最终实现容器逃逸并访问宿主机资源。
- CVE-2020-15257(containerd逃逸)
二、Linux内核漏洞
容器共享宿主机内核,内核漏洞可被用于逃逸。
-
CVE-2016-5195(Dirty Cow)
- 影响版本:Linux内核 2.6.22–4.8.3。
- 原理:利用Linux写时复制(COW)机制竞争条件漏洞,覆盖只读内存页,实现本地提权并逃逸容器。
- CVE-2016-5195(Dirty Cow)
-
CVE-2021-22555(Netfilter堆溢出)
- 影响版本:Linux内核 2.6.19-rc1~5.12-rc8。
- 原理:Netfilter模块在处理32位进程的
sockopt
请求时发生堆溢出,攻击者通过堆喷(Heap Spraying)和UAF(Use-After-Free)技术控制内核内存,执行ROP链提权至root权限。 - CVE-2021-22555(Netfilter堆溢出)
-
CVE-2022-0847(Dirty Pipe)
- 影响版本:Linux内核 5.8–5.10.102、5.15.0–5.15.25、5.16.0–5.16.11。
- 原理:管道(pipe)缓冲区未初始化,攻击者覆盖宿主机敏感文件(如
/etc/passwd
或SSH密钥),实现权限提升。 - CVE-2022-0847(Dirty Pipe)
-
CVE-2022-0492(cgroup逃逸)
- 影响版本:linux内核 5.17-rc3
- 原理:利用cgroup v1的
release_agent
功能,通过挂载宿主机cgroup并触发恶意脚本,实现逃逸(需CAP_SYS_ADMIN
权能)。 - CVE-2022-0492(cgroup逃逸)
三、不安全配置导致的逃逸
错误配置为攻击者提供逃逸路径,非代码漏洞但危害严重。
-
特权容器(–privileged)
- 原理:启用
--privileged
标志的容器拥有宿主机所有权限,可直接操作宿主机设备(如挂载/dev/sda1
)或加载内核模块突破隔离。 - 特权容器逃逸(privileged)
- 原理:启用
-
挂载Docker Socket(/var/run/docker.sock)
- 原理:容器内挂载宿主机的Docker Socket文件后,攻击者可通过Docker API创建特权容器或直接执行宿主机命令。
- 挂载逃逸(Socket)
-
挂载逃逸(Procfs)
- 原理:若将宿主机的/proc目录挂载到容器内,攻击者可利用其core_pattern等机制实现逃逸
- 挂载逃逸(Procfs)
-
Docker API未授权访问
- 原理: Docker守护进程若暴露2375端口且无认证,攻击者可远程管理Docker。
- Docker API未授权访问
四、防御建议
- 及时更新容器运行时及内核补丁;
- 禁用特权容器和危险挂载;
- 使用安全沙箱(如gVisor)加强隔离;
- 部署eBPF监控工具(如Falco)检测逃逸行为
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Kaelthlog!