bash
Description
Utilizing Docker via unprotected tcp socket (2375/tcp, maybe 2376/tcp with tls but without tls-auth), an attacker can create a Docker container with the '/' path mounted with read/write permissions on the host server that is running the Docker container. As the Docker container executes command as uid 0 it is honored by the host operating system allowing the attacker to edit/create files owned by root. This exploit abuses this to creates a cron job in the '/etc/cron.d/' path of the host server. The Docker image should exist on the target system or be a valid image from hub.docker.com.
Impact
Unauthorized users can directly access all information in the database, causing serious information leakage.
Solution
Bind 2375 to 127.0.0.1

一、问题描述

这个漏洞描述了通过未保护的 Docker TCP 套接字(2375/tcp,可能是 2376/tcp 但没有启用 TLS 身份验证)来攻击,攻击者可以创建一个 Docker 容器并将宿主机的根路径 (/) 挂载到容器中,且容器有读写权限。由于容器中的进程通常以 uid 0(即 root 用户身份)运行,攻击者可以利用这一点修改宿主机上的文件,创建一个 cron 任务等恶意操作,进一步持久化攻击。
二、攻击过程:
- 暴露的 Docker 套接字: Docker 的 API 可以通过 TCP 端口(如 2375/2376)暴露。如果这些端口没有适当的身份验证机制,攻击者可以远程访问 Docker Daemon。
- 挂载宿主机的根目录 (/): 攻击者可以将宿主机的根文件系统挂载到容器中,从而获取对宿主机的完全访问权限。如果容器以 root 权限运行,攻击者就能修改宿主机上的文件,包括关键系统文件(如 /etc/cron.d/)。
- 持久化操作: 攻击者可以修改宿主机的定时任务(cron)配置文件等,从而让恶意命令在宿主机上定期执行,维持对宿主机的控制。
三、解决方案:
1. 保护 Docker 套接字(2375/2376 端口):
- **禁用远程 Docker API 访问:**如果没有特定需要,应该完全禁用通过 TCP 暴露 Docker 的功能。将 Docker 只绑定到 Unix 套接字(/var/run/docker.sock),这样可以减少暴露风险。
- **启用 TLS 加密:**如果必须远程访问 Docker API,确保启用 TLS 加密,并要求客户端认证。可以配置 Docker 在 2376 端口上启用 TLS 加密。
配置 Docker 启动时启用 TLS(假设已设置证书):
bash
DOCKER_OPTS="--host=tcp://0.0.0.0:2376 --tlsverify --tlscert=/etc/docker/cert.pem --tlskey=/etc/docker/key.pem --tlscacert=/etc/docker/ca.pem"
这样可以确保只有持有有效证书的客户端能够连接到 Docker 服务。
2. 限制容器权限:
- 避免容器以 root 用户运行: 除非绝对必要,否则应避免以 root 用户运行 Docker 容器。可以通过在 Dockerfile 中设置 USER 指令,或在启动容器时使用 --user 参数指定运行的非 root 用户。
- 使用 Docker 安全配置:
- AppArmor 或 SELinux:使用 AppArmor(Ubuntu)或 SELinux(CentOS/RHEL)对容器进行安全策略的约束,限制容器的权限。
- Seccomp: Docker 提供了内置的 Seccomp 配置文件,可以限制容器可调用的系统调用。建议使用默认的 Seccomp 配置文件,或者根据需要定义更严格的配置文件。
3.限制对 Docker Daemon 的访问:
- -Unix 套接字权限: 限制 /var/run/docker.sock 的权限,只允许必须的用户(通常是 root 或 docker 组的成员)访问 Docker 套接字。
- 防火墙限制: 如果必须启用 TCP 访问,可以使用防火墙(例如 iptables)限制访问 Docker 套接字的 IP 地址或子网。
4.监控 Docker 容器活动:
- Docker 内容信任(DCT): 使用 Docker 内容信任来签署和验证 Docker 镜像,防止使用未验证的镜像。
- 监控容器活动: 使用如 Docker 审计日志 等工具,或使用第三方监控解决方案(如 Falco、Aqua Security、Sysdig)来实时检测不安全的行为。
5.将 Docker 放在隔离环境中:
- 使用虚拟机或容器内容器: 考虑将 Docker 运行在虚拟机中,或使用更强的隔离机制来限制攻击的传播。
- 只读文件系统: 对关键文件(如 /etc)使用 Docker 挂载时设置为只读,防止容器修改宿主机上的重要文件。
6. 定期更新 Docker 和宿主操作系统:
- 确保 Docker 和宿主操作系统的安全更新,及时修复已知的漏洞。
- 使用 Docker 的最新版本,避免使用存在已知漏洞的旧版本。
Docker 安全命令示例:
1、禁用远程访问(只绑定到 Unix 套接字):
编辑 /etc/docker/daemon.json:
bash
{
"hosts": ["unix:///var/run/docker.sock"]
}
然后重启 Docker:
bash
sudo systemctl restart docker
2、以非 root 用户运行容器:
例如,运行容器时指定用户:
bash
docker run --user 1001:1001 myimage
3、使用 SELinux 或 AppArmor 配置:
运行容器时使用 --security-opt 指定安全配置文件:
bash
docker run --security-opt seccomp=default.json myimage
4、设置 Docker 套接字权限:
限制对 /var/run/docker.sock 的访问:
bash
sudo chmod 660 /var/run/docker.sock
sudo chown root:docker /var/run/docker.sock