1 Linux Kernel介绍
Linux Kernel是由 Linus Torvalds最初开发的开源操作系统核心。CPU、广泛移植到过程、内存、文件系统等核心模块Alpha、arc、arm、ia64、mips、powerpc、sparc、x86-64等许多系统结构。目前主要用于各种服务器和物联网终端,也可用于桌面终端Linux。
2 漏洞分析
触发漏洞时,需要当地低权限用户执行具有执行权限的可执行文件,系统启用CAP_NET_RAW功能。CAP_NET_RAW允许使用原始套接字的设置。
漏洞位于net/packet/af_packet.c参与文件Linux的TCP/IP协议套件实现中的原始数据包接字。
unsigned short类型变量macoff(对应数据链路层的偏移)和netoff(对应网络层的偏移)收到回环网卡的原始套接字数据包时,按上述方法赋值。其中类型为数据报套接字(用于UDP)两者的值都是数据包头长度 16,否则会netoff赋值为数据包头长度 16maclen大一个,在po->has_vnet_hdr存在(即存在虚拟网络,如NAT等)加上它的大小,然后macoff赋值为netoff减去mac头部值(即减去数据链路层头部)。这里计算netlen当传入长度异常时,可能会导致溢出,然后计算macoff会计算出异常结果。
当执行virtio_net_hdr_from_skb函数时,该函数根据参数中的数值申请缓冲区,这里用到了macoff这个值。从而分配异常长度的缓冲区,可能导致容器逃逸、权限提升等。
分析补丁可以发现补丁会netoff变量的类型为unsigned int,判断值是否大于unsigned_short最大值,如果大,则丢弃内存中的数据包,以免损坏内存。
3 影响范围
Linux kernel 4.6-5.9rc4
4 解决方案
4.1 检测方案
输入以下命令查看本机内核版本
cat /proc/version
如显示的Linux version大于4.6且小于5.9,可能存在漏洞。
4.2 修复方案
升级内核版,安全版链接如下:
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=acf69c946233259ab4d64f8869d4037a198c7f06
或使用命令升级:
sudo apt-get install linux-generic-lts-xenial linux-image-generic-lts-xenial (ubuntu,debian等系统使用)
yum -y update kernel (CentOS,RedHat等系统使用)
4.3 临时修复方案
通过禁用CAP_NET_RAW如下:
setcap cap_net_raw-ep /bin/ping
5 时间轴
2020/9/3 Oh Cohen发布关于漏洞的解释
2020/9/23
6 参考链接
1. https://github.com/torvalds/linux/commit/8913336a7e8d56e984109a3137d6c0e3362596a4
2. https://www.openwall.com/lists/oss-security/2020/09/03/3
3. https://seclists.org/oss-sec/2020/q3/att-146/0001-net-packet-fix-overflow-in-tpacket_rcv.patch