最大的问题就是Linux的一切都不是命名空间 (namespaced). 现在, Docker使用5个命名空间来改变系统的进程: 进程, 网络, Mount, 主机名,共享内存.
虽然有给用户一定的安全级别, 但无法像KVM实施全面的安全保护. 在KVM环境下进程不直接和主机的内核交互.它们也不访问内核的文件系统如/sys和/sys/fs, /proc/*
设备结点是用于和VMs 内核交互的,而不是主机.因此, 想要越过VM来扩展特权级别, 进程要去攻击VM内核,找到HyperVisor的弱点,打破SELinux的控制(sVirt),最终攻击主机的内核.
当你运行在一个容器里时,你就已经直接可以和主机的内核打交道了.
没有被当成命名空间的主要的内核子系统如:
- SELinux
- Cgroups
- /sys下的文件系统
- /proc/sys , /proc/sysrq-trigger , /proc/irq , /proc/bus
没有被当成命名空间的设备:
- /dev/mem
- /dev/sd* 文件系统设备
- 内核模块
如果通过一个特权进程对以上的某个模块通信或攻击的话,你就拥有了整个系统.
时间: 2024-11-03 20:47:02