前言
容器是指一个与主机系统相隔离的工作区域,本质是一种特殊的进程。在Linux操作系统中运行相关容器时(例如Docker与LXC),会使用到多个Linux命名空间来隔离资源以实现虚拟化。基于这个前提,有关容器和命名空间的安全研究大部分都集中在容器逃逸这一层面。但是在某些特定场景下,攻击者能够通过滥用容器和Linux命名空间在目标主机上实现权限提升。这篇文章中我们展示了在处于容器ROOT用户+主机非ROOT权限场景下时,如何借用默认权限且不带有--privileged参数运行的Docker容器在主机层面来实现权限提升。此外,我们还将分享一些关于symlink(符号链接)在命名空间场景下的利用方法。
什么是名称空间(namespaces)?
截至目前,Linux内核公开了7个命名空间。它们可用来隔离主机与容器两者的相关资源以实现虚拟化。简要描述如下:
命名空间
作用介绍
Mount
用来隔离文件系统的挂载点, 使得不同的Mount namespace拥有自己独立的挂载点信息
PID
用来隔离进程的ID空间,使得不同PID namespace里的进程ID可以重复且相互之间不影响
Network
用来隔离网络设备、IP地址、端口等. 每个命名空间将会有自己独立的网络栈、路由表、防火墙规则、socket等
IPC
用来隔离System V IPC 对象以及POSIX消息队列
UTS
用来隔离系统的hostname以及NIS domain name
User
用来隔离用户权限相关的系