【Docker】Docker逃逸小结

这篇具有很好参考价值的文章主要介绍了【Docker】Docker逃逸小结。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【Docker】Docker逃逸小结

前言

Docker自2013年发行开始,一直受到业界广泛的关注。

这篇文章将探讨Docker安全性相关的问题。

什么是容器?

容器的本质就是把系统中同一个业务目标服务的相关进程组合在一起,放在一个namespace中。

同一个namespace中的进程能够互相通信,同时看不见其他namespace中的进程。

每个namespace拥有自己独立的主机名、进程ID、IPC、网络、文件系统、用户等资源

此外,为了限制namespace对物理资源的使用,要对进程能够使用的CPU、内存资源进行一定的限制,而使用Cgroup技术就可以解决。

我们常说的4c4g容器其实就是限制这个容器最多能使用4核计算资源和4G的内存空间

简而言之,Linux内核提供namespace完成隔离,Cgroup完成资源限制。namespace+Cgroup构成了容器的底层技术

容器的实现没有使用任何虚拟化的技术,而是一种隔离技术。可以简单的把docker理解成一种高级的chroot

Docker的安全机制

上文提到了,Docker使用的是隔离技术,所以我们在容器内部使用的仍然是宿主机的内核、cpu与内存。这就可能导致一些安全问题的出现。

在讲述Docker可能存在的安全问题之前,先来探讨一下Docker是如何在最大程度上保证容器的安全性。

Docker使用到的安全机制有很多:

  • Linux Capability
  • AppArmor
  • SELinux
  • Seccomp

这里就简单的提一提Linux Capability

因为Docker默认会对User namespace不进行隔离,所以在docker内部cat /etc/passwd的时候会查看到uid为0,也就是说Docker容器内部的root其实就是宿主机的root。

这时候就会有疑问了,既然是宿主机的root,应该是无所不能的,为什么很多服务都无法使用?并且有些命令会提示Permission denied

这个其实就是Linux Capability实现的

自Linux 2.1开始,引入了capability的概念,它打破了操作系统中超级用户和普通用户的概念,普通用户通过设置capability也可以做到超级用户才能干的事情

Linux Capability一共有38钟,docker默认开启了14种,这样就有效的避免了很多安全问题

如果开启docker使用了--privileged=true,那么其实就是开启了所有的capability

Docker逃逸

docker逃逸的类型无非下面三种:

  1. 配置不当
  2. Docker软件的漏洞
  3. 内核漏洞

1.特权模式

我们在上面讲到,特权模式将capability全开了,那么就存在挂载权限。

可以通过mount的方式将宿主机的根目录挂载到容器中,这样就可以通过容器对宿主机的文件进行读写。

这里用一个ubuntu20.04的容器来进行说明

  1. 以特权模式开启ubuntu20.04容器,执行/bin/bash
  2. 执行fdisk -l 查看挂载情况
  3. cd进入/dev 查看挂载情况
  4. 在/dev创建一个文件夹 mkdir test114
  5. 将/dev/sdc挂载到刚刚创建的test114上
  6. 可以查看宿主机的文件,同时可以修改
  7. 创建一个test114文件
  8. 回到宿主机查看,发现确实有这个新增的文件,并且文件所有者就是root

【Docker】Docker逃逸小结

【Docker】Docker逃逸小结

【Docker】Docker逃逸小结

【Docker】Docker逃逸小结

【Docker】Docker逃逸小结

2.–cap-add=SYS_ADMIN

使用--cap-add=SYS_ADMIN的参数,可以让docker容器内部使用mount和unmount,可以实现上述一样的效果

3.挂载了Docker.sock

Docker使用的架构是C/S架构,我们使用的docker指令,docker就是client,而server端是由docker daemon完成的,两者之间的通信方式有如下三种:

  1. unix:///var/run/docker.sock
  2. tcp://host:port
  3. fd://socketfd

docker默认使用docker.sock进行通新,当容器中进程与Docker守护进程进行通信的时候,容器本身需要挂载unix://var/run/docker.sock文件

本质来说,如果能够访问docker socket或者连接https的api,那么就可以执行docker服务能够执行的任何命令。

所以如果容器中有能够访问docker服务端的能力,就可以完成docker逃逸,具体操作就是:

  • container内部安装docker.io(客户端),通过容器内部存在的docker.sock或者api与宿主机的server进行交互
  • 让宿主机server以特权模式开一个容器,进入该容器,执行任意命令(或者直接使用-v参数进行挂载根目录的操作)

这里就拿一道最近的比塞题来讲解吧,2022年的Real World体验赛的Be-a-Docker-Escaper

题目给出的Dockerfile中存在如下一句话:

docker run -i -m 128m -v /var/run/docker.sock:/s ubuntu # You are here!

非常明显将/var/run/docker.sock挂载到了容器的/s

执行如下操作即可访问宿主机中的flag:

apt update
apt install docker.io
mkdir /test114
docker -H unix:///s/docker.sock run -v /:/test114 -i ubuntu /bin/bash

cd /test114
cat flag

4.脏牛漏洞(内核漏洞)

Dirty Cow(CVE-2016-5195)是Linux内核中的权限提升漏洞,源于Linux内核的内存子系统在处理写入时拷贝(copy-on-write, Cow)存在竞争条件(race condition),允许恶意用户提权获取其他只读内存映射的写访问权限。

已经有人将环境打包成了一个docker镜像,可以直接复现

