一个内核漏洞详解:容器逃逸
时间:2021-09-03 10:08:22
[导读]CVE-2021-22555:一个影响2006年(Linuxkernelv2.6.19-rc1发布)至今(Linuxkernelv5.12-rc8)的所有Linux内核版本的漏洞,可导致本地提权与容器逃逸;该漏洞是个内核级漏洞,跟Linux的发行版本没有关系,也就是说只要Linu...
该漏洞是由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,可以达到同一块内存在不同的操作对象之间交换控制管理权)





