Docker 镜像可以将任意二进制文件和库捆绑到单个数据块中。检查图像中的实际内容可帮助您评估其适用性并识别任何安全隐患。
探索图像内容的最简单方法包括启动容器、获取 shell 会话,然后使用常规终端命令(如ls
和 )cd
从内部查看其目录结构。不过,这在安全关键环境中并不理想——创建具有未知图像的容器可能会使您暴露于恶意入口点脚本。
以下是可用于在不启动容器的情况下检查图像文件的技术。
在不启动的情况下创建容器
docker create
是一个鲜为人知的对应物docker run
。它在不启动的情况下在给定图像上创建一个新容器。您可以稍后使用该docker start
命令启动它。
创建一个新容器并不危险,因为它会在运行之前保持惰性。您可以粗略地将其比作为您不使用的 VM 定义配置设置。即使它设置为从受污染的操作系统 ISO 启动,您也不会对您的环境造成任何损害。
docker create --name suspect-container suspect-image:latest
上面的命令创建了一个新的容器,名为suspect-container
该容器将基于suspect-image:latest
图像。
导出容器的文件系统
现在您已经拥有一个有效但已停止的容器,您可以使用该docker export
命令导出其文件系统。由于容器从未启动过,您可以确保导出准确地代表了由您的图像层定义的文件系统。
docker export suspect-container > suspect-container.tar
您最终会在工作目录中得到一个 tar 存档,其中包含图像中的所有内容。使用您喜欢的软件打开或解压缩此存档以浏览图像的目录并列出和查看文件。
如果您不需要保存或打开存档,而是更喜欢在终端中获取文件列表,请修改tar
命令:
docker export suspect-container | tar t > suspect-container-files.txt
tar t
列出输入档案的内容。您最终会得到一个包含图像中所有内容的列表suspect-container-files.txt
。
使用“docker image save”
这种技术的一个变种是使用docker image save
. 此命令直接将图像数据保存到 tar 存档。
docker image save suspect-image:latest > suspect-image.tar
此方法生成一个专注于图像的存档,而不是从中创建的容器。tar 将包括一个manifest.json
文件,描述图像的层,以及一组包含所有单独层内容的目录。
当您评估每个图层在构建图像中的作用时,这会很有帮助。但是,创建和导出已停止的容器是浏览映像最终文件系统的一种更易于访问的方式。
使用“docker image history”列出层
检查图像内容的另一种方法是使用docker image history
命令查看其图层列表。
docker image history suspect-image:latest
这公开了组成图像层的 Dockerfile 指令。它不会让您看到图像文件系统中的单个文件和目录,但可以更有效地突出显示可疑行为。
命令输出中的每一行代表图像中的一个新层。“CREATED BY”列显示了创建层的 Dockerfile 指令。

扫描图层列表可帮助您快速识别可能表明您正在使用恶意图像的可疑操作。在RUN
指令中查找未知的二进制文件、意外的环境变量更改以及可疑CMD
和ENTRYPOINT
语句。
在检查图像历史时,后两层可以说是最重要的评估。它们会准确地告诉您当您docker run
或docker start
容器时将启动什么。如果任一指令看起来可疑或不熟悉,请考虑使用上述技术来全面检查引用的二进制文件或脚本。
访问图像的文件系统提供了其内容的非常精细的视图,即使在手动检查之后,恶意内容也很容易被忽视。暴露的层列表docker image history
无法帮助您找到伪装的文件系统项目,但在暴露明显的恶意操作(例如偷偷摸摸的间谍软件下载或环境变量覆盖)方面更有效。
第三方工具
还可以使用第三方开源工具来帮助您列出图像内容。这些通常提供过滤功能,因此您可以快速枚举已安装的操作系统包、编程语言依赖项和普通文件。
图像检查被内置到的驻定容器扫描引擎。您可以anchore-cli image content my-image:latest
在安装 Anchore后通过运行来使用它。这提供了目标映像的文件系统内容的完整列表。

另一种选择是Dive,这是一种专门用于可视化图像内容的工具。它使用基于层的方法并突出显示每个新层所做的文件系统更改。您可以使用基于树的交互式终端视图浏览文件系统。
结论
Docker 镜像在消费时通常是不透明的。流行的注册表不会在其 API 或用户界面中提供文件列表。此功能也未集成到 Docker CLI 中。尽管许多开发人员按原样使用映像,但在高风险环境中可能无法容忍未经审核的映像。
您可以通过将可疑图像导出到存档并浏览其内容来检查可疑图像。这使图像保持惰性,防止运行恶意内容,同时提供它将在容器中创建的文件系统的完整视图。
通过将手动内容探索与自动图像扫描相结合,您可以进一步提高您的安全状况。这些加速了检测已知漏洞的过程,但可能无法有效地找到存放在隐藏位置的新恶意文件。使用多种技术可以扩大覆盖范围并捕获尽可能广泛的可疑文件集。