作者:Trevor Jay
除了容器隔离固有的普遍挑战之外,Docker 还以其自动化获取和安装机制“docker pull”的形式带来了一个全新的攻击面。 这可能与直觉相反,但“docker pull”在一个步骤中同时获取和解包容器镜像。 没有验证步骤,令人惊讶的是,即使容器本身从未运行,格式错误的软件包也可能危害系统。 针对 Docker 的许多 CVE 问题都与可能导致安装时受损和/或 Docker 注册表出现问题的软件包有关。
一种现已解决的恶意问题可能危害系统的方式是在解包步骤期间通过简单的路径遍历。 通过简单地使用 tarball 解包到诸如“../../../”之类的路径的能力,恶意镜像能够覆盖他们想要的任何主机文件系统部分。
因此,当使用 Docker 镜像时,您可以保护自己的最重要的措施之一是确保您仅使用来自您信任的来源的内容,并将下载和解包/安装步骤分开。 最简单的方法就是不使用“docker pull”命令。 而是通过安全通道从可信来源下载您的 Docker 镜像,然后使用“docker load”命令。 大多数镜像提供商还通过安全或至少可验证的连接直接提供镜像。 例如,红帽提供 SSL 可访问的“容器镜像”。 Fedora 也为每个版本提供 Docker 镜像。
虽然 Fedora 并非所有镜像站点都提供 SSL,但它确实提供了 Docker 镜像的签名校验和,可以在您使用“docker load”之前使用它来验证镜像。
由于“docker pull”会自动解包镜像,而此解包过程本身通常会受到损害,因此拼写错误可能会导致系统受损(例如,当您打算使用“rhel”时,下载并解包了恶意的“rel”镜像)。 这种拼写错误问题也可能发生在 Dockerfile 中。 一种保护自己的方法是通过在防火墙层面阻止对 index.docker.io 的意外访问,或者通过添加以下 /etc/hosts 条目
127.0.0.1 index.docker.io
这将导致此类错误超时,而不是可能下载不需要的镜像。 您仍然可以通过显式提供注册表来对私有仓库使用“docker pull”
docker pull registry.somewhere.com/image
您可以在 Dockerfile 中使用类似的语法
from registry.somewhere.com/image
Docker 是一项了不起的技术,但它既不是安全万灵药,也不是互操作性万灵药。 镜像仍然需要来自能够证明其安全性、支持级别和兼容性的来源。
最初发布在红帽安全博客上。 经许可转载。
评论已关闭。