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