Docker API 未授权访问

Docker API 未授权访问

1 漏洞描述

Docker是一种流行的容器技术,已被世界各地的行业所接受。它用于生产和UAT环境。然而,对于技术堆栈中的每一个新层,都可能会因为配置疏忽、代码不安全或两者的结合而引入许多安全问题。由于docker附带了许多组件,通常devops的工程师不会太多考虑安全性,这可能会导致灾难性的结果。

1.1 Docker是什么?

Docker是一个非常受欢迎的平台,开发人员在与同事合作编写代码时使用它来消除“在我的机器上工作”的问题。企业使用Docker构建敏捷的软件交付管道,更快、更安全地为应用程序提供新功能。

1.2 Docker镜像和容器是什么?

映像是要在运行时使用的文件系统和参数。它没有状态,永远不会改变。容器映像是一个轻量级的、独立的、可执行的软件包,其中包括运行它所需的一切:代码、运行时、系统工具、系统库和设置。容器将软件与其周围环境隔离开来,例如开发环境和阶段环境之间的差异,并有助于减少在同一基础设施上运行不同软件的团队之间的冲突。

1.3 什么是Docker registry ?

Registry是一个无状态、高度可扩展的服务器端应用程序,它存储并允许您使用HTTP API分发Docker映像。早期版本的docker注册表api(即v1)存在一些问题,因此v2发布并大大提高了安全性。然而,需要注意的是,默认情况下,Docker Registry的两个版本都没有启用身份验证。

1.4 什么是blobs?

Layers 以blobs的形式存储在v2注册表API中,由其内容摘要进行键控。

2 漏洞危害

​ Docker注册表允许任何用户提取任何容器映像并读取所有者所做的任何更改。这些更改可能包括硬编码凭据、连接字符串、文件权限更改、自定义脚本等。不仅如此,用户还可以上传Blob并对基本映像进行更改,例如放置后门等。由于下次将部署此映像,后门也将部署在服务器上。

3 漏洞检测

3.1 检查registry 版本

  • 确认是/v1 还是/v2

    Check registry version

  • 一旦确认API版本,我们可以构造如下链接,通过registry 获取repos列表:/_catalog

    Registry catalogue

  • 可以看到本地安装了3个仓库,现在我们以testrepo1 为例测试,构造以下链接来确认终端的tag:/REPO_NAME/tags/list

    Repo tag list

  • 如上确认存在2个tag(v1, v2),构造以下链接来下载v2 tag下的mainfest文件:/manifests/v2

    manifest details

  • 一旦我们获取到blobs,可以通过构造以下链接来下载对应的blob:v2/blobs/sha256:sha256_list

    localhost:30000/v2/testrepo1/blobs/sha256:4b981f68920b27d3a35992f3e0343acfc90f52dff050328f38d03f16ba984d34
    
  • 下载后,将对应的文件类型修改为.tar.gz,解压可以看到文件目录结构

    for i in *.tar.gz; do tar -xzvf $i; done
    

    blobs

    extracted data

  • 通过查找发现敏感文件

    sensitive information

以上步骤可以通过脚本实现:GitHub - NotSoSecure/docker_fetch: Data extraction tool for Docker Registry API

4 修复方案

  1. 启用身份验证,Docker 注册表 API 版本 2 支持多个基于令牌的身份验证(bearer、oauth 等)。
  2. 启用内容信任以强制执行映像标记的客户端签名和验证。
  3. 使用 TLS。

5 来源

翻译于:Anatomy of a hack: Docker Registry | NotSoSecure

posted @ 2024-03-06 09:50  f_carey  阅读(489)  评论(0编辑  收藏  举报