我开始学习 Docker 安全性,因此接触到了 cgroup、命名空间和功能,它们共同chroot
构成了现代容器技术的基础。
从历史上看,许多容器漏洞都是通过滥用内核中不从用户空间感知名称空间的部分来利用的,例如通过读取/写入/proc
类似modprobe
.
我熟悉命名空间的概念,但我不确定命名空间的边界何时停止应用,以便代码可以在根命名空间而不是用户的命名空间中执行?
答案1
一个漏洞,但不是您提到的类型。
可以创建和运行任意 docker 容器的用户可以创建具有主机文件系统映射部分的容器。然后,他们可以在容器中以 root 身份运行,在磁盘上创建 setuid root 程序。然后,他们可以从主机运行此命令以获得 root 权限。
答案2
这是一个很好但很难回答的问题,因为它非常开放。
重点关注“代码可能在根命名空间中执行”部分,这取决于“代码”的含义:
- 即使没有命名空间,用户空间部分也应该被隔离。即,无论命名空间如何,您编写的所有代码都与其他所有代码分开执行
- 当通过系统调用调用时,内核本身始终可以访问所有内容(除非它本身是虚拟机)。这意味着内核部分不是以任何方式隔离的。 [1]
上面#2 的意思是它们通过每个进程的抽象来感知命名空间。即,它们在进程表中的条目直接或间接地指向命名空间部分(例如根文件系统)。从那时起,只要内核端的某些功能正常工作,它就应该是“隔离的”,因为它始终会访问正确的数据集。
然而,这并不意味着错误不能影响正在运行的系统的所有方面,包括其他容器。
如果您想在隔离系统中运行某些东西,那么您需要一个完整的虚拟机或用户空间 Linux。容器旨在隔离进程及其所看到和可以访问的内容。当出现错误时,他们可以超越限制,就像正常进程最终可以以 root 身份运行代码一样。
[1] 几乎所有与系统有关的事情都是使用系统调用完成的。例如打开文件、写入套接字、发送信号等。