日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > linux >内容正文

linux

PWN2OWN 2017 Linux 内核提权漏洞分析

發(fā)布時(shí)間:2025/3/15 linux 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PWN2OWN 2017 Linux 内核提权漏洞分析 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

0.前言

在2017年P(guān)WN2OWN大賽中,長(zhǎng)亭安全研究實(shí)驗(yàn)室(Chaitin Security Research Lab)成功演示了Ubuntu 16.10 Desktop的本地提權(quán)。本次攻擊主要利用了linux內(nèi)核IPSEC框架(自linux2.6開始支持)中的一個(gè)內(nèi)存越界漏洞,CVE編號(hào)為CVE-2017-7184。

眾所周知,Linux的應(yīng)用范圍甚廣,我們經(jīng)常使用的Android、Redhat、CentOS、Ubuntu、Fedora等都使用了Linux操作系統(tǒng)。在PWN2OWN之后,Google、Redhat也針對(duì)相應(yīng)的產(chǎn)品發(fā)出了漏洞公告或補(bǔ)丁(見參考資料)。并表示了對(duì)長(zhǎng)亭安全研究實(shí)驗(yàn)室的致謝,在此也建議還沒(méi)有升級(jí)服務(wù)器內(nèi)核的小伙伴們及時(shí)更新內(nèi)核到最新版本:P

不同于通常的情況,為了增加比賽難度,本次PWN2OWN大賽使用的Linux版本開啟了諸多漏洞緩解措施,kASLR、SMEP、SMAP都默認(rèn)開啟,在這種情況下,漏洞變得極難利用,很多漏洞可能僅僅在這些緩解措施面前就會(huì)敗下陣來(lái)。

另外值得一提的是,本次利用的漏洞隱蔽性極高,在linux內(nèi)核中存在的時(shí)間也非常長(zhǎng)。因?yàn)橛|發(fā)這個(gè)漏洞不僅需要排布內(nèi)核數(shù)據(jù)結(jié)構(gòu),而且需要使內(nèi)核處理攻擊者精心構(gòu)造的數(shù)據(jù)包,使用傳統(tǒng)的fuzz方式幾乎是不可能發(fā)現(xiàn)此漏洞的。

最終,長(zhǎng)亭安全研究實(shí)驗(yàn)室成功利用這個(gè)漏洞在PWN2OWN的賽場(chǎng)上彈出了PWN2OWN歷史上的第一個(gè)xcalc, ZDI的工作人員們看到了之后也表示驚喜不已。

下面一起來(lái)看一下整個(gè)漏洞的發(fā)現(xiàn)和利用過(guò)程。

1.IPSEC協(xié)議簡(jiǎn)介

IPSEC是一個(gè)協(xié)議組合,它包含AH、ESP、IKE協(xié)議,提供對(duì)數(shù)據(jù)包的認(rèn)證和加密功能。

為了幫助更好的理解漏洞成因,下面有幾個(gè)概念需要簡(jiǎn)單介紹一下

(1) SA(Security Associstion)

SA由spi、ip、安全協(xié)議標(biāo)識(shí)(AH或ESP)這三個(gè)參數(shù)唯一確定。SA定義了ipsec雙方的ip地址、ipsec協(xié)議、加密算法、密鑰、模式、抗重放窗口等。

(2) AH(Authentication Header)

AH為ip包提供數(shù)據(jù)完整性校驗(yàn)和身份認(rèn)證功能,提供抗重放能力,驗(yàn)證算法由SA指定。

(3) ESP(Encapsulating security payload)

ESP為ip數(shù)據(jù)包提供完整性檢查、認(rèn)證和加密。

2.Linux內(nèi)核的IPSEC實(shí)現(xiàn)

在linux內(nèi)核中的IPSEC實(shí)現(xiàn)即是xfrm這個(gè)框架,關(guān)于xfrm的代碼主要在net/xfrm以及net/ipv4下。

以下是/net/xfrm下的代碼的大概功能

xfrm_state.c 狀態(tài)管理 xfrm_policy.c xfrm策略管理 xfrm_algo.c 算法管理 xfrm_hash.c 哈希計(jì)算函數(shù) xfrm_input.c 安全路徑(sec_path)處理, 用于處理進(jìn)入的ipsec xfrm_user.c netlink接口的SASP(安全策略)管理

