Linux內核af_packet內存破壞漏洞(CVE-2020-14386)
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賦值為數據包頭部長度+16和maclen中較大的一個,在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