中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何進行Linux內核本地提權漏洞預警分析

發布時間:2021-12-24 21:28:11 來源:億速云 閱讀:190 作者:柒染 欄目:安全技術

今天就跟大家聊聊有關如何進行Linux內核本地提權漏洞預警分析,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

一、漏洞背景

近日,Linux git中發布一個commit補丁,該補丁對應的漏洞是一個本地提權漏洞CVE-2019-8912,漏洞影響范圍較廣。根據git中的commit信息可知,該漏洞出現在內核'crypto/af_alg.c'中的af_alg_release函數中,可以通過sockfs_setattr函數觸發,漏洞類型是use after free,可以導致本地代碼執行進行權限提升。

二、漏洞影響版本

Linux 2 .6 ~ linux 4.20.11Red Hat Enterprise Linux 7,Package: kernel-altDebian,Release:Jessie,Version:3.16.56-1+deb8u1Debian,Release:Jessie (security),Version:3.16.56-1Debian,Release:stretch,Version:4.9.144-3Debian,Release:stretch (security),Version:4.9.110-3+deb9u6Debian,Release:buster,Version:4.19.16-1Debian,Release:sid,Version:4.19.20-1

三、Linux Crypto模塊簡介

Linux內核從版本2.5開始引入了加密機制,為內核提供加密功能,應用包括:硬件加密設備驅動、內核代碼簽名、硬件隨機數生成器、文件系統加密等。從版本2.6.6之后,內核源碼提供了豐富的密碼學算法支持,并可以通過配置編譯選項將加密算法作為模塊編入內核。內核編譯配置如下圖所示:

如何進行Linux內核本地提權漏洞預警分析

但是該加密功能提供的API接口只能在內核層進行使用,用戶層無法調用。2010年,有位維護者向Linux Crypto維護組提交了一份CrypatoAPI 用戶接口,類似于netlink,基于socket進行通信,便于用戶層訪問內核加密子系統。功能實現代碼在文件crypto/af_alg.c中。

四、漏洞原理及溯源

漏洞存在于crypto 模塊中的af_alg_release()函數中。af_alg_release()函數在進行對象釋放時,未將對象置空。對應commit:9060cb719e61b685ec0102574e10337fa5f445ea補丁代碼如下,補丁添加了一行代碼:sock->sk = NULL; 。

如何進行Linux內核本地提權漏洞預警分析

在未添加補丁之前,如果該sock->sk引用計數是1,當調用sock_put()進行釋放后沒有置空,就直接返回,會產生一個sock->sk懸掛指針。

為了分析這個漏洞的前因后果,先分析下相關的socket代碼。對每個新創建的socket,Linux內核都將在sockfs中創建一個新的inode。Sockfs_*系列函數就是用來操作sockfs文件系統的。Sockfs_setattr()函數就是設置socket文件屬性的。在net/socket.c文件中sockfs_setattr()函數將會使用sock->sk對象。

根據提交的commit:9060cb719e61b685ec0102574e10337fa5f445ea細節可知,在該漏洞披露之前,Linux已經修復了sock_close()和sockfs_setattr()之間的條件競爭漏洞,對應commit為6d8c50dcb029872b298eea68cc6209c866fd3e14,具體先看下sockfs_setattr()函數中的補丁。補丁代碼如下:

如何進行Linux內核本地提權漏洞預警分析

行544,首先判斷sock->sk是否為空,如果不為空,行545再將用戶層傳進來的iattr->ia_uid賦值為sock->sk->sk_uid。然后看sock_close ()函數中的補丁。補丁代碼如下:

如何進行Linux內核本地提權漏洞預警分析

行1186,替換成了新函數__sock_release(),該函數多了一個參數inode。__sock_release()函數實現如下:

如何進行Linux內核本地提權漏洞預警分析

行601,對inode進行判斷,如果不為空,然后調用inode_lock()函數對其進行上鎖。其實該inode本身和要進行釋放的socket對象是對應的。行603,調用ops中release()函數進行釋放操作。這個ops中release()函數只是一個函數指針,最終會根據用戶注冊哪種套接字類型決定。行604,再次判斷inode是否為空,如果不為空,再進行解鎖。通過對inode加鎖,防止在對socket對象釋放時進行其他操作。

從commit:6d8c50dcb029872b298eea68cc6209c866fd3e14提供的細節可知,sock_close()函數和sockfs_setattr()函數之間的條件競爭可以通過用戶層fchownat()函數引發。根據man手冊可知,該函數是用于設置文件屬性的,例如uid和gid,在內核中對應的sockfs_setattr()函數,如下圖所示:

如何進行Linux內核本地提權漏洞預警分析

細節中描述,該函數不會保持文件fd的引用計數,這也是導致存在條件競爭的原因。根據前文可知,sockfs_setattr()函數其實就是設置UID才操作sock->sk對象的。

如果再繼續向前追溯的話,從commit:86741ec25462e4c8cdce6df2f41ead05568c7d5e提供的細節可知UID的來龍去脈。該補丁提交于2016年。由于socket 協議中的結構體structsock在大多時候都是和用戶層的sockets一一映射的,sockets對應的內核結構體為structsocket。考慮到方便操作,便通過向struct sock添加一個sk_uid字段來簡化對struct socket中的UID的匹配,也因此添加了一個關鍵函數。如下圖所示:

如何進行Linux內核本地提權漏洞預警分析

由此可知,本來存在于sock_close()和sockfs_setattr之間的條件競爭已經被修復,由于crypto/af_alg.c中af_alg_release()函數沒有將釋放后的sock->sk及時置空,導致前面所做的安全補丁全部失效。

五、安全建議

目前該漏洞補丁已經給出,請及時升級到最新版本。

https://github.com/torvalds/linux/commit/9060cb719e61b685ec0102574e10337fa5f445ea

看完上述內容,你們對如何進行Linux內核本地提權漏洞預警分析有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

鄯善县| 通河县| 梁山县| 乾安县| 隆昌县| 昂仁县| 类乌齐县| 阜新市| 洪泽县| 岱山县| 丹阳市| 萨嘎县| 通山县| 固镇县| 巴里| 遵义县| 灌南县| 乌鲁木齐县| 双江| 兰溪市| 若羌县| 观塘区| 德保县| 资溪县| 卓尼县| 绥化市| 左贡县| 宣武区| 德州市| 台前县| 惠州市| 唐山市| 右玉县| 仙居县| 城市| 健康| 阿城市| 崇礼县| 昔阳县| 汉阴县| 仪陇县|