Linux git中發布一個commit補丁,該補丁對應的漏洞是一個本地提權漏洞CVE-2019-8912,漏洞影響范圍較廣。根據git中的commit信息可知,該漏洞可以導致本地代碼執行進行權限提升。
漏洞范圍:
Linux 2 .6 ~ linux 4.20.11
Red Hat Enterprise Linux 7,Package: kernel-alt
Debian,Release:Jessie,Version:3.16.56-1+deb8u1
Debian,Release:Jessie,(security),Version:3.16.56-1
Debian,Release:stretch,Version:4.9.144-3
Debian,Release:stretch (security),Version:4.9.110-3+deb9u6
Debian,Release:buster,Version:4.19.16-1
Debian,Release:sid,Version:4.19.20-1
漏洞簡介:
漏洞存在于crypto 模塊中的af_alg_release()函數中。
在未添加補丁之前,如果該sock->sk引用計數是1,當調用sock_put()進行釋放后沒有置空,就直接返回,會產生一個sock->sk懸掛指針。
行544,首先判斷sock->sk是否為空,如果不為空,行545再將用戶層傳進來的iattr->ia_uid賦值為sock->sk->sk_uid。然后看sock_close()函數中的補丁。補丁代碼如下:
行1186,替換成了新函數__sock_release(),該函數多了一個參數inode。__sock_release()函數實現如下:
行601,對inode進行判斷,如果不為空,然后調用inode_lock()函數對其進行上鎖。其實該inode本身和要進行釋放的socket對象是對應的。行603,調用ops中release()函數進行釋放操作。這個ops中release()函數只是一個函數指針,最終會根據用戶注冊哪種套接字類型決定。行604,再次判斷inode是否為空,如果不為空,再進行解鎖。通過對inode加鎖,根據man手冊可知,該函數是用于設置文件屬性的,例如uid和gid,在內核中對應的sockfs_setattr()函數,如下圖所示:
該函數不會保持文件fd的引用計數,這也是導致存在條件競爭的原因。根據前文可知,sockfs_setattr()函數其實就是設置UID才操作sock->sk對象的。
而本來存在于sock_close()和sockfs_setattr之間的條件競爭已經被修復,由于crypto/af_alg.c中af_alg_release()函數沒有將釋放后的sock->sk及時置空,導致前面所做的安全補丁全部失效。
安全建議:
目前該漏洞補丁已經給出,請及時升級到最新版本。
另附上Git鏈接:https://github.com/torvalds/linux/commit/9060cb719e61b685ec0102574e10337fa5f445ea
本文首發于西安瑞天網(http://www.invitre.com),轉載請注明原文地址:http://www.invitre.com/news/99.html