记录一次逆向容器镜像的过程
字数 940 2025-08-29 08:32:24

Docker镜像逆向分析教程

环境准备

安装Docker

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

安装DIVE工具

wget https://github.com/wagoodman/dive/releases/download/v0.9.2/dive_0.9.2_linux_amd64.deb
sudo apt install ./dive_0.9.2_linux_amd64.deb

镜像分析流程

1. 拉取并导出镜像

sudo docker pull ubuntu
sudo docker save -o ubuntu.tar ubuntu

2. 解压镜像文件

解压ubuntu.tar后会得到以下文件结构:

  • manifest.json - 镜像清单文件
  • [hash].json - 镜像配置文件
  • [hash]/layer.tar - 镜像层文件
  • VERSION - 版本文件

3. 分析manifest.json

示例内容:

[{
  "Config": "825d55fb6340083b06e69e02e823a02918f3ffb575ed2a87026d4645a7fd9e1b.json",
  "RepoTags": ["ubuntu:latest"],
  "Layers": ["8f7ee37aa1d53dcded9b5c22b0a57d8bb8d35d9f42273651668e7aca23bd7581/layer.tar"]
}]

关键字段:

  • Config: 指向镜像配置JSON文件
  • RepoTags: 镜像名称和标签
  • Layers: 镜像层列表

4. 分析镜像配置文件

配置文件(如825d55fb6340...json)包含以下重要信息:

{
  "architecture": "amd64",
  "config": {
    "Cmd": ["bash"],
    "Env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"]
  },
  "history": [
    {
      "created": "2022-04-05T22:20:50.696744314Z",
      "created_by": "/bin/sh -c #(nop) ADD file:b83df51ab7caf8a4dc35f730f5a18a59403300c59eecae4cf5779cba0f6fda6e in / "
    },
    {
      "created": "2022-04-05T22:20:51.04675426Z",
      "created_by": "/bin/sh -c #(nop) CMD [\"bash\"]",
      "empty_layer": true
    }
  ],
  "rootfs": {
    "type": "layers",
    "diff_ids": ["sha256:c5ec52c98b3193052e15d783aca2bef10d8d829fa0d58fedfede511920b8f997"]
  }
}

关键点:

  • history字段记录镜像构建历史,每个Dockerfile命令通常对应一个层
  • empty_layer: true表示该操作不改变文件系统
  • rootfs.diff_ids列出各层的校验和

5. 分析镜像层

解压layer.tar可查看该层对文件系统的修改:

  • 包含完整的Linux文件系统结构
  • 在ubuntu镜像中,主要命令位于usr/bin目录

使用DIVE工具分析

主要功能

  1. 显示镜像层列表及各层大小
  2. 提供镜像效率统计(浪费空间百分比)
  3. 可视化各层文件系统变更

常用快捷键

  • Ctrl+Spacebar: 左右面板切换
  • Spacebar: 打开/关闭目录树
  • Ctrl+A: 显示/隐藏添加的文件
  • Ctrl+R: 显示/隐藏移除的文件
  • Ctrl+M: 显示/隐藏修改的文件
  • Ctrl+U: 显示/隐藏未修改的文件
  • Ctrl+L: 显示镜像层变动
  • Ctrl+/: 过滤文件
  • Ctrl+C: 退出

实际操作示例

  1. 运行容器并修改:
docker run -it --name ubuntu_test ubuntu
echo hello > hello.txt
echo world > world.txt
exit
  1. 提交为新镜像并分析:
docker commit ubuntu_test ubuntu_test
docker save -o ubuntu_test.tar ubuntu_test
sudo dive ubuntu_test

其他分析工具

  1. contains - 在线分析容器镜像
  2. trivy - 镜像漏洞扫描工具
  3. Clair - 静态分析容器漏洞
  4. Anchore - 深度分析docker镜像
  5. Dagda - 检测木马、恶意软件
  6. Aqua Security - 云原生应用保护

参考链接

  1. Docker镜像规范
  2. Docker命令文档
  3. 优化镜像大小指南
  4. Docker安全工具
Docker镜像逆向分析教程 环境准备 安装Docker 安装DIVE工具 镜像分析流程 1. 拉取并导出镜像 2. 解压镜像文件 解压 ubuntu.tar 后会得到以下文件结构: manifest.json - 镜像清单文件 [hash].json - 镜像配置文件 [hash]/layer.tar - 镜像层文件 VERSION - 版本文件 3. 分析manifest.json 示例内容: 关键字段: Config : 指向镜像配置JSON文件 RepoTags : 镜像名称和标签 Layers : 镜像层列表 4. 分析镜像配置文件 配置文件(如 825d55fb6340...json )包含以下重要信息: 关键点: history 字段记录镜像构建历史,每个Dockerfile命令通常对应一个层 empty_layer: true 表示该操作不改变文件系统 rootfs.diff_ids 列出各层的校验和 5. 分析镜像层 解压 layer.tar 可查看该层对文件系统的修改: 包含完整的Linux文件系统结构 在ubuntu镜像中,主要命令位于 usr/bin 目录 使用DIVE工具分析 主要功能 显示镜像层列表及各层大小 提供镜像效率统计(浪费空间百分比) 可视化各层文件系统变更 常用快捷键 Ctrl+Spacebar : 左右面板切换 Spacebar : 打开/关闭目录树 Ctrl+A : 显示/隐藏添加的文件 Ctrl+R : 显示/隐藏移除的文件 Ctrl+M : 显示/隐藏修改的文件 Ctrl+U : 显示/隐藏未修改的文件 Ctrl+L : 显示镜像层变动 Ctrl+/ : 过滤文件 Ctrl+C : 退出 实际操作示例 运行容器并修改: 提交为新镜像并分析: 其他分析工具 contains - 在线分析容器镜像 trivy - 镜像漏洞扫描工具 Clair - 静态分析容器漏洞 Anchore - 深度分析docker镜像 Dagda - 检测木马、恶意软件 Aqua Security - 云原生应用保护 参考链接 Docker镜像规范 Docker命令文档 优化镜像大小指南 Docker安全工具