Linux內(nèi)核af_packet內(nèi)存破壞漏洞(CVE-2020-14386)
1 Linux Kernel介紹
Linux Kernel是由 Linus Torvalds最初開發(fā)的開源的操作系統(tǒng)內(nèi)核。實(shí)現(xiàn)了包括CPU、進(jìn)程、內(nèi)存、文件系統(tǒng)等核心模塊,被廣泛移植到Alpha、arc、arm、ia64、mips、powerpc、sparc、x86-64等許多體系結(jié)構(gòu)上。目前多用于各種服務(wù)器和物聯(lián)網(wǎng)終端等,也可在桌面終端使用Linux。
2 漏洞分析
該漏洞觸發(fā)時(shí)需要本地低權(quán)限用戶執(zhí)行其具有執(zhí)行權(quán)限的可執(zhí)行文件,同時(shí)系統(tǒng)啟用CAP_NET_RAW功能。CAP_NET_RAW是一種允許使用原始套接字的設(shè)置。
漏洞位于net/packet/af_packet.c文件,該文件參與Linux的TCP/IP協(xié)議套件實(shí)現(xiàn)中的原始數(shù)據(jù)包套接字。
unsigned short類型變量macoff(對(duì)應(yīng)數(shù)據(jù)鏈路層的偏移)和netoff(對(duì)應(yīng)網(wǎng)絡(luò)層的偏移)在收到回環(huán)網(wǎng)卡的原始套接字?jǐn)?shù)據(jù)包時(shí),按照以上方式賦值。其中類型為數(shù)據(jù)報(bào)套接字(用于UDP)時(shí)兩者的值都為數(shù)據(jù)包頭部長(zhǎng)度+16,否則將netoff賦值為數(shù)據(jù)包頭部長(zhǎng)度+16和maclen中較大的一個(gè),在po->has_vnet_hdr存在(即存在虛擬網(wǎng)絡(luò),如NAT等)時(shí)加上其大小,再將macoff賦值為netoff減去mac頭部的值(即減去數(shù)據(jù)鏈路層頭部)。這里計(jì)算netlen時(shí),可能出現(xiàn)傳入的長(zhǎng)度異常而導(dǎo)致上溢,此后計(jì)算macoff時(shí),將會(huì)計(jì)算出不正常的結(jié)果。
當(dāng)執(zhí)行virtio_net_hdr_from_skb函數(shù)時(shí),該函數(shù)根據(jù)參數(shù)中的數(shù)值申請(qǐng)緩沖區(qū),這里用到了macoff這一數(shù)值。從而分配異常長(zhǎng)度的緩沖區(qū),可能造成越界寫從而出現(xiàn)容器逃逸,權(quán)限提升等。
分析補(bǔ)丁可以發(fā)現(xiàn),補(bǔ)丁將netoff變量的類型改為了unsigned int,并且判斷了該值是否大于unsigned_short的最大值,如過大則丟棄內(nèi)存中的數(shù)據(jù)包,從而不會(huì)導(dǎo)致內(nèi)存破壞。
3 影響范圍
Linux kernel 4.6-5.9rc4
4 解決方案
4.1 檢測(cè)方案
輸入以下命令查看本機(jī)的內(nèi)核版本
cat /proc/version
如顯示的Linux version大于4.6且小于5.9,則漏洞可能存在。
4.2 修復(fù)方案
升級(jí)內(nèi)核版本,安全版本的鏈接如下:
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=acf69c946233259ab4d64f8869d4037a198c7f06
或使用命令升級(jí):
sudo apt-get install linux-generic-lts-xenial linux-image-generic-lts-xenial (ubuntu,debian等系統(tǒng)使用)
yum -y update kernel (CentOS,RedHat等系統(tǒng)使用)
4.3 臨時(shí)修復(fù)方案
通過禁用CAP_NET_RAW可以臨時(shí)緩解該漏洞,方法如下:
setcap cap_net_raw-ep /bin/ping
5 時(shí)間軸
2020/9/3 Oh Cohen發(fā)布關(guān)于該漏洞的說明
2020/9/23 深信服千里目安全實(shí)驗(yàn)室發(fā)布漏洞分析文章
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