环境搭建 执行如下命令启动存在漏洞的容器环境,在赋予sys_admin权限的同时,需要关掉安全组apparmor设置 docker run -d -P --cap-add=cap_sys_admin -...-security-opt apparmor=unconfined --name=test nginx:latest 在容器中使用cdk进行检测,可以看到容器中多了CAP_SYS_ADMIN的Capability...node号和文件系统类型,由于容器内的/etc/hosts、/etc/resolv.conf、/etc/hostname这三个文件是默认从宿主机挂载进容器的,所以在他们的挂载信息内很容易能获取到主设备号...debugfs -w host 但是通过debugfs进行调试使用write命令将容器的文件复制到宿主机时会出现问题,虽然在debugfs界面查看是正常的 write /tmp/authorized_keys...需要注意的是,读取和查看的目录或文件都需要是绝对路径。 但是echo命令不存在,无法通过echo命令写入公钥,也无法写入计划任务反弹shell。
当容器具有SYS_ADMIN的Capability的话,则可以进行容器逃逸。它允许大量的特权操作,包括mount文件系统,交换空间,还有对各种设备的操作以及系统调试相关的调用。...环境搭建 执行如下命令启动存在漏洞的容器环境,在赋予sys_admin权限的同时,需要关掉安全组apparmor设置 docker run -d -P --cap-add=cap_sys_admin -...-security-opt apparmor=unconfined --name=test nginx:latest 在容器中使用cdk进行检测,可以看到容器中多了CAP_SYS_ADMIN的Capability...文件内容为1,设置release_agent文件的对应路径为宿主机的可写目录upperdir echo 1 > /tmp/test/x/notify_on_release host_path=`sed...该命令启动一个sh进程,将sh进程的PID写入到/tmp/test/x/cgroup.procs中。这里的\$\$表示sh进程的PID。
在这篇博文中,我将向大家展示访问我们的 Kubernetes 集群的攻击者如何进行容器逃逸:运行 Pod 以获得 root 权限,将 Pod 转义到主机上,并通过不可见的 Pod 和无文件执行来持续攻击...问题 在容器逃逸期间,攻击者打破了主机和容器之间的隔离边界,最终逃逸至 Kubernetes 控制平面或工作节点的地方。...在这种情况下,攻击者可以看到在同一主机上运行的其他容器,收集他们的机密信息,在主机文件系统上读写数据,攻击 Kubelet 并提升权限;或者通过部署一个不可见的 Pod 来利用Kubernetes 错误并在环境中持久存在...这些 JSON 事件通过 Kubernetes 身份感知信息(包括服务、标签、命名空间、Pod 和容器)以及操作系统级进程可见性数据(包括进程二进制文件、pid、uid、具有完整进程祖先树的父二进制文件...攻击者可以看到在同一控制器节点上运行的容器,收集与它们相关的机密,从主机文件系统读取数据,攻击 kubelet 并提升权限;或者利用 Kubernetes 的特殊行为并通过启动一个不可见的容器来保持突破
特权容器产生后,由于增强权限的许多,攻击者可能会以root权限运行代码。这表明攻击者可以以root权限运行主机,包括CAP_SYS_ADMIN。...即使进程使用设置了文件功能位的setuid二进制文件或可执行文件执行,也不允许带有no_new_privs的进程更改uid / gid或获得任何其他功能。...容器的 IP 地址同 Docker主机的 IP 地址 要注意容器中服务的端口号不能与Docker主机上已经使用的端口号相冲突 host模式能够和其它模式共存 2.15 主机进程命名空间不共享,禁用—pid...PID命名空间提供了进程的分离。PID命名空间删除系统进程视图,允许进程ID可重用,包括pid 1。 在一些情况下需要容器共享主机进程命名空间,基本上允许容器内的进程可以查看主机的所有进程。...例如,构建了一个带调试工具容器,想在容器使用这些工具来调试主机的进程。 如果使用—pid=host参数,容器可以直接操作宿主机上的数据。
/proc/[PID]/exe的特殊之处在于,我们打开这个文件后在权限检查通过的情况下,内核将直接返回一个指向该文件的描述符,而非按照传统打开方式去做路径解析和文件查找。...因此在runC exec加入到容器的命名空间之后,容器内进程已经能够通过内部/proc观察到它,此时如果打开/proc/[runc-PID]/exe并写入一些内容,就能够实现将宿主机上的runC二进制程序覆盖掉...文件描述符泄漏的利用:其中CVE-2019-5736是借助/proc/[PID]/exe的特殊功能拿到文件描述符。...AppArmor和SELinux开启方式的利用:容器中AppArmor和SELinux这类LSM机制的开启都是向procfs写入label,攻击者只需要阻止写入的过程即可避免LSM的开启。...例如,如果在容器内的进程以名为1000的用户身份运行,并且容器内的某些操作依赖于用户ID为1000的权限,那么将会导致该进程越权。
你还需要复习第二篇文章中的内容,了解如何通过基本的工具来设置 capabilities。如果一切准备就绪,下面我们就开始了。...这两个集合的意义就在于可以帮助我们在进程树或 namespace 的范围内创建一个允许任意进程使用某些 capabilities 的环境。...如果你可以在容器中修改系统时间,那么宿主机和其他容器中的系统时间都会被改变。...即使容器的进程被黑客攻击,攻击者只会拥有有限的文件系统权限,无法施展拳脚。...Docker 中还有一个选项可以防止容器中的用户获得新的 capabilities,它可以有效阻止攻击者提升权限来避免受到攻击,同时也阻止了再容器中执行 set_ambient 程序。
共同作者: Pass----------------------------前言--容器安全是一个庞大且牵涉极广的话题,而容器的安全隔离往往是一套纵深防御的体系,牵扯到 AppArmor、Namespace...随着云原生技术的快速发展,越来越多的容器运行时组件在新版本中会默认配置 AppArmor 策略,原本我们在《红蓝对抗中的云原生漏洞挖掘及利用实录》介绍的多种容器逃逸手法会逐渐失效;因此我们希望能碰撞出一些攻击手法...容器逃逸分析要想使用 eBPF,需要一些权限和挂载伪文件系统,下表展示了 eBPF kprobe、tracepoint 使用的条件:特性 / 功能要求bpf 系统调用拥有 CAP_SYS_ADMIN;...helper 提供了读写整个机器上任意进程用户态空间的功能,同时提供了内核空间的读取数据功能,当攻击者能向内核加载 eBPF 程序,那么有许多种办法进行权限提升或者容器逃逸:• 读取内核空间里的敏感信息...容器新启动的时候默认是 root 用户并且处于 initial user namespace ,而且宿主机的 root 用户往往会先占用一部分的影响 memlock 的内存,这样就会导致 eBPF 程序在容器内因为
参数自定义 特权模式下的容器内进程可以使用所有的 linux capabilities 特权模式下,容器内进程拥有使用所有的 linux capabilities 的能力,但是, 不表示进程就一定有使用某些...比如,如果容器是以非 root 用户启动的, 就算它是以特权模式启动的容器,也不表示它就能够做一些无权限做的事情 2.1.2、Linux敏感目录 普通模式下,部分内核模块路径比如 /proc 下的一些目录需要阻止写入...,以阻止容器内进程随意修改系统内核 特权模式下,内核文件系统将不再以只读的方式被挂载 2.1.4、AppArmor与Seccomp Tips AppArmor: https://www.cnblogs.com...通过notify_on_release实现容器逃逸 条件 以root用户身份在容器内运行 使用SYS_ADMINLinux功能运行 缺少AppArmor配置文件,否则将允许mountsyscall cgroup...如果notify_on_release启用,当cgroup不再包含任何任务时(即,cgroup的tasks文件里的PID为空时),系统内核会执行release_agent参数指定的文件里的内容。
上篇文章介绍了 Linux capabilities 的诞生背景和基本原理,本文将会通过具体的示例来展示如何查看和设置文件的 capabilities。...,自从 Linux 4.10 开始,/proc/[pid]/status 中的 NoNewPrivs 值表示了线程的 no_new_privs 属性。...UID=1000)来运行容器,进程的有效用户也会变成 root。...接着在开启 no-new-privileges 的前提下启动容器,以防止执行设置了 SUID 标识的可执行文件进行 UID 转换: $ docker run -it --rm --user=1000 -...to/file none 03 总结 本文通过两种工具演示了如何对可执行文件的 capabilities 进行管理,并以 docker 为例,展现了 no_new_privs 的强大之处。
在主机网络名称空间中运行容器是不安全的: 1)请勿使用docker run --net = host运行Docker容器 2)请勿使用.spec.hostNetwork...它们在抽象Unix域套接字sun_path中嵌入了结尾的空字节,其可阻止常见的Unix工具(例如socat)与其连接。...在使用的containerd(-shim)的两个主要版本1.2.x和1.3.x中,暴露以下能力: 任意文件读取 任意文件追加 任意文件写入 containerd-shim中的任意命令执行 从runc config.json...文件创建容器 启动创建的容器 大多数用户实际上不受此CVE的影响。...关于在Kubernetes中如何使用AppArmor特性,可查看官网 3.3 使用SELinux RHEL/CentOS和Fedora的SELinux策略,用于保护主机上的抽象套接字:
通过限制对各种Linux功能的访问,bpflock能够减少攻击面并阻止一些众所周知的攻击技术。...bpflock只允许类似容器管理器、systemd和其他以主机PID或网络命名空间运行的容器/程序访问完整的Linux功能,并限制那些以自己命名空间运行的容器或程序。...如果bpflock在受限配置文件下运行,则所有程序/容器(包括特权程序/容器)都将被拒绝访问。...,bpf" CONFIG_BPF_LSM=y 2、一个启用了BTF的内核 启用BPF LSM支持 1、使用高级权限打开/etc/default/grub文件; 2、将下列内容添加到GRUB_CMDLINE_LINUX...,apparmor,bpf" 3、更新grub配置: sudo update-grub2 4、重启设备 Docker使用 下列命令可以使用默认的配置文件运行工具: docker run
在开启了 AppArmor 的系统中,容器运行时会给容器使用默认的权限配置,当然,应用也可以使用自定义配置。本文将讲述如何在容器中使用 AppArmor。...如何使用 AppArmor AppArmor 是一个 Linux 内核安全模块,允许系统管理员使用每个程序的配置文件来限制程序的功能。...配置文件可以允许网络访问、原始套接字访问以及在匹配路径上读取、写入或执行文件的权限等功能。 不过,并不是所有的系统都支持 AppArmor。...AppArmor 的配置文件定义的十分灵活,更多具体使用可以参见 AppArmor 文档。 容器中使用 AppArmor 在主机上配置好 AppArmor 配置文件后,我们来看如何在容器中使用。...配置文件阻止了创建文件操作。
; 环境变量读取:环境变量本身是一种常用的宿主机与容器的通信方式。...如下图所示,特权模式意味着容器内进程将具备等同于宿主机上进程的所有权限: ? 我们在【云原生攻防研究】容器逃逸技术概览[7]介绍了在处于特权模式时如何进行容器逃逸的具体方法。.../x/cgroup.procs" 上述命令的实际效果是在宿主机上执行了ps aux命令,其结果被存储在容器内/output文件中。...在普通容器中,由于不具有SYS_ADMIN权限,以及AppArmor的限制,这种攻击无法成功。因此,特权模式是危险的。...操作:执行cat /home/*/.docker/config.json来读取任何可能存在的.docker/config.json文件。 问题:iptables规则集是否同时为宿主机和容器设置?
目录或文件遍历 利用此漏洞,黑客可以利用代码中的弱点遍历主机系统或网络上的任意文件和目录。 2022 主要漏洞盘点 1....ExecSync 请求在容器中运行命令并记录命令的输出。命令执行后,CRI-O 会读取此输出,并以读入与命令输出对应的整个文件的方式读取。...CVE-2022-23648 – Containerd 中的任意主机文件访问 该漏洞存在于containerd版本 1.6.1、1.5.10 和 1.14.12 中,允许攻击者读取任意主机文件。...然后,具有本地访问权限的恶意行为者可能会导致拒绝服务攻击或在主机上运行任意代码。要检测 Kubernetes 中的此漏洞暴露,您需要找到具有 CAP_SYS_ADMIN 功能的 pod。...在 Kubernetes 部署中实施 AppArmor 和 SELinux 等安全配置文件以及 Pod 安全标准可以减少遭受攻击的风险。 在为您的服务帐户和用户分配角色和权限时,请遵循最小权限原则。
在本系列中,我们介绍了各种安全层,这些安全层不仅可以将容器与主机上的其他进程隔离开来,还可以将容器与其底层主机隔离开来。...AppArmor AppArmor 通过定义可应用于主机上运行的进程的不同配置文件来实现其控制能力。...现在我们已经了解了 AppArmor 的基础知识,让我们看看可以使用自定义 AppArmor 配置文件执行哪些操作,以及如何将其应用于 Docker 容器。...为了通过一个简单的示例来演示这一点,我们可以创建一个配置文件来阻止对容器内/etc目录的写入访问,即使运行容器的用户是 root 。 首先,我们将创建一个最小的配置文件来实现我们的目标。...如果我们尝试在容器内的 /hosthome 目录中创建一个文件,即使我们以 root 用户身份运行,我们也会被阻止。
255 JMP(直接跳转) 跳转目标是指令偏移量 跳转 偏移量最大255 Load(数据读取) 读取程序参数 读取指定的16位内存地址 Store(数据存储) 保存数据到指定的16位内存地址中 支持的运算...具体的系统调用的 接口API可以通过查看 对应系统的声明头文件。 比如我现在用的这台机器是64位的Linux系统,就查看/usr/include/asm/unistd_64.h文件。...但是如果需要大批量的配置多个 相同的容器,seccomp就相对来说容易得多;定义好一份seccomp的配置文件,在多个容器加载的时候,指定该份配置文件就可以省掉单个容器的配置。...seccomp的使用 容器中 seccomp的使用,本质是对Seccomp-BPF的再封装使用;通过简单的配置文件来达快速设置多个容器的seccomp安全应用(以下全部以docker为例)。...有点黑白名单的意思。 05 总结 在容器环境里面有AppArmor、 SElinux、Capability、Seccomp等安全加固技术。
从这张图可以看到,技术发展到今天,从最开始的自建机房,到云主机,再到现在轻便的 FaaS。 容器技术将虚拟机这个计算单位拆分到了更小的单元。计算资源被不断的抽象成服务,我们的选择也越来越多。...解决的一个问题是,如何快速创建并配置虚拟机? 他本身不提供虚拟化能力,可以看做是对虚拟化平台的一个封装。...几个问题: 容器之间怎么通信? 容器怎么和 Host 进行通信? 容器怎么联通的外网? 容器之间如何实现跨主机通信? 见 Kubernetes 篇。...=unconfined 利用方式2:CVE-2022-0185 拥有 SYS_PTRACE 进程注入逃逸,需要 –pid=host 以及 –security-opt apparmor=unconfined...CAP_DAC_READ_SEARCH,可以绕过文件的读权限检查和目录的读和执行权限检查,使用 open_by_handle_at 系统调用来爆破宿主机的文件内容。
例如,恶意用户启动容器的时候将主机的根目录/映射到容器的 /host目录中,那么容器理论上就可以对主机的文件系统进行任意修改了。这听起来很疯狂?...,还要实现文件系统、网络、PID、UID、IPC等等的相互隔离,前者相对容易实现一些,后者则需要宿主机系统的深入支持....随着Linux系统对于命名空间功能的完善实现,程序员可以实现上面的所有需要,让某些进程在彼此隔离的命名空间中运行,大家虽然都共用一个内核和某些运行时环境(l例如一些系统命令和系统等),但是彼此却看不到,...net命名空间 有了pid命名空间,每个命名空间的pid能够实现相互隔离,但是网络端口还是共享host的端口,网络隔离是通过net命名空间实现的,每个net命名空间有单独的网络设备,IP地址,路由表,...IPC命名空间 容器中进程交互采用了Linux常见的进程交互方法,包括信号量,消息队列和共享内存等,然而同VM不同的是,容器的进程交互实际山还是host上具有相同pid命名空间的进程交互,因此需要在IPC
那么如何以capabilities解决上述的问题呢?...host上找到对应该进程的PID,可以在/proc/$PID/task/TID/status中查看进程的capabilities信息,截图如下 CapInh: 00000000a80625fb CapPrm...,cap_mknod,cap_audit_write,cap_setfcap 当前也可以通过容器启动进程/bin/sh映射到host上的pid查看对应的capabilities # getpcaps 5318...因此在4.14版本新增了一个rootid的变量,rootid是指新创建的命名空间中的UID 0对应初始user namespace的UID的值,即映射到host主机上的user ID的值(/etc/subuid...不要轻易给一个线程或文件设置CAP_SYS_ADMIN权限,CAP_SYS_ADMIN的权限类似root 在容器中给文件设置capabilities时可能会出现“Operation not permitted
领取专属 10元无门槛券
手把手带您无忧上云