基于 eBPF 的运行时检测器,用于检测 runc 和 Docker 中的容器逃逸漏洞,通过监控系统调用和 Docker 守护进程调用,在构建和运行期间检测对 CVE-2024-21626、CVE-2024-23651、CVE-2024-23652 和 CVE-2024-23653 的利用。
此仓库现已归档。
代码将不再进行任何更新,当您阅读此通知时,它可能已不安全甚至无法使用。 请仅将其视为历史用途,并谨慎对待。

在此仓库中,您将找到基于 eBPF 的运行时检测参考实现,用于检测 runc 和 Docker 漏洞 CVE-2024-21626、CVE-2024-23651、CVE-2024-23652 和 CVE-2024-23653。它挂钩 Linux 系统调用(例如 chdir、mount)以及 Docker 守护进程的函数调用,并将其与 Docker 构建和容器进程关联起来,以识别对这些漏洞的利用。
如需基于静态分析的方法,请参阅此。
CVE-2024-21626 是 runc 容器运行时中的一个漏洞,攻击者可通过精心构造的镜像利用 WORKDIR 指令处理中的问题,突破容器隔离并在宿主机上实现完全 root RCE。由于宿主机某些文件描述符的打开与关闭之间存在“竞态”条件,攻击者可以创建一个包含 WORKDIR /proc/self/fd/[ID] 指令的 Dockerfile(其中 ID 为依赖系统的文件描述符),该指令将指向底层宿主机的文件系统。在以下情况下可被利用:
docker build - 有两种情况:
FROM 指令引用的基础镜像包含触发该漏洞利用的 ONBUILD 命令时,例如 ONBUILD WORKDIR /proc/self/fd/[ID]。ONBUILD 指令不会将命令注入包含它的镜像中,而是注入到将其作为基础镜像使用的镜像中。这意味着,如果基础镜像被攻破或故意作恶(例如托管在 Dockerhub 或其他公共容器注册表中),即使 docker build 命令实际构建的镜像没有任何变化,也可能被利用。docker run因此,该漏洞可能同时危及构建系统和生产环境。
CVE-2024-23651 是 Docker 中的一个漏洞,当 RUN 命令使用 --mount=cache 标志时触发。在检查 Docker 守护进程宿主机上 source 目录是否存在与实际调用 mount 系统调用之间存在时间检查/时间使用(TOCTOU)漏洞。攻击者能够构造一个 Dockerfile,在这两次调用之间植入符号链接,以诱导任意绑定挂载,从而在宿主机上实现完全 root RCE。
该漏洞仅影响 docker build 命令。
CVE-2024-23653 是 Docker 中的一个漏洞,当使用自定义 Buildkit LLB 生成器并配合 # syntax 指令时触发。该生成器可以使用 Client.NewContainer 和 Container.Start GRPC 调用在构建期间执行新容器。StartRequest.SecurityMode 参数未针对 Docker 守护进程或 docker build 调用的权限预期进行适当检查,这允许 GRPC 调用者在构建期间创建特权容器。随后可逃逸该新创建的特权容器,从而在构建宿主机上获得完全 root RCE。
该漏洞仅影响 docker build 命令。
CVE-2024-23652 是 Docker 中的一个任意删除漏洞。当 Dockerfile 中使用 RUN --mount 时,如果挂载目标不存在,则会为该环境创建该目标。执行完成后,该创建的目录将被清理。如果正在执行的命令将用于挂载的路径更改为符号链接,则清理过程将遍历该符号链接,并可能清理宿主机根文件系统中的任意目录。
该漏洞仅影响 docker build 命令。
构建时检测适用于全部 4 个漏洞。
GOOS=linux GOARCH={{amd64/arm64}} go build。sudo(eBPF 所需)在后台运行编译后的二进制文件(即 sudo ebpf-detector &)。STDOUT 上看到 Leaky vessels vulnerability detected,同时还会显示相应的 CVE、漏洞名称和额外的取证信息。运行时检测仅适用于 WORKDIR 漏洞(CVE-2024-21626)。
Dockerfile 构建检测器的容器镜像,并将其推送到镜像仓库。detector.yaml 中填写 image 值(标记为 TODO)。kubectl apply -f detector.yml 将检测器作为 DaemonSet 部署到 Kubernetes 集群中。Leaky Vessels vulnerability detected。单元测试需要在 sudo 下运行,因为它们依赖 eBPF:sudo go test ebpf-detector/...。
WORKDIR 漏洞利用(CVE-2024-21626)发生在容器初始化期间,因此无法在运行中的容器上检测到。该检测还假定容器运行时为 containerd。CVE-2024-23651)和 Buildkit 构建时容器拆除任意删除(CVE-2024-23652)的检测基于时序,可能因竞态条件而产生漏报。有关错误和问题的更新列表,请参阅项目问题页面。
欢迎贡献。详情请参阅 CONTRIBUTING.md。
Leaky Vessels 动态检测器采用 Apache-2.0 许可证。更多信息请参阅 LICENSE。