其中xfrm_user.c中的代碼允許我們向內(nèi)核發(fā)送netlink消息來(lái)調(diào)用相關(guān)handler實(shí)現(xiàn)對(duì)SA和SP的配置,其中涉及處理函數(shù)如下。

xfrm_dispatch[XFRM_NR_MSGTYPES] = { [XFRM_MSG_NEWSA - XFRM_MSG_BASE] = { .doit = xfrm_add_sa }, [XFRM_MSG_DELSA - XFRM_MSG_BASE] = { .doit = xfrm_del_sa }, [XFRM_MSG_GETSA - XFRM_MSG_BASE] = { .doit = xfrm_get_sa,.dump = xfrm_dump_sa,.done = xfrm_dump_sa_done }, [XFRM_MSG_NEWPOLICY - XFRM_MSG_BASE] = { .doit = xfrm_add_policy }, [XFRM_MSG_DELPOLICY - XFRM_MSG_BASE] = { .doit = xfrm_get_policy }, [XFRM_MSG_GETPOLICY - XFRM_MSG_BASE] = { .doit = xfrm_get_policy,.dump = xfrm_dump_policy,.done = xfrm_dump_policy_done }, [XFRM_MSG_ALLOCSPI - XFRM_MSG_BASE] = { .doit = xfrm_alloc_userspi }, [XFRM_MSG_ACQUIRE - XFRM_MSG_BASE] = { .doit = xfrm_add_acquire }, [XFRM_MSG_EXPIRE - XFRM_MSG_BASE] = { .doit = xfrm_add_sa_expire }, [XFRM_MSG_UPDPOLICY - XFRM_MSG_BASE] = { .doit = xfrm_add_policy }, [XFRM_MSG_UPDSA - XFRM_MSG_BASE] = { .doit = xfrm_add_sa }, [XFRM_MSG_POLEXPIRE - XFRM_MSG_BASE] = { .doit = xfrm_add_pol_expire}, [XFRM_MSG_FLUSHSA - XFRM_MSG_BASE] = { .doit = xfrm_flush_sa }, [XFRM_MSG_FLUSHPOLICY - XFRM_MSG_BASE] = { .doit = xfrm_flush_policy }, [XFRM_MSG_NEWAE - XFRM_MSG_BASE] = { .doit = xfrm_new_ae }, [XFRM_MSG_GETAE - XFRM_MSG_BASE] = { .doit = xfrm_get_ae }, [XFRM_MSG_MIGRATE - XFRM_MSG_BASE] = { .doit = xfrm_do_migrate }, [XFRM_MSG_GETSADINFO - XFRM_MSG_BASE] = { .doit = xfrm_get_sadinfo }, [XFRM_MSG_NEWSPDINFO - XFRM_MSG_BASE] = { .doit = xfrm_set_spdinfo,.nla_pol = xfrma_spd_policy,.nla_max = XFRMA_SPD_MAX }, [XFRM_MSG_GETSPDINFO - XFRM_MSG_BASE] = { .doit = xfrm_get_spdinfo }, };

下面簡(jiǎn)單介紹一下其中幾個(gè)函數(shù)的功能:

xfrm_add_sa

創(chuàng)建一個(gè)新的SA,并可以指定相關(guān)attr,在內(nèi)核中,是用一個(gè)xfrm_state結(jié)構(gòu)來(lái)表示一個(gè)SA的。

xfrm_del_sa

刪除一個(gè)SA,也即刪除一個(gè)指定的xfrm_state。

xfrm_new_ae

根據(jù)傳入?yún)?shù),更新指定xfrm_state結(jié)構(gòu)中的內(nèi)容。

xfrm_get_ae

根據(jù)傳入?yún)?shù),查詢指定xfrm_state結(jié)構(gòu)中的內(nèi)容(包括attr)。

3.漏洞成因

當(dāng)我們發(fā)送一個(gè)XFRM_MSG_NEWSA類型的消息時(shí),即可調(diào)用xfrm_add_sa函數(shù)來(lái)創(chuàng)建一個(gè)新的SA,一個(gè)新的xfrm_state也會(huì)被創(chuàng)建。在內(nèi)核中,其實(shí)SA就是使用xfrm_state這個(gè)結(jié)構(gòu)來(lái)表示的。

