编程技术分享平台

网站首页 > 技术教程 正文

Docker容器的攻击思路以及防护策略

xnh888 2024-10-16 17:42:34 技术教程 20 ℃ 0 评论

01 Docker 架构


如果你正在阅读这篇文章,我想你知道 Docker 是如何工作的,但是让我们快速回顾一下主要概念:


Docker 客户端

这是用户通常使用较多的部分,客户端是 Docker 守护进程的 CLI,它有助于管理容器、镜像和注册表。


它还可用于管理容器使用的网络和卷。


您可以在 Docker 客户端中使用的一些命令:


#RUN A NGINX CONTAINER WITH PORT 80 BINDING HOST-CONTAINER
docker run -d -p 80:80 nginx


#PULL UBUNTU 22.04 DOCKER IMAGE
docker pull ubuntu:22.04


#SHOWS DOCKER IMAGES IN YOUR DOCKER SYSTEM
docker images


#HELPER FOR DOCKER NETWORKS
docker network


#HELPER FOR DOCKER VOLUMES
docker volume

Docker 守护进程

Docker 守护进程实际上是 docker 环境的核心,它运行容器,拉取镜像并管理所有的网络和卷。


你可以通过客户端使用 Docker 守护进程,或者如果你想让事情变得困难,你可以直接连接到 Docker 套接字。它会监听 API 请求。


Docker 镜像仓库

Docker 镜像仓库是存储 Docker 镜像的地方。默认情况下,Docker 检查 Docker Hub 中的镜像,但如果配置了镜像,将从设置的镜像仓库中拉取镜像。此外,镜像仓库可以是公共的或私有的,并带有身份验证。



02 Docker环境面临的威胁


Docker 套接字

Docker 套接字 /var/run/docker.sock 是 Docker 正在侦听的 UNIX 套接字,它由 root 用户所有,这是 Docker API 的主要入口点。


攻击者可以向 Docker 守护进程(在 Docker 主机上以 root 身份运行)发出请求,


docker run -d -v /var/run/docker.sock:/var/run/docker.sock <image_name>:<image_tag>
以便:    

启动一个特权容器并突破它;

拉一个公共的后门镜像,运行它并进入它进行突破。


攻击示例:


find / -name docker.sock 2>/dev/null
docker images
docker run -it -v /:/host <image_name>:<image_tag> chroot /host bash

Docker socket 可以是本地的,正如我们在上面看到的。如果你使用这个标志运行你的 docker 守护进程,它甚至可以暴露在互联网上:


docker -H tcp://0.0.0.0:XXX

在这种情况下,Docker 套接字将暴露给 XXX 中指定的端口,并且可以从互联网访问。



特权容器

默认情况下,Docker 容器是“非特权”的,例如,不能在 Docker 容器内运行 Docker 守护进程。


—privileged 标志赋予容器所有的能力。当操作员执行 docker run — privileged 时,Docker 将启用对主机上所有设备的访问,并在 AppArmor 或 SELinux 中设置一些配置,以允许容器几乎与在主机上容器外运行的进程一样访问主机。


docker run -d --privileged <image_name>:<image_tag>

攻击者可以挂载主机文件系统并使用 chroot 访问主机。

攻击示例:


capsh --print
fdisk -l
mount /target/disk /mnt/
chroot /mnt/ bash

能力滥用

一般来说,你应该检查容器的能力,如果它有以下任何一个,你可能能够从它中突破或做坏事(利用时间很长并且在每个场景中都不同):


CAP_SYS_ADMIN
CAP_SYS_PTRACE
CAP_SYS_MODULE
DAC_READ_SEARCH
DAC_OVERRIDE
CAP_SYS_RAWIO
CAP_SYSLOG
CAP_NET_RAW
CAP_NET_ADMIN
您可以使用以下方法检查当前容器的功能:

capsh --print共享网络
docker run -d --network host <image_name>:<image_tag>

最初立足于易受攻击容器的攻击者可以转向其他容器。如果有管理容器,例如 Portainer,攻击者可以使用它们来实例化可用于突破的特权容器。


您可以发现执行如下命令查看Docker 网络的接口:


ip addr

主机主要创建一个接口作为 Docker 网络的网关,通常,该范围的第一个 IP 地址用于此功能。默认情况下,Docker 网络的 IP 范围是 172.17.0.0/16,宿主机的 IP 地址是 172.17.0.1。如果容器的 IP 地址是 172.17.0.1,那么可以断定容器共享宿主机网络命名空间。


滥用组成员资格

Docker 组的成员可以运行 Docker 操作,此选项允许所有非 root 用户使用 Docker,假设 Docker 守护进程以 root 身份运行。但是,此成员身份可能会被滥用以在 Docker 主机上执行权限提升。


检查用户是否可以执行 Docker 操作并通过检查 /etc/group 文件验证它:


docker images
cat /etc/group | grep docker

容器滥用

如果宿主机上运行着 Containerd 守护进程并且安装了 ctr 程序,那么它可能会被滥用来攻击宿主机并获得 root 权限。


