一、漏洞概述
漏洞名称:Docker Engine AuthZ 插件授权绕过漏洞 (CVE-2024-41110)
漏洞等级:高危
漏洞描述:DockerEngine是Docker的核心组件,是一 个开源的容器引擎,负责构建、运行和管理容器。Docker Engine 的 AuthZ 插件是一种用于实现Docker访问控制机制 的插件,可以实现对Docker API的细粒度访问控制,增强 Docker 的安全性。当配置为使用AuthZ插件时存在授权绕过 漏洞,威胁者可以通过将 Content-Length 设置为 0 的 API 请求来利用该漏洞,导致 Docker 守护进程将没有正文 的请求转发给AuthZ 插件,AuthZ插件可能会错误地批准该 请求,从而导致执行未授权操作,如权限提升等。
二、影响范围
Docker Engine >= v19.03.x 且使用AuthZ 插件的用户 易受该漏洞影响,不使用AuthZ插件或运行旧版 Docker Engine 的用户不易受到影响,以下产品可能包含受影响的 Docker Engine 版本:
Docker-CE <= v19.03.15Docker-CE <= v20.10.27Docker-CE <= v23.0.14Docker-CE <= v24.0.9Docker-CE <= v25.0.5Docker-CE <= v26.0.2Docker-CE <= v26.1.4Docker-CE <= v27.0.3Docker-CE <= v27.1.0Docker Desktop <= v4.32.0
注:Docker Engine 的 AuthZ 插件在DockerCE或Docker Desktop 中通常是可选插件。Docker EE v19.03.x 和 Mirantis Container Runtime 所有版本不受该漏洞影响
三、修复建议
升级版本 目前该漏洞已经修复,受影响用户可升级到以下版本: Docker Engine:升级到最新修复版本。 Docker-CE:升级到v27.1.1 及更高版本,或升级到相应分支版本的补丁版本。 Docker Desktop:升级到Docker Desktop 4.33(暂未发布)或更高版本。
下载链接: https://download.docker.com/linux/
临时措施 如无法立即更新,可实施以下缓解措施:
1.避免使用 AuthZ 插件。
2.确保只有受信任的实体能够访问DockerAPI,并遵循 最小权限原则。
参考链接: https://github.com/moby/moby/security/advisories/GHSA-v23v-6jw2-98fq
四、扩展信息
Moby 项目与 Docker 的关系
-
Docker 与 Moby: Docker 项目最初是从 Moby 项目中分离出来的,但后来两者之间的界限变得模糊。实际上,Docker 现在使用 Moby 项目中的组件作为其核心部分。
-
Docker CE: Docker Community Edition (CE) 是基于 Moby 项目构建的,它包含了 Moby 项目中的核心组件。
-
Moby 项目的独立性: Moby 项目可以独立于 Docker 运行,这意味着您可以使用 Moby 项目中的组件构建自己的容器化解决方案。
我们无法从Docker 产品发版信息处看到修复“CVE-2024-41110”的信息,但是从最新版本Moby可以看到修复了该漏洞,Moby的最新版本是25.0.6,而Docker CE的最新版本是v27.1.1。
Docker的插件
https://docs.docker.com/engine/extend/legacy_plugins/
Docker没有自己设计一套权限管理机制,而是设计了一套权限管理插件的机制,允许第三方的开发者自行设计权限管理的架构、模型、策略格式,然后通过统一的插件接口接入Docker,为Docker提供权限管理的服务。
Docker设计定义了Network plugins、Volume plugins、Authorization plugins三类插件的接口。插件的实现由第三方来完成。本次漏洞涉及的插件就是Authorization plugins,从官网信息上可知,有两类AuthZ实现。本次漏洞应该不是第三方插件实现本身有漏洞,否则也不会跟Docker Engine有关,应该是Docker定义的接口的漏洞。所以,不配置插件,也不会触发漏洞。
这里需要介绍一下Casbin项目。Casbin是一个国产开源项目,专注于解决Go语言中的权限管理问题。Casbin由北京大学罗杨博士在2017年4月发起,罗杨博士的研究方向为云计算访问控制,目前已发表数十篇相关学术论文,曾经在ICWS、IEEE CLOUD、ICICS等多个顶级学术会议进行论文宣讲。Casbin项目则是其研究成果的落地。Casbin(https://github.com/casbin/casbin)作为目前Golang语言中最主流的访问控制、权限管理开源库,也实现了一个Docker的Authorization Plugin,叫做:Casbin-authz-plugin。
另外,默认Docker并不会开启远程访问,只通过本机的socket,接受Docker命令访问。而Authorization plugins,不只是进行远程访问控制,对本地docker命令也会进行控制。例如定义了访问控制策略之后:
https://github.com/casbin/docker-casbin-plugin
basic_policy.csvp, /v1.27/images/json, GET
上面的策略表示:grants anyone to perform GET
on /v1.27/images/json
,and deny all other requests. 所以效果如下:
$ docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEhello-world latest 48b5124b2768 3 months ago 1.84 kB$ docker infoError response from daemon: authorization denied by plugin casbin-authz-plugin: Access denied by casbin plugin
Docker 是否安装插件,可以通过 docker plugins ls查看,或者直接查看如下路径:
/run/docker/plugins
/etc/docker/plugins
/usr/lib/docker/plugins
https://docs.docker.com/engine/extend/plugins_authorization/
本来打算安装一下插件,但是需要FanQ(你懂的~~),就打消了这个念头。