当前位置: 首页 > 科技观察

Linux内核af_packet内存损坏漏洞(CVE-2020-14386)

时间:2023-03-19 00:32:59 科技观察

1Linux内核简介LinuxKernel是一个开源操作系统内核,最初由LinusTorvalds开发。实现了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协议套件实现中的原始数据包套接字。无符号short型变量macoff(对应数据链路层的偏移量)和netoff(对应网络层的偏移量)是在从loopback网卡接收到原始socket数据包时按照上述方法赋值的。当type为datagramsocket(用于UDP)时,两者的值都是包头长度+16,否则netoff赋给包头长度+16和maclen中较大的一个,在po->has_vnet_hdr时存在(即存在虚拟网络,如NAT等),加上其大小,然后将macoff赋值给netoff减去mac头(即减去数据链路层头)的值。这里在计算netlen的时候,可能传入的长度不正常,可能会溢出,然后在计算macoff的时候,会计算出异常的结果。virtio_net_hdr_from_skb函数执行时,函数根据参数中的值申请缓冲区,这里使用macoff的值。从而导致分配了异常长度的buffer,可能导致越界写入,导致容器逃逸、提权等。分析patch发现patch将netoff变量的类型改为unsignedint,判断是否大于unsigned_short的最大值。如果太大,内存中的数据包会被丢弃,以免造成内存损坏。3影响范围Linuxkernel4.6-5.9rc44解决方案4.1检测方案输入以下命令查看机器内核版本cat/proc/version如果显示的Linux版本大于4.6小于5.9,则可能存在漏洞。4.2修复计划升级内核版本,安全版链接如下:https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=acf69c946233259ab4d64f8869d4037a198c7f06或使用命令升级:sudoapt-getinstalllinux-generic-lts-xeniallinux-image-generic-lts-xenial(ubuntu、debian等系统使用)yum-yupdatekernel(CentOS、RedHat使用)和其他系统)4.3临时修复可以通过禁用CAP_NET_RAW暂时缓解漏洞,方法如下:setcapcap_net_raw-ep/bin/ping5Timeline2020/9/3OhCohen发布了关于漏洞的声明2020/9/23深信服千里木安全实验室发布漏洞分析文章6参考链接1.https://github.com/torvalds/linux/commit/8913336a7e8d56e984109a3137d6c0e3362596a42。https://www.openwall.com/lists/oss-security/2020/09/03/33。https://seclists.org/oss-sec/2020/q3/att-146/0001-net-packet-fix-overflow-in-tpacket_rcv.patch