若在netlink消息里面使用XFRMA_REPLAY_ESN_VAL這個(gè)attr,一個(gè)replay_state_esn結(jié)構(gòu)也會(huì)被創(chuàng)建。它的結(jié)構(gòu)如下所示,可以看到它包含了一個(gè)bitmap,這個(gè)bitmap的長(zhǎng)度是由bmp_len這個(gè)成員變量動(dòng)態(tài)標(biāo)識(shí)的。

struct xfrm_replay_state_esn {unsigned int bmp_len;__u32 oseq;__u32 seq;__u32 oseq_hi;__u32 seq_hi;__u32 replay_window;__u32 bmp[0]; };

內(nèi)核對(duì)這個(gè)結(jié)構(gòu)的檢查主要有以下幾種情況:

首先,xfrm_add_sa函數(shù)在調(diào)用verify_newsa_info檢查從用戶態(tài)傳入的數(shù)據(jù)時(shí),會(huì)調(diào)用verify_replay來(lái)檢查傳入的replay_state_esn結(jié)構(gòu)。

static inline int verify_replay(struct xfrm_usersa_info *p,struct nlattr **attrs) {struct nlattr *rt = attrs[XFRMA_REPLAY_ESN_VAL];struct xfrm_replay_state_esn *rs;if (p->flags & XFRM_STATE_ESN) {if (!rt)return -EINVAL;rs = nla_data(rt);if (rs->bmp_len > XFRMA_REPLAY_ESN_MAX / sizeof(rs->bmp[0]) / 8)return -EINVAL;if (nla_len(rt) < xfrm_replay_state_esn_len(rs) &&nla_len(rt) != sizeof(*rs))return -EINVAL;}if (!rt)return 0;/* As only ESP and AH support ESN feature. */if ((p->id.proto != IPPROTO_ESP) && (p->id.proto != IPPROTO_AH))return -EINVAL;if (p->replay_window != 0)return -EINVAL;return 0; }

這個(gè)函數(shù)要求replay_state_esn結(jié)構(gòu)的bmp_len不可以超過(guò)最大限制XFRMA_REPLAY_ESN_MAX。

另外,在這個(gè)創(chuàng)建xfrm_state的過(guò)程中,如果檢查到成員中有xfrm_replay_state_esn結(jié)構(gòu),如下函數(shù)中的檢查便會(huì)被執(zhí)行。

int xfrm_init_replay(struct xfrm_state *x) {struct xfrm_replay_state_esn *replay_esn = x->replay_esn;if (replay_esn) {if (replay_esn->replay_window >replay_esn->bmp_len * sizeof(__u32) * 8) <-----檢查replay_windowreturn -EINVAL;if (x->props.flags & XFRM_STATE_ESN) {if (replay_esn->replay_window == 0)return -EINVAL;x->repl = &xfrm_replay_esn;} elsex->repl = &xfrm_replay_bmp;} elsex->repl = &xfrm_replay_legacy;return 0; }

這個(gè)函數(shù)確保了replay_window不會(huì)比bitmap的長(zhǎng)度大,否則函數(shù)會(huì)直接退出。

下面再來(lái)看一下xfrm_new_ae這個(gè)函數(shù),它首先會(huì)解析用戶態(tài)傳入的幾個(gè)attr,然后根據(jù)spi的哈希值以及ip找到指定的xfrm_state,之后xfrm_replay_verify_len中會(huì)對(duì)傳入的replay_state_esn結(jié)構(gòu)做一個(gè)檢查,通過(guò)后即會(huì)調(diào)用xfrm_update_ae_params函數(shù)來(lái)更新對(duì)應(yīng)的xfrm_state結(jié)構(gòu)。下面我們來(lái)看一下xfrm_replay_verify_len這個(gè)函數(shù)。

static inline int xfrm_replay_verify_len(struct xfrm_replay_state_esn *replay_esn,struct nlattr *rp) {struct xfrm_replay_state_esn *up;int ulen;if (!replay_esn || !rp)return 0;up = nla_data(rp);ulen = xfrm_replay_state_esn_len(up);if (nla_len(rp) < ulen || xfrm_replay_state_esn_len(replay_esn) != ulen)return -EINVAL;return 0; }

我們可以看到這個(gè)函數(shù)沒(méi)有對(duì)replay_window做任何的檢查,只需要提供的bmp_len與xfrm_state中原來(lái)的bmp_len一致就可以通過(guò)檢查。所以此時(shí)我們可以控制replay_window超過(guò)bmp_len。之后內(nèi)核在處理相關(guān)IPSEC數(shù)據(jù)包進(jìn)行重放檢測(cè)相關(guān)的操作時(shí),對(duì)這個(gè)bitmap結(jié)構(gòu)的讀寫操作都可能會(huì)越界。

