【Critical】docker unauthorized 2375

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 任务等恶意操作,进一步持久化攻击。

二、攻击过程:

  1. 暴露的 Docker 套接字: Docker 的 API 可以通过 TCP 端口(如 2375/2376)暴露。如果这些端口没有适当的身份验证机制,攻击者可以远程访问 Docker Daemon。
  2. 挂载宿主机的根目录 (/): 攻击者可以将宿主机的根文件系统挂载到容器中,从而获取对宿主机的完全访问权限。如果容器以 root 权限运行,攻击者就能修改宿主机上的文件,包括关键系统文件(如 /etc/cron.d/)。
  3. 持久化操作: 攻击者可以修改宿主机的定时任务(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
相关推荐
Trank-Lw5 小时前
Docker Devcontainer 管理命令
运维·docker·容器
科技观察6 小时前
告别镜像拉取困境:毫秒镜像以“正规军”姿态重塑国内Docker加速生态
运维·docker·容器
热爱生活的五柒6 小时前
docker里面的文件没有写入权限,也无法使用sudo。docker镜像里某个文件夹没有创建文件夹权限。如何解决?
运维·docker·容器
愈努力俞幸运8 小时前
windows 安装 docker
windows·docker·容器
2301_767902649 小时前
第 5 章 docker网络
网络·docker·php
huizhixue-IT9 小时前
收藏-Kubernetes怎么从私有仓库拉取镜像?(K8S系列)
云原生·容器·kubernetes
DB!!!9 小时前
【Dockerv1】高频十大面试题&&基础知识&&常用指令
docker·容器
守护砂之国泰裤辣11 小时前
React项目Docker部署的简单配置
运维·docker·容器
@Ma11 小时前
使用 Docker 部署 PostgreSQL + pgvector 完整步骤(映射端口 5433),适用于memu项目数据库支持!
docker·postgresql·容器