91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

怎么進行Linux內核XFRM權限提升漏洞的分析

發布時間:2021-12-21 20:49:35 來源:億速云 閱讀:305 作者:柒染 欄目:大數據

怎么進行Linux內核XFRM權限提升漏洞的分析,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。


0x00 背景介紹


2017年11月24日, OSS社區披露了一個由獨立安全研究員Mohamed Ghannam發現的一處存在于Linux 內核Netlink socket子系統(XFRM)的漏洞,漏洞編號CVE-2017-16939。

360CERT經過實際驗證,確認該漏洞確實存在,但poc作者認為存在UAF漏洞,存在提權的可能性,而我們認為并沒有UAF,只是使用未初始化鏈表造成的crash(空指針引用),并且使用的內存已經被初始化了,實際上無法提前布局,不能進一步利用達到提權的目的。


0x01漏洞概述


Netlink 是一種特殊的 socket,它是一種在內核與用戶間進行雙向數據傳輸的一種方式,用戶態應用使用標準的 socket API 就可以使用 Netlink 提供的強大功能,內核態需要使用專門的內核 API 來使用 Netlink。

XFRM是 Linux 2.6 內核為安全處理引入的一個可擴展功能框架,用來在數據包經過路由路徑的過程中對其進行修改。

漏洞原因是:在調用xfrm_dump_policy_done函數之前,如果不事先調用xfrm_dump_policy,會導致鏈表沒有被初始化,造成空指針引用,產生崩潰。官方修正的補丁添加了xfrm_dump_policy_start函數,確保調用done之前會進行初始化。

0x02漏洞攻擊面影響


1.  影響版本


影響Linux Kernel 2.6.28~4.14之間的版本

影響版本鏈接:

http://www.securityfocus.com/bid/101954

2.   修復版本

漏洞已被作為1137b5e(“ipsec:修復異常xfrm策略轉儲崩潰”補丁)的一部分解決,在4.14-rc7版本中被修復。


0x03漏洞詳情


1.  技術細節

在函數 static int netlink_dump(struct sock*sk) 中:

(/net/netlink/af_netlink.c)

怎么進行Linux內核XFRM權限提升漏洞的分析在上面的代碼中,我們可以看到當sk->sk_rcvbuf小于等于sk_rmem_alloc(注意我們可以通過stockpot控制sk->sk_rcvbuf)時,netlink_dump()檢查失敗,它跳轉到函數的結尾并退出,但是cb_running的值不會更改為false。

所以當atomic_read(&sk->sk_rmem_alloc) >= sk->sk_rcvbuf 時,不應調用 cb->done(cb),且nlk->cb_running 應設為 false。否則在 static voidnetlink_sock_destruct(struct sock *sk) 函數中: 

怎么進行Linux內核XFRM權限提升漏洞的分析

該函數會在close(socketfd)時觸發。該函數檢測到 nlk->cb_running 不為 false,就會調用 done() 函數,即 xfrm_dump_policy_done(),導致 crash。

怎么進行Linux內核XFRM權限提升漏洞的分析

2.  poc的驗證分析

原作者 poc 中的執行流程如下:

(1)do_setsockopt() :改小 sk->sk_rcvbuf 值

(2)send_msg(fd,&p->msg):

第一次發送時,atomic_read(&sk->sk_rmem_alloc) = 0 < sk->sk_rcvbuf,發送之后,sk->sk_rmem_alloc 累加,結果在第一次發送后:

atomic_read(&sk->sk_rmem_alloc) >= sk->sk_rcvbuf

(3)send_msg(fd,&p->msg):

第二次發送之后,此時atomic_read(&sk->sk_rmem_alloc)>= sk->sk_rcvbuf,未調用 done(),但 nlk->cb_running 值保持為 true。

(4)close(fd):調用cb->done(cb),產生崩潰。

按上述原理,其實即使不調用 “do_setsockopt();”改小 sk->sk_rcvbuf 值,只要多次 send,那么當 sk->sk_rmem_alloc 累加到超過 sk->sk_rcvbuf值,再次 send 后,“close(fd)”或進程退出時,就會導致 crash。

原 poc 改為如下也可觸發(不調用do_setsockopt()):

怎么進行Linux內核XFRM權限提升漏洞的分析

3.  漏洞分析總結

crash 原因分析:

原本程序理想流程是 xfrm_dump_policy() ->xfrm_dump_policy_done(),

xfrm_dump_policy() 時會檢查 callback 中的一個雙向鏈表是否有初始化,若沒有,則初始化之(空鏈)。

怎么進行Linux內核XFRM權限提升漏洞的分析

而 xfrm_dump_policy_done()時默認上述鏈表已初始化,不再檢查,直接讀寫。如前文所述,多次 send 就可以造成:

atomic_read(&sk->sk_rmem_alloc)>= sk->sk_rcvbuf

導致 netlink_dump() 中跳過 xfrm_dump_policy() ,即沒有初始化鏈表,所以 close(fd) 時,xfrm_dump_policy_done() 就會操作未初始化內存,導致 crash。

那么若能提前布局這塊內存,則可實現任意地址寫值(通過雙向鏈表del操作)。但是,無論是否觸發初始化鏈表的操作,在之前這塊內存都會被memset(0):

怎么進行Linux內核XFRM權限提升漏洞的分析

在__netlink_dump_start函數里 memset(0) 后,才調用netlink_dump。接下來 netlink_dump中做sk_rmem_alloc >= sk_rcvbuf 的檢測,失敗后就不去xfrm_dump_policy 了。到后面 xfrm_dump_policy_done 用到的就是之前 memset(0) 的內存。這樣就是缺少了 xfrm_dump_policy 過程中的初始化鏈表操作(INIT_LIST_HEAD),最終造成空指針引用。

怎么進行Linux內核XFRM權限提升漏洞的分析

所以這只是使用未初始化鏈表造成的crash(空指針引用),并且使用的內存已經被初始化了,實際上無法提前布局,不能進一步利用達到提權的目的。

0x04 修復建議


建議所有受影響用戶,及時進行安全更新,可選方式如下:

1、相關Linux發行版已經提供了安全更新,請通過 yum 或 apt-get 的形式進行安全更新。

2、自定義內核的用戶,請自行下載對應源碼補丁進行安全更新。

補丁鏈接:

https://github.com/torvalds/linux/commit/1137b5e2529a8f5ca8ee709288ecba3e68044df2

看完上述內容,你們掌握怎么進行Linux內核XFRM權限提升漏洞的分析的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

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

AI

德保县| 临漳县| 孙吴县| 耒阳市| 绥阳县| 南召县| 扎鲁特旗| 长汀县| 万年县| 齐齐哈尔市| 特克斯县| 遂溪县| 凌源市| 工布江达县| 江陵县| 肃宁县| 昆山市| 荣昌县| 出国| 肥东县| 固始县| 澄迈县| 安西县| 黄骅市| 科技| 鹿泉市| 绥滨县| 扎赉特旗| 浙江省| 林甸县| 阳城县| 西宁市| 英德市| 灌云县| 伊宁市| 平原县| 通州区| 衡阳市| 金坛市| 蒙山县| 峡江县|