4.漏洞利用

(1).權(quán)限不滿足

/* All operations require privileges, even GET */if (!netlink_net_capable(skb, CAP_NET_ADMIN))return -EPERM;

xfrm_user_rcv_msg函數(shù)中,我們可以看到,對(duì)于相關(guān)的操作,其實(shí)都是需要CAP_NET_ADMIN權(quán)限的。那是不是我們就無(wú)法觸發(fā)這個(gè)漏洞了呢?

答案是否定的,在這里我們可以利用好linux的命名空間機(jī)制,在ubuntu,Fedora等發(fā)行版,User namespace是默認(rèn)開啟的。非特權(quán)用戶可以創(chuàng)建用戶命名空間、網(wǎng)絡(luò)命名空間。在命名空間內(nèi)部,我們就可以有相應(yīng)的capability來(lái)觸發(fā)漏洞了。

(2).越界寫

當(dāng)內(nèi)核在收到ipsec的數(shù)據(jù)包時(shí),最終會(huì)在xfrm_input解包并進(jìn)行相關(guān)的一些操作。在xfrm_input中,找到對(duì)應(yīng)的xfrm_state之后,根據(jù)數(shù)據(jù)包內(nèi)容進(jìn)行重放檢測(cè)的時(shí)候會(huì)執(zhí)行x->repl->advance(x, seq);,即xfrm_replay_advance_esn這個(gè)函數(shù)。
這個(gè)函數(shù)會(huì)對(duì)bitmap進(jìn)行如下操作

1.清除[last seq, current seq)的bit
2.設(shè)置bmp[current seq] = 1

我們可以指定好spi、seq等參數(shù)(內(nèi)核是根據(jù)spi的哈希值以及ip地址來(lái)確定SA的),并讓內(nèi)核來(lái)處理我們發(fā)出的ESP數(shù)據(jù)包,多次進(jìn)行這個(gè)操作即可達(dá)到對(duì)越界任意長(zhǎng)度進(jìn)行寫入任意值。

(3).越界讀

我們的思路是使用越界寫,改大下一個(gè)replay_state_esn的結(jié)構(gòu)中的bmp_len。之后我們就可以利用下一個(gè)bitmap結(jié)構(gòu)進(jìn)行越界讀。所以我們需要兩個(gè)相鄰的replay_state結(jié)構(gòu)。我們可以使用defragment技巧來(lái)達(dá)到這個(gè)效果。即首先分配足夠多的同樣大小的replay_state結(jié)構(gòu)把堆上原來(lái)的坑填滿,之后便可大概率保證連續(xù)分配的replay_state結(jié)構(gòu)是相鄰的。

如上所述,使用越界寫的能力將下一個(gè)bitmap長(zhǎng)度改大,即可使用這個(gè)bitmap結(jié)構(gòu)做越界讀了。

圖中所示為被改掉bmp_len的bitmap結(jié)構(gòu)。

(4).繞過(guò)kASLR

我們通過(guò)xfrm_del_sa接口把沒(méi)用的xfrm_state都給刪掉。這樣就可以在堆上留下很多的坑。之后我們可以向內(nèi)核噴射很多struct file結(jié)構(gòu)體填在這些坑里。

如下,利用上面已經(jīng)構(gòu)造出的越界讀能力,我們可以泄露一些內(nèi)核里的指針來(lái)算出內(nèi)核的加載地址和bitmap的位置。


5.內(nèi)核任意地址讀寫及代碼執(zhí)行

因?yàn)橐呀?jīng)繞過(guò)了內(nèi)核地址隨機(jī)化,這時(shí)我們可以進(jìn)行內(nèi)核ROP構(gòu)造了。

1.在這個(gè)漏洞的利用當(dāng)中,我們可以在bitmap中偽造一個(gè)file_operations結(jié)構(gòu)。

2.之后通過(guò)越界寫可以改寫掉我們剛剛在內(nèi)核中噴射的struct file結(jié)構(gòu)體的file_operations指針,使其指向合適的ROPgadget。

3.調(diào)用llseek函數(shù)(實(shí)際上已經(jīng)是rop gadget)來(lái)執(zhí)行我們事先已經(jīng)準(zhǔn)備好的ROP鏈。