gebl/dirtycow-docker-vdso (github.com)

5.runc (cve-2019-5736)

poc地址 Frichetten/CVE-2019-5736-PoC: PoC for CVE-2019-5736 (github.com)

6. cp (cve-2019-1427)

CVE-2019-14271:Docker cp命令漏洞分析-安全客 - 安全资讯平台 (anquanke.com)文章来源地址https://www.toymoban.com/news/detail-458619.html

到了这里,关于【Docker】Docker逃逸小结的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [漏洞修复]Docker runc容器逃逸漏洞(CVE-2021-30465)

    2021年5月31日,阿里云应急响应中心监测到国外安全研究人员披露 CVE-2021-30465 runc 符号链接挂载与容器逃逸漏洞。 针对该漏洞的整改过程。 runc是一个轻量级通用容器运行环境,它允许一个简化的探针到运行和调试的底层容器的功能,不需要整个docker守护进程的接口。 runc存在

    2024年02月12日
    浏览(42)
  • Docker Dirtypipe(CVE-2022-0847)漏洞复现与分析容器逃逸

    同脏牛,通过写只读内存,对映射的内存做篡改 GitHub - greenhandatsjtu/CVE-2022-0847-Container-Escape: CVE-2022-0847 used to achieve container escape 利用CVE-2022-0847 (Dirty Pipe) 实现容器逃逸 云原生之容器安全实践-安全客 - 安全资讯平台 (anquanke.com) 从脏管道(CVE-2022-0847)到docker逃逸 - 先知社区 (aliy

    2024年02月13日
    浏览(57)
  • 《Docker极简教程》--前言--Docker的简介

    Docker 是一种用于构建、部署和运行应用程序的开源平台,它使用容器技术来实现轻量级、可移植和自包含的应用程序环境。Docker 的核心思想是将应用程序及其依赖项打包到一个称为容器的封闭单元中,从而消除了在不同环境中运行应用程序时可能出现的许多兼容性和依赖性

    2024年02月21日
    浏览(52)
  • 云安全攻防(八)之 Docker Remote API 未授权访问逃逸

    Docker Remote API 是一个取代远程命令行界面(rcli)的REST API,其默认绑定2375端口,如管理员对其配置不当可导致未授权访问漏洞。攻击者利用 docker client 或者 http 直接请求就可以访问这个 API,可导致敏感信息泄露,甚至可进一步利用Docker自身特性,借助容器逃逸,最终完全控

    2024年02月13日
    浏览(43)
  • 云上攻防-云原生篇&Docker安全&系统内核&版本漏洞&CDK自动利用&容器逃逸

    细节部分在权限提升章节会详解,常用: CVE-2016-5195 CVE-2019-16884 CVE-2021-3493 CVE-2021-22555 CVE-2022-0492 CVE-2022-0847 CVE-2022-23222 Docker version = 18.09.2 RunC version = 1.0-rc6 1、安装docker对应版本 2、启动环境测试: 3、编译修改后EXP后等待管理进入执行 https://github.com/Frichetten/CVE-2019-5736-PoC 还有

    2024年02月08日
    浏览(66)
  • 云上攻防-云原生篇&Docker安全&权限环境检测&容器逃逸&特权模式&危险挂载

    Docker 是一个开放源代码软件,是一个开放平台,用于开发应用、交付(shipping)应用、运行应用。Docker允许用户将基础设施(Infrastructure)中的应用单独分割出来,形成更小的颗粒(容器),从而提高交付软件的速度。 Docker 容器与虚拟机类似,但二者在原理上不同,容器是将

    2024年02月07日
    浏览(59)
  • Ubuntu下Docker常用命令小结

    重启docker服务: 查看docker所有内容: 拉取某个镜像: 根据某个镜像创建一个名为matting的容器,并以当前目录作为docker内的映射目录: 进入某个名为matting的容器: 退出容器使用快捷键ctrl+d。 停止容器: 启动容器:   删除容器(删除前需要保证容器已停止): 删除镜像:

    2024年02月09日
    浏览(41)
  • 项目小结:使用Docker迁移服务到离线服务器

    最近遇到的这个场景,需要把之前开发的一套系统迁移到一个离线的服务器上,这个服务器有点麻烦,接入VPN后通过堡垒机才能访问,速度也很慢,遇到不少坑,本文记录一下迁移过程。 原本这套系统也挺简单的,Django 写的后端接口,搭配 Vue+Echarts 大屏,数据库用 Mysql 和

    2024年02月08日
    浏览(76)
  • Java对象逃逸及逃逸分析

    文章目录 前言 一、对象逃逸是什么? 1.1 概念 1.2 代码分析 二、逃逸分析(一种分析算法) 1.什么是逃逸分析 2.代码优化实践 2.2 同步锁消除 2.3 标量替换分析 总结 随着 JIT 编译器的发展与逃逸分析技术逐渐成熟, 栈上分配、标量替换优化 技术将会导致一些微妙的变化,所有的

    2024年02月05日
    浏览(33)
  • 安全基础 --- nodejs沙箱逃逸

    沙箱绕过原理:沙箱内部找到一个沙箱外部的对象,借助这个对象内的属性即可获得沙箱外的函数,进而绕过沙箱 前提:使用vm模块,实现沙箱逃逸环境。(vm模式是nodejs中内置的模块,是nodejs提供给使用者的隔离环境) 目的:拿到process模块 (1)Function构造函数实现 源代码

    2024年02月08日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包