一个内核网络漏洞详解:容器逃逸
时间:2021-09-03 10:07:59
[导读]↓推荐关注↓CVE-2021-22555:一个影响2006年(Linuxkernelv2.6.19-rc1发布)至今(Linuxkernelv5.12-rc8)的所有Linux内核版本的漏洞,可导致本地提权与容器逃逸;该漏洞是个内核级漏洞,跟Linux的发行版本没有关系,也就是说...
↓推荐关注↓
CVE-2021-22555:一个影响2006年(Linux kernel v2.6.19-rc1 发布)至今(Linux kernel v5.12-rc8)的所有Linux内核版本的漏洞,可导致本地提权与容器逃逸;该漏洞是个内核级漏洞,跟Linux的发行版本没有关系,也就是说只要Linux 内核版本在v2.6.19-rc1 ~v5.12-rc8 之间的内核,都存在被黑客利用该漏洞攻击的可能。
该漏洞是由Andy Nguyen (theflow@)发现,于2021年07月16日发布。换句话说,该漏洞已经存在了15年之久,都没有被人发现。该漏洞将允许本地用户通过用户名空间获取权限提升,和容器逃逸。
简述: Linux 内核模块Netfilter中存在一处权限提升漏洞,在 64位系统 上为 32位进程 处理 setsockopt IPT_SO_SET_REPLACE(或 IP6T_SO_SET_REPLACE)时,如果内核选项CONFIG_USER_NS 、CONFIG_NET_NS被开启,则攻击者可以通过该漏洞实现权限提升,以及从docker、k8s容器中实施容器逃逸。
Linux发行版:Ubuntu 20.04.2 LTSLinux kernel 版本:5.8.0-48-generic
如图:
在Linux内核代码net/netfilter/x_tables.c中的 xt_compat_target_from_user 函数内的第1129行,在使用memset()时并未对传进来的参数进行校验,会导致在写0时,越过堆的大小,导致“堆溢出”,从而破坏堆与堆之间的边界。
而写超的0 的内核内存,刚好又在应用层程序(恶意程序)通过堆喷技术拿到感知控制。通过搜索,可以找到被写超的内核内存;恶意程序在应用层建立与这段内核内存的联系,把要执行代码commit_creds(prepare_kernel_cred(NULL))封装到回调函数内;利用内核机制在内核内存中建立与回调机制使用关系,再把刚才封装的函数地址更新到内核内存中。当主动释放这段内核内存,触发回调函数,从而调用到commit_creds()函数把权限升级到root权限。
是一个与程序运行期间不正确使用动态内存相关的漏洞利用方式。
程序在释放内存位置后,系统不会马上回收内存。指针指向的那段内存依然存在,并且内容没有被清除,攻击者可以利用该错误来入侵该程序。(本次漏洞重点使用。通过UAF,可以达到同一块内存在不同的操作对象之间交换控制管理权)
该漏洞是由Andy Nguyen (theflow@)发现,于2021年07月16日发布。换句话说,该漏洞已经存在了15年之久,都没有被人发现。该漏洞将允许本地用户通过用户名空间获取权限提升,和容器逃逸。
1.漏洞概述
| 漏洞编号 | CVE-2021-22555 |
| 内核组件 | kernel-netfilter |
| 漏洞类型 | Linux kernel堆溢出、特权提升 |
| 影响版本 | Linux Kernel : v2.6.19-rc1 ~ v5.12-rc8 |
2.漏洞环境和样例
2.1.环境准备
Linux发行版:Ubuntu 20.04.2 LTSLinux kernel 版本:5.8.0-48-generic
如图:
2.2.利用样例
3 漏洞原理
在Linux内核代码net/netfilter/x_tables.c中的 xt_compat_target_from_user 函数内的第1129行,在使用memset()时并未对传进来的参数进行校验,会导致在写0时,越过堆的大小,导致“堆溢出”,从而破坏堆与堆之间的边界。
而写超的0 的内核内存,刚好又在应用层程序(恶意程序)通过堆喷技术拿到感知控制。通过搜索,可以找到被写超的内核内存;恶意程序在应用层建立与这段内核内存的联系,把要执行代码commit_creds(prepare_kernel_cred(NULL))封装到回调函数内;利用内核机制在内核内存中建立与回调机制使用关系,再把刚才封装的函数地址更新到内核内存中。当主动释放这段内核内存,触发回调函数,从而调用到commit_creds()函数把权限升级到root权限。
4 前导技术知识点
4.1 UAF (Use-After-Free)
是一个与程序运行期间不正确使用动态内存相关的漏洞利用方式。
程序在释放内存位置后,系统不会马上回收内存。指针指向的那段内存依然存在,并且内容没有被清除,攻击者可以利用该错误来入侵该程序。(本次漏洞重点使用。通过UAF,可以达到同一块内存在不同的操作对象之间交换控制管理权)