ctr 程序可以由主机上的其他用户使用(如果可用)。


攻击可以向以 root 权限运行的 Containerd 守护进程发出请求,运行容器并将主机文件系统挂载到它,然后使用 chroot 从容器内部获取 root 访问权限。


runc 滥用

如果机器上安装了runc,任何人都可以运行runc命令,那么它就可以被滥用来攻击主机并获得root权限。


攻击者可以向以 root 权限运行的 runc 守护进程发出请求,运行容器并将主机文件系统挂载到它,使用 chroot 从容器内部获取 root 访问权限。


管理工具滥用

如果管理工具,例如 Portainer,正在使用弱密码运行或易受攻击,这可能导致主机接管。


攻击者可以登录它,启动一个特权容器,并从新启动的容器内部 chroot 到主机文件系统。


vulns 或 psw


不安全的 Docker 镜像仓库

如果私有 Docker 镜像仓库未使用身份验证,或者不够强大,则可能会受到攻击。


攻击者可以在不使用 Docker 的情况下与 Docker 镜像仓库交互,与其机器交互并下载图像。


信息收集:


curl http://<target_registry>:5000/v2/_catalog
curl http://<target_registry>:5000/v2/<repository_name>/tags/list
curl http://<target_registry>:5000/v2/<repository_name>/manifests/<tag>
curl -s http://<target_registry>:5000/v2/<repository_name>/blobs/<blobSum_value> --output <output_filename>.tar
假镜像(后门)

攻击者可以从镜像仓库中拉取原始镜像,了解其结构并创建一个带有后门的新镜像。然后攻击者可以覆盖 Docker 镜像仓库中的镜像并等待某人/某物部署它。


攻击者可以从镜像仓库中提取一个多用途镜像,了解其结构并制作它以在部署后为攻击者提供 shell 访问权限。然后攻击者可以覆盖 Docker 镜像仓库中的镜像并等待某人/某物部署它。 此时,此处描述的技术可用于在 Docker 主机上获得 root 访问权限。




03 Docker安全审计


审核 Docker 套接字并保护它


检查 UNIX 套接字的权限:其他人不应有任何访问权限。
检查 TCP 套接字并确保 TCP 套接字仅在本地接口上侦听,或者在其上部署了身份验证。

默认 Docker TCP 套接字不受保护,例如 tcp://<host_ip>:2375,所以我们需要实现:


身份验证    
加密通信隧道

如何实现?


使用 SSH    
使用 TLS(TCP 端口 2376)

审核 Docker 组

检查成员(/etc/group):非成员将无法访问 Docker。


审核 Docker 配置

检查是否存在允许的不安全注册表 (/etc/docker/daemon.json)。


Docker 安全工具

https://github.com/docker/docker-bench-security
https://github.com/kost/dockscan
https://github.com/genuinetools/amicontained




04 容器保护


Seccomp

Seccomp(安全计算模式)是 Linux 内核的一项功能,充当系统调用过滤器。它不是沙箱,但经常与沙箱一起使用以阻止系统调用。


Docker 支持 Seccomp-eBPF(模式 2),以限制来自容器的系统调用,有效地减少表面积。Seccomp 配置文件可以以 JSON 文件的形式定义。Docker 的默认 Seccomp 配置文件是一个阻止 44 个系统调用的白名单。


AppArmor

AppArmor 是一种内核增强功能,可将程序限制在一组有限的资源中。将访问控制属性绑定到程序,而不是用户。


用户命名空间重映射

此技术允许将容器用户映射到主机的不存在的用户 ID。例如。容器中的 root,UID = 0,主机上的同一用户,UID = 27072;由于用户不存在,没有特权!


影响:


没有特权模式;
没有使用绑定挂载的 chroot。

了解更多:

https://docs.docker.com/engine/security/userns-remap/


Rootless模式

可以将 Docker 守护进程运行到 rootless 模式。不幸的是,存在一些已知限制:

https://docs.docker.com/engine/security/rootless/#known-limitations



05 结论


1、如果不被滥用,Docker 容器提供了一种将应用程序与底层主机系统隔离的安全方法。

2、确保 Docker 中使用的所有图像都来自可信来源并定期更新非常重要。

3、保护 Docker 守护进程、容器镜像和容器是确保在 Docker 中运行的应用程序安全的重要步骤。

4、实施基于角色的访问控制和监控有助于确保安全地使用 Docker。

5、不要忘记主机安全!



参考及来源:

https://infosecwriteups.com/attacking-and-securing-docker-containers-cc8c80f05b5b




06 免责&版权声明


安全小白团是帮助用户了解信息安全技术、安全漏洞相关信息的微信公众号。安全小白团提供的程序(方法)可能带有攻击性,仅供安全研究与教学之用,用户将其信息做其他用途,由用户承担全部法律及连带责任,安全小白团不承担任何法律及连带责任。欢迎大家转载,转载请注明出处。如有侵权烦请告知,我们会立即删除并致歉。谢谢!

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表