4.通過(guò)多次改寫file_operations結(jié)構(gòu)中的llseek函數(shù)指針來(lái)實(shí)現(xiàn)多次執(zhí)行ROPgadget實(shí)現(xiàn)提權(quán)。


如上所述,因?yàn)槲覀兊臄?shù)據(jù)都是偽造在內(nèi)核里面,所以這種利用方式其實(shí)是可以同時(shí)繞過(guò)SMEP和SMAP的。

6.權(quán)限提升

下面是長(zhǎng)亭安全研究實(shí)驗(yàn)室在pwn2own2017上彈出xcalc的瞬間。

5.后記

非常感謝slipper老師的指導(dǎo)和講解 :P

感謝長(zhǎng)亭安全研究實(shí)驗(yàn)室的所有小伙伴:P

6.參考資料

  • IPSEC協(xié)議:?IPsec - Wikipedia

  • linux命名空間機(jī)制:?Namespaces in operation, part 1: namespaces overview

  • CVE-2017-7184:?CVE-2017-7184: kernel: Local privilege escalation in XFRM framework

  • @thezdi:?twitter.com/thezdi/stat

  • Android漏洞公告:source.android.com/secu

  • Redhat:Red Hat Customer Portal


原文: https://zhuanlan.zhihu.com/p/26674557

總結(jié)

以上是生活随笔為你收集整理的PWN2OWN 2017 Linux 内核提权漏洞分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 污视频在线播放 | 精品色 | 亚洲黄色a | 色婷婷av一区二区三区大白胸 | 成人app在线 | 精品人妻大屁股白浆无码 | 国产一区二区三区四区五区 | 亚洲综合视频网 | 欧美情侣性视频 | 天天干夜夜做 | 免费成人美女在线观看 | 五月天色小说 | 久久wwww| 综合九九| 超碰人人人人 | 欧美激情一区二区视频 | 亚洲美女久久 | 久久亚洲成人av | 青青国产在线观看 | 久久精品8 | 国产黄页 | 日韩一区二区视频 | 黄色日批 | 中文字字幕一区二区三区四区五区 | 天天做天天摸天天爽天天爱 | 一区在线免费观看 | 国产av电影一区二区三区 | 熟女自拍一区 | 狠狠精品干练久久久无码中文字幕 | 精品国偷自产在线 | 国产精品久久久久一区二区三区 | 午夜影院视频 | 午夜在线小视频 | 欧美性色视频 | 波多野结衣一区二 | 成人黄色免费看 | 高潮爽爆喷水h | 欧美精品亚洲精品日韩精品 | 葵司ssni-879在线播放 | 三级av免费看| 丰满人妻熟妇乱偷人无码 | 日韩av一区二区三区四区 | 91网址入口| 欧美gv在线观看 | 全程粗话对白视频videos | 欧美色欧美 | 日本高清不卡码 | 艳母在线视频 | 久久久久久一区二区 | 国产三级久久 | 日本福利在线 | 性高潮网站 | 久久福利视频导航 | 亚洲你懂得 | 欧美精品网 | 我们好看的2018视频在线观看 | 2023国产精品 | 日韩人妻精品无码一区二区三区 | a视频免费 | 国产91页 | 亚洲一区二区在线视频 | 中国老妇性视频 | 国产九九九九 | 色丁香久久| 欧美不卡网 | 天天做夜夜爽 | v在线| 打屁股无遮挡网站 | 国产成人免费av | 天天摸天天爽 | 成年人免费看 | 国内精品少妇 | 国产精品99久久久久久大便 | 好看的中文字幕av | 久久综合久久网 | 亚洲草草网 | 亚洲国产欧美精品 | 老司机午夜福利视频 | 国产在线天堂 | 日本japanese乳偷乱熟 | 国产黄色网 | 国产乱xxⅹxx国语对白 | 日韩三级一区二区三区 | 国内91视频 | 91喷水视频 | 男人天堂影院 | 一级黄色网 | 亚洲视频精品在线观看 | 青青视频免费观看 | 麻豆app在线观看 | 女性女同性aⅴ免费观女性恋 | 精品国产一二三区 | 午夜福利视频合集1000 | 欧美女人天堂 | 久久久久久久国产精品美女 | 五月婷婷俺也去 | 人妻av无码一区二区三区 | 欧美午夜久久 | 亚洲精品